如何防止Jenkins父Job A在子Job B运行时被执行?
解决Jenkins父Job A在子Job B运行时无法被阻止启动的问题
你当前配置的disableConcurrentBuilds()仅能限制同一Job自身的并发构建,无法实现父Job A与子Job B之间的互斥。要实现"Job B运行时禁止Job A启动"的需求,可采用以下两种可靠方案:
方案一:使用Lockable Resources插件实现全局互斥锁
这是最推荐的方案,通过全局锁资源让A和B共享同一锁,保证同一时间只有一个Job能执行:
- 安装插件:在Jenkins插件管理中安装
Lockable Resources Plugin - 配置全局锁:
- 进入Jenkins全局配置页面,找到"Lockable Resources"区域
- 添加一个锁资源(例如命名为
job_ab_mutex)
- 修改流水线脚本:
- Job A的脚本中,将所有业务步骤包裹在
lock块内:pipeline { agent any options { disableConcurrentBuilds() timeout(time: 22, unit: 'HOURS') } stages { stage('Run with Mutex') { steps { lock(resource: 'job_ab_mutex') { // 原Job A的所有业务步骤 stage('Build') { // ... 你的构建逻辑 } // 触发Job B(保持原有触发逻辑) build job: 'Job B', wait: false } } } } } - Job B的脚本中,同样将所有业务步骤包裹在同一锁块内:
pipeline { agent any options { disableConcurrentBuilds() timeout(time: 22, unit: 'HOURS') } stages { stage('Run with Mutex') { steps { lock(resource: 'job_ab_mutex') { // 原Job B的所有业务步骤 stage('Post Build Tasks') { // ... 你的子任务逻辑 } } } } } }
- Job A的脚本中,将所有业务步骤包裹在
这样,只要Job B持有锁在运行,Job A启动时会进入等待队列,直到锁被释放;同时disableConcurrentBuilds()依然保证各自Job自身不会并发。
方案二:在Job A启动前检查Job B的运行状态
通过Jenkins API在Job A启动时主动检查Job B是否正在构建,若正在运行则直接终止Job A:
修改Job A的流水线脚本,添加前置检查步骤:
pipeline { agent any options { disableConcurrentBuilds() timeout(time: 22, unit: 'HOURS') } stages { stage('Check Job B Status') { steps { script { def jobB = Jenkins.instance.getItemByFullName('Job B') if (jobB.isBuilding()) { error("Job B is currently running, aborting Job A execution") } } } } // 原Job A的业务步骤 stage('Original Tasks') { // ... 你的构建逻辑 build job: 'Job B', wait: false } } }
注意:此方案需要给流水线执行用户授予足够权限(如Job读取权限),且存在极小概率的竞态问题(检查完成后Job B刚好启动),适合对互斥要求不是极高的场景。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

