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
相关产品推荐
相关产品推荐

