如何正确使用GitLab的cache功能实现跨流水线文件传递
GitLab CI跨流水线缓存复用解决方案
GitLab CI的缓存默认采用流水线启动时拉取、Job运行结束后回传的逻辑,且默认会给缓存key自动添加当前分支名作为前缀,跨独立触发的流水线、跨分支的Job默认无法共享最新缓存,这是你遇到job2只能拿到旧文件的根本原因。
具体修改方案
1. 调整流水线配置
修改后的完整.gitlab-ci.yml如下:
job1: stage: stage1 rules: - if: $RUN != "run2" when: always - when: never script: - mkdir -p data # 避免首次运行时data目录不存在导致写入失败 - echo "Job stage1 updating file dates.txt" - date >> data/dates.txt - cat data/dates.txt # 调试用,确认写入内容符合预期 cache: key: prefix: "" # 关闭默认分支前缀,实现跨分支、跨流水线共享同一缓存 name: statusfiles paths: - data/dates.txt when: always # 确保Job运行结束后无论成功失败都上传缓存,调试阶段可保留,正式环境可按需删除 job2: stage: stage2 rules: - if: $RUN == "run2" when: always script: - echo "Running stage 2" - cat data/dates.txt cache: key: prefix: "" name: statusfiles paths: - data/dates.txt policy: pull # Job2仅拉取缓存,不需要回传避免覆盖
2. 检查项目CI缓存配置
- 进入项目的「设置」→「CI/CD」→「通用管道」页面,确认缓存保留时间没有设置过短,默认保留14天可满足大部分场景需求。
- 如果你使用私有Runner,确保Runner配置文件中缓存功能正常开启,没有禁用缓存写入权限。
3. 验证流程
- 第一次触发流水线,不携带
RUN=run2变量,确认Job1运行成功,查看Job1日志中存在「缓存上传成功」的记录,确认data/dates.txt已被打包到缓存中。 - 第二次触发流水线,携带
RUN=run2变量仅运行Job2,查看Job2日志中拉取的缓存版本和Job1上传的版本一致,即可验证dates.txt内容为最新的追加后内容。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

