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

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/

关键说明

  1. 移除全局缓存配置:不再依赖缓存传递产物,改用artifacts。
  2. 每个产物生成作业配置artifacts:所有生成release目录文件的作业(job1、job2、job3)都定义artifacts.paths为release/**/*,确保产物被上传到GitLab服务器。
  3. 自动合并并行产物: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:48:19