如何在BitBucket拉取请求更新时中止Jenkins正在进行的构建?
嘿,针对你在Multi Branch Pipeline里想要PR更新时自动中止同PR正在进行的构建的需求,结合你当前的Jenkins 2.111、Bitbucket Branch Source 2.2.0和BitBucket 5.7.0环境,我整理了两个可行的方案:
方案1:用Pipeline内置的并发控制(最简单直接)
Jenkins Pipeline提供了现成的配置项来处理并发构建,刚好能满足你的需求。你只需要在Jenkinsfile里添加disableConcurrentBuilds并开启abortPrevious参数:
pipeline { agent any options { // 禁止同PR的并发构建,新构建触发时自动中止之前的运行中构建 disableConcurrentBuilds(abortPrevious: true) } stages { // 你的构建阶段... stage('Build') { steps { echo '开始构建...' // 具体构建命令 } } stage('Test') { steps { echo '运行测试...' } } } }
这个配置的逻辑是:因为Multi Branch Pipeline里每个PR对应一个独立的Job,disableConcurrentBuilds会限制这个Job不能同时跑多个构建;加上abortPrevious: true后,当PR更新触发新构建时,Jenkins会自动终止该PR对应的Job里正在运行的旧构建。
方案2:通过Jenkins API手动中止旧构建(更灵活)
如果方案1因为插件版本兼容问题(不过你的Jenkins 2.111应该支持)或者需要更精细的控制,可以用Groovy脚本调用Jenkins内部API来实现:
pipeline { agent any stages { stage('中止旧构建') { steps { script { // 获取当前PR对应的Job实例 def currentJob = currentBuild.rawBuild.getParent() // 筛选出该Job下正在运行且不是当前构建的实例 def runningOldBuilds = currentJob.getBuilds().findAll { build -> build.isBuilding() && build.number != currentBuild.number } // 逐个中止这些旧构建 runningOldBuilds.each { build -> echo "正在中止PR ${env.BRANCH_NAME}的旧构建 #${build.number}" build.doStop() } } } } // 后续构建阶段... } }
需要注意的是,这个方法需要你的Jenkins允许Pipeline脚本访问内部API,你可以在Jenkins全局安全配置里调整“脚本安全”相关的权限,确保脚本能执行这些操作。
额外提示
- 方案1是官方推荐的方式,配置简单且稳定,优先推荐使用。
- 两种方案都只会作用于当前PR对应的Job,不会影响其他PR或者分支的构建,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Anantha
相关产品推荐
相关产品推荐

