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

GitLab共享Runner下如何让不同Stage的Job共享构建目录?

解决方案:强制GitLab CI Job使用同一构建目录

问题原因

使用Shell执行器的GitLab Runner默认会根据CI_CONCURRENT_ID(并发任务ID)划分构建目录,路径格式为$CI_RUNNER_BUILDS_DIR/$CI_CONCURRENT_ID/$CI_PROJECT_PATH。当BUILD_PROD_JOB和DEPLOY_PROD_JOB被分配到不同的CI_CONCURRENT_ID时,就会使用不同的构建目录。

方法一:指定固定克隆路径(推荐)

通过在.gitlab-ci.yml中设置GIT_CLONE_PATH全局变量,强制所有Job使用同一个固定目录。这样无论CI_CONCURRENT_ID如何变化,构建路径都保持一致。

修改后的.gitlab-ci.yml配置:

variables:
  # 指定固定构建目录,用CI_PROJECT_PATH区分不同项目,避免共享Runner上的路径冲突
  GIT_CLONE_PATH: $CI_RUNNER_BUILDS_DIR/fixed-builds/$CI_PROJECT_PATH
  GIT_CLEAN_FLAGS: none

stages:
  - build-prod-stage
  - deploy-prod-stage

BUILD_PROD_JOB:
  stage: build-prod-stage
  script:
    - xxxxxx
    - xxxxx

DEPLOY_PROD_JOB:
  stage: deploy-prod-stage
  script: 
    - xxxxxx
    - xxxxxx*

注意事项

  • 确保GitLab Runner对$CI_RUNNER_BUILDS_DIR/fixed-builds/目录有读写权限;
  • 由于两个Job分属不同Stage,会串行执行,不会出现并发写入冲突;
  • 用$CI_PROJECT_PATH作为路径后缀,避免共享Runner上多个项目的构建目录互相干扰。

方法二:通过Artifacts传递构建产物

如果不想修改克隆路径,可以在构建Job中上传产物为Artifacts,部署Job下载后使用。这种方式不需要依赖同一目录,也能保证部署时拿到正确的构建产物。

修改后的.gitlab-ci.yml配置:

stages:
  - build-prod-stage
  - deploy-prod-stage

BUILD_PROD_JOB:
  stage: build-prod-stage
  variables:    
    GIT_CLEAN_FLAGS: none      
  script:
    - xxxxxx
    - xxxxx
  # 上传构建产物为Artifacts
  artifacts:
    paths:
      - ./dist/  # 替换为你的构建产物实际路径
      - ./target/
    expire_in: 1h  # 按需设置过期时间

DEPLOY_PROD_JOB:
  variables:
    GIT_CLEAN_FLAGS: none 
  stage: deploy-prod-stage
  needs: [BUILD_PROD_JOB]  # 明确依赖构建Job,确保先完成构建再部署
  script: 
    - xxxxxx  # 直接使用下载后的Artifacts目录内容
    - xxxxxx*

内容的提问来源于stack exchange,提问作者lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:12:07