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

如何防止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能执行:

  1. 安装插件:在Jenkins插件管理中安装Lockable Resources Plugin
  2. 配置全局锁:
    • 进入Jenkins全局配置页面,找到"Lockable Resources"区域
    • 添加一个锁资源(例如命名为job_ab_mutex)
  3. 修改流水线脚本:
    • 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 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:32:17