如何实现同一作业在不同构建节点并发构建,同节点禁该作业并发?
作业跨节点并发构建(同一节点禁止同一作业多实例)实现方案
原生支持方案(按主流CI工具分类)
Jenkins
- 开启并发构建:进入作业配置的「General」标签,勾选
Execute concurrent builds if necessary,允许作业同时启动多个构建实例。 - 节点级同一作业锁定:
- 安装官方维护的
Lockable Resources插件(属于CI生态常用核心插件,可视为准原生支持),在全局配置中给每个构建节点创建唯一资源锁(比如节点名为node-01,锁名设为lock-node-01)。 - 返回作业配置的「Build Environment」标签,勾选
Lock resources,设置锁的匹配规则为「每个节点对应一个锁」,同时勾选Do not lock multiple resources。这样同一作业的每个构建实例会抢占不同节点的锁,确保不会在同一节点上并发执行,且不影响其他作业在该节点的执行。 - 补充:若不想依赖插件,可在构建前通过自定义Groovy脚本检查当前节点是否已有该作业的其他实例运行,若存在则主动触发重新调度,但这种半原生变通方案稳定性弱于插件。
- 安装官方维护的
GitLab CI
- 开启并发构建:GitLab CI默认允许作业并发,只要你的节点(Runner)有足够执行器(4个执行器满足需求)。
- 用
resource_group绑定节点锁定:在.gitlab-ci.yml中给目标作业配置与节点绑定的资源组,示例代码如下:
其中your-build-job: script: - ./build-script.sh resource_group: "node-${CI_RUNNER_ID}" tags: - build-nodeCI_RUNNER_ID是构建节点(Runner)的唯一标识,每个节点对应专属资源组,同一作业的多个实例会被限制在不同资源组(即不同节点)执行,同一节点的其他作业不受影响。
临时变通方案(供参考)
若暂时无法使用原生/插件方案,可在构建脚本开头添加检查逻辑:查询当前节点上是否已有该作业的其他进程运行,若存在则退出当前构建并通过CI工具API触发重新排队。这种方式需根据具体CI工具编写脚本,稳定性不如原生方案。
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

