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

如何实现同一作业在不同构建节点并发构建,同节点禁该作业并发?

作业跨节点并发构建(同一节点禁止同一作业多实例)实现方案

原生支持方案(按主流CI工具分类)

Jenkins

  1. 开启并发构建:进入作业配置的「General」标签,勾选Execute concurrent builds if necessary,允许作业同时启动多个构建实例。
  2. 节点级同一作业锁定:
    • 安装官方维护的Lockable Resources插件(属于CI生态常用核心插件,可视为准原生支持),在全局配置中给每个构建节点创建唯一资源锁(比如节点名为node-01,锁名设为lock-node-01)。
    • 返回作业配置的「Build Environment」标签,勾选Lock resources,设置锁的匹配规则为「每个节点对应一个锁」,同时勾选Do not lock multiple resources。这样同一作业的每个构建实例会抢占不同节点的锁,确保不会在同一节点上并发执行,且不影响其他作业在该节点的执行。
    • 补充:若不想依赖插件,可在构建前通过自定义Groovy脚本检查当前节点是否已有该作业的其他实例运行,若存在则主动触发重新调度,但这种半原生变通方案稳定性弱于插件。

GitLab CI

  1. 开启并发构建:GitLab CI默认允许作业并发,只要你的节点(Runner)有足够执行器(4个执行器满足需求)。
  2. 用resource_group绑定节点锁定:在.gitlab-ci.yml中给目标作业配置与节点绑定的资源组,示例代码如下:
    your-build-job:
      script:
        - ./build-script.sh
      resource_group: "node-${CI_RUNNER_ID}"
      tags:
        - build-node
    
    其中CI_RUNNER_ID是构建节点(Runner)的唯一标识,每个节点对应专属资源组,同一作业的多个实例会被限制在不同资源组(即不同节点)执行,同一节点的其他作业不受影响。

临时变通方案(供参考)

若暂时无法使用原生/插件方案,可在构建脚本开头添加检查逻辑:查询当前节点上是否已有该作业的其他进程运行,若存在则退出当前构建并通过CI工具API触发重新排队。这种方式需根据具体CI工具编写脚本,稳定性不如原生方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:47:14