You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI中如何归档已添加为缓存的自定义文件?

问题分析与解决方法

核心问题

GitLab CI的作业只能访问项目工作目录内的文件,你在build-artifact阶段指定的../../../../../cache/GitUser/cicdtest/main-protected/*.zip属于项目目录外的路径,Runner没有权限访问,所以报错。另外你混淆了cache和artifacts的用途:

  • cache是用来在同流水线或不同流水线的作业间复用文件(比如避免重复构建APK),由GitLab Runner管理,存储在外部目录,不需要手动归档。
  • artifacts是用来把作业生成的文件上传到GitLab供后续下载,只能指定项目工作目录内的路径。

正确解决方案

直接把需要归档的文件(APK和测试文本)从缓存对应的项目内路径复制到项目目录下的指定文件夹,再用artifacts归档,不需要访问外部的缓存zip文件。

修改后的.gitlab-ci.yml配置如下:

stages:
  - build
  - output
  - artifact 
  
cache:
  key: "$CI_COMMIT_REF_SLUG"
  paths:
    - app/build/outputs/apk/debug/*.apk
    - tmpDir/*.txt


build-job:
  stage: build
  script:
    - echo "$CI_COMMIT_REF_SLUG"
    - echo "Build in progress"
    - time
    - echo 'sdk.dir=/Users/Library/Android/sdk' > local.properties
    - cat local.properties
    - ./gradlew assembleDebug
    - echo "Build Done"
    - mkdir -p outputDir/ 
  artifacts:
    paths:
      - "app/build/outputs/apk/debug/*.apk"

build-test:
  stage: output
  script:
    - rm -rf tmpDir
    - mkdir tmpDir
    - pushd tmpDir
    - pwd
    - echo This is some text > myfile.txt
    - cat myfile.txt  
    - popd   
 
build-artifact:
  stage: artifact
  script:
    - echo "Preparing files for artifact" 
    - pwd
    # 创建归档目录
    - mkdir -p artifact_output
    # 复制缓存的APK到归档目录,无文件时不报错
    - cp -r app/build/outputs/apk/debug/*.apk artifact_output/ || true
    # 复制缓存的测试文本到归档目录,无文件时不报错
    - cp -r tmpDir/*.txt artifact_output/ || true
  artifacts:
    paths:
      - artifact_output/
    expire_in: 1 week # 可选,设置归档文件过期时间

补充说明

  1. build-artifact作业直接从项目内的缓存路径复制文件到项目目录内的artifact_output,确保artifacts能正常访问并上传。
  2. || true用来避免因缓存路径无文件导致复制命令报错,保证作业正常执行。
  3. 若只是想归档APK和测试文本,甚至可以不需要单独的build-artifact阶段,直接在build-job和build-test中分别配置artifacts,或者合并到一个作业完成。

内容的提问来源于stack exchange,提问作者IamVariable

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:50:13