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

无需插件限制Jenkins同时运行任务数至2个

问题分析与解决方案

一、原脚本的核心问题

你的脚本未达到预期效果,主要原因是竞态条件:

  • 当多个新构建同时启动时,它们会同步检查当前运行的构建数量,可能同时判定满足运行条件,进而同时进入后续执行步骤,导致并发数突破限制。
  • 此外,currentJob.builds.findAll { it.isBuilding() }的结果存在状态延迟,无法实时反映最新的运行状态,进一步加剧了竞态问题。

二、修正后的脚本方案

要避免竞态,需让构建的“等待-启动”过程成为原子操作。可以借助Jenkins内置的SemaphoreLatch工具(无需插件)实现:

stage('testing_stage') {
  environment {
    MAX_CONCURRENT_JOBS = 2
  }
  steps {
    script {
      // 创建全局信号量,用任务名作为锁标识,避免跨任务干扰
      def semaphore = Jenkins.instance.getSemaphoreLatch("${env.JOB_NAME}-concurrent-lock", MAX_CONCURRENT_JOBS)
      
      try {
        // 获取信号量,若槽位已满则自动等待
        semaphore.acquire()
        println("获取到运行槽位,开始执行任务")
        
        // 此处写入你的任务逻辑
        // REST OF THE STAGE
      } finally {
        // 确保即使任务失败,槽位也会被释放
        semaphore.release()
        println("任务完成,释放运行槽位")
      }
    }
  }
}

关键说明:

  • SemaphoreLatch是Jenkins原生的同步组件,能严格保证同一时刻只有指定数量的构建持有运行权限,从根源上解决竞态问题。
  • finally块的作用是避免因任务异常失败导致槽位被永久占用。

三、零代码的最简方案

Jenkins内置了限制并发构建的功能,完全无需编写脚本:

  1. 进入目标Jenkins任务的配置页面
  2. 找到**“限制并发构建数”**选项(不同版本可能在“构建触发器”或“高级项目选项”下)
  3. 勾选该选项并设置“最大并发构建数”为2
  4. 保存配置

后续第三个任务触发时,会自动进入Jenkins构建队列,等待已有任务完成后再启动,完全满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:02:05