如何复用前一个Job的Runner执行后续Job?
在CI/CD里复用前一个Job的Runner和容器的方法
核心逻辑
GitLab CI没有直接让后续Job绑定前一个Job所用Runner的原生功能,但可以通过传递Runner标识+动态匹配标签的方式实现,同时调整Docker配置来复用容器。
具体操作步骤
1. 在build_job1里抓取Runner信息并传递
修改build_job1的脚本,把当前Runner的ID、Token这些关键信息写入环境变量文件,用artifacts传给后面的Job:
build_job1: stage: build tags: - test1 script: - echo "===== Download starts =====" - echo "===== Download Ends =====" # 捕获Runner的ID、Token和描述(都是GitLab自带的预定义变量) - echo "RUNNER_ID=$CI_RUNNER_ID" > runner.env - echo "RUNNER_TOKEN=$CI_RUNNER_TOKEN" >> runner.env - echo "RUNNER_DESCRIPTION=$CI_RUNNER_DESCRIPTION" >> runner.env artifacts: reports: dotenv: runner.env expire_in: 1h
这里用到的GitLab预定义变量:
CI_RUNNER_ID:当前Runner的唯一IDCI_RUNNER_TOKEN:Runner的认证TokenCI_RUNNER_DESCRIPTION:Runner的名称描述
2. 给Runner添加唯一标签
要让后续Job精准指定目标Runner,得给该Runner加一个唯一标签,比如示例里的Runner #44,就加runner-44标签。你可以通过GitLab UI操作,或者修改Runner配置文件config.toml来添加标签。
如果是Docker executor类型的Runner,确保标签配置生效,这样后续Job就能通过这个唯一标签定位到它。
3. 配置build_job2绑定目标Runner
利用build_job1传递的RUNNER_ID变量,动态指定build_job2的标签为该Runner的唯一标签,同时开启容器复用:
build_job2: stage: build # 动态用前一个Job传的Runner ID生成唯一标签,精准匹配目标Runner tags: - runner-${RUNNER_ID} # 开启Docker容器复用,让build_job2使用build_job1在同一个Runner上创建的容器(仅限Docker executor) variables: DOCKER_REUSE_CONTAINERS: "true" script: - echo "===== Download starts =====" - echo "===== Download Ends =====" # 根据需求重新设置Docker标签,替换成实际的镜像名和新标签 - docker tag my-old-image:v1 my-new-image:v2 # 依赖build_job1,确保能拿到传递的变量 dependencies: - build_job1
说明:
DOCKER_REUSE_CONTAINERS: "true":打开容器复用功能,前提是你的Runner使用Docker executor,且配置中未禁用reuse_containers- 动态标签
runner-${RUNNER_ID}:保证build_job2只会被分配到build_job1用过的那个Runner上
4. 额外注意事项
- 如果是共享Runner,要确保你添加的唯一标签不会和其他Runner重复
- 容器复用仅在同一个Runner的同一个executor环境下生效,不同Runner之间无法复用容器
- 怕出错的话,可以在build_job2里加个校验脚本,确认当前Runner的ID和传递过来的一致:
- if [ "$CI_RUNNER_ID" != "$RUNNER_ID" ]; then echo "Runner不匹配,终止Job"; exit 1; fi
内容的提问来源于stack exchange,提问作者ian castillio
相关产品推荐
相关产品推荐

