GitLab CI并行作业缓存异常:仅单个作业缓存生效求助
解决GitLab CI并行作业缓存共享问题
问题原因
你遇到的问题核心是GitLab CI缓存的读写逻辑不适合并行作业间的产物共享:
- 多个并行作业使用同一缓存key时,每个作业会先提取缓存,执行完毕后再推送自身文件到缓存。由于并行执行,后完成的作业会覆盖先完成的作业的缓存内容,最终只有最后一个完成的并行作业的文件被保留。
- 同时读写同一缓存会触发竞争条件,导致部分作业无法成功提取前置阶段的缓存文件(比如job1生成的文件)。
正确解决方案:改用Artifacts传递产物
GitLab CI的artifacts是专门为流水线阶段/作业间传递构建产物设计的,并行作业的artifacts会被自动合并,后续阶段可以获取所有并行作业生成的文件,完全适配你的场景。
修改后的完整流水线配置如下:
stages: - stage1 - stage2 - stage3 - .post job1: stage: stage1 before_script: - mkdir release script: - echo 'job1' > release/job1 artifacts: paths: - release/**/* expire_in: 1 week # 可选,设置产物过期时间,避免占用存储 job2: stage: stage2 parallel: matrix: - ITEM: - item1 - item2 - item3 script: - echo "job2-$ITEM" > release/job2-$ITEM artifacts: paths: - release/**/* expire_in: 1 week job3: stage: stage3 script: - echo 'job3' > release/job3 artifacts: paths: - release/**/* expire_in: 1 week post: stage: .post script: - ls release/
关键说明
- 移除全局缓存配置:不再依赖缓存传递产物,改用
artifacts。 - 每个产物生成作业配置artifacts:所有生成
release目录文件的作业(job1、job2、job3)都定义artifacts.paths为release/**/*,确保产物被上传到GitLab服务器。 - 自动合并并行产物:GitLab会自动将stage2中三个并行job的artifacts合并,后续的stage3和.post作业会下载所有前置作业的产物,你在post作业的
ls release/中会看到job1、job2-item1、job2-item2、job2-item3、job3所有文件。
缓存与Artifacts的区别(为什么不用缓存)
- 缓存:用于加速重复构建(比如缓存依赖包、编译中间文件),存储在Runner本地或分布式缓存系统,不保证作业间产物的可靠传递,且并行读写同一缓存会导致覆盖问题。
- Artifacts:用于传递构建产物,存储在GitLab服务器,流水线内的后续作业可以可靠获取所有前置作业的产物,并行作业的artifacts会自动合并,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者jeremywat
相关产品推荐
相关产品推荐

