GitLab CI如何在作业间共享文件?缓存配置异常求助
解决GitLab CI作业间共享cache.json缓存的问题
我来帮你梳理下这个问题,你遇到的情况其实是对GitLab CI缓存机制的几个关键点理解有偏差,咱们一步步拆解解决:
问题根源分析
你遇到的cat: cache.json: No such file or directory报错,核心原因有两个:
- 缓存的生成前提:GitLab CI不会凭空创建缓存文件,第一次运行作业时,如果
cache.json不存在,缓存里自然没有这个文件;而你移除touch命令后,作业因为cat cache.json失败直接终止,根本没机会生成并保存缓存。 - 缓存的保存时机:GitLab CI只会在作业成功完成后,才会把
paths里指定的文件更新到缓存中。如果作业中途报错终止,缓存不会被更新,后续作业自然拿不到之前的缓存内容。
具体解决方案
方案1:确保首次运行生成缓存文件,保证作业成功完成
修改你的.gitlab-ci.yml,在执行cat命令前先确保cache.json存在,这样第一次运行不会报错,作业成功后缓存会被正确保存:
image: ubuntu stages: - test cache: key: one-cache paths: - cache.json job1: stage: test script: # 首次运行创建空文件,后续运行保留缓存中的内容 - test -f cache.json || touch cache.json - cat cache.json - python3 modify_json_file.py - cat cache.json
这里test -f cache.json || touch cache.json的逻辑是:如果文件不存在就创建它,确保后续命令能正常执行,作业成功完成后GitLab会把cache.json存入缓存,下次作业就能直接读取到了。
方案2:用Artifacts替代缓存(更可靠的持久化方式)
如果cache.json是需要长期保留的重要数据,不建议依赖GitLab缓存(缓存是为了加速构建,可能会被自动清理),更推荐使用Artifacts,它会和构建记录绑定,可靠性更高:
image: ubuntu stages: - test job1: stage: test script: - test -f cache.json || touch cache.json - cat cache.json - python3 modify_json_file.py - cat cache.json artifacts: paths: - cache.json expire_in: 1 week # 可根据需求设置有效期,不设置则默认保留30天
如果后续作业需要使用这个文件,可以通过needs依赖上一次的Artifacts:
job2: stage: test needs: [job1] script: - cat cache.json - python3 modify_json_file.py
额外注意事项
- 缓存的
key配置:你用了固定的one-cache,意味着所有分支、所有作业都会共享这个缓存;如果是多分支场景,建议把key设置为key: "$CI_COMMIT_BRANCH",避免分支间缓存冲突。 - Runner配置:如果是自托管Runner,需要确认Runner的配置文件中开启了缓存功能(比如设置了
cache_dir),GitLab托管的Runner则无需额外配置。
内容的提问来源于stack exchange,提问作者test42
相关产品推荐
相关产品推荐

