无需插件限制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内置了限制并发构建的功能,完全无需编写脚本:
- 进入目标Jenkins任务的配置页面
- 找到**“限制并发构建数”**选项(不同版本可能在“构建触发器”或“高级项目选项”下)
- 勾选该选项并设置“最大并发构建数”为2
- 保存配置
后续第三个任务触发时,会自动进入Jenkins构建队列,等待已有任务完成后再启动,完全满足你的需求。
内容的提问来源于stack exchange,提问作者TenEM
相关产品推荐
相关产品推荐

