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 # 可选,设置归档文件过期时间
补充说明
build-artifact作业直接从项目内的缓存路径复制文件到项目目录内的artifact_output,确保artifacts能正常访问并上传。|| true用来避免因缓存路径无文件导致复制命令报错,保证作业正常执行。- 若只是想归档APK和测试文本,甚至可以不需要单独的
build-artifact阶段,直接在build-job和build-test中分别配置artifacts,或者合并到一个作业完成。
内容的提问来源于stack exchange,提问作者IamVariable
相关产品推荐
相关产品推荐

