如何在Jenkins流水线中停止已触发的未完成构建任务?
解决方案:触发Jenkins任务时实时获取构建号并按需停止
针对你的场景,核心是要在触发任务后立即拿到对应构建实例的编号,而非等待完成或取最新构建,以下是两种可靠实现方式:
方法1:使用build步骤的wait: false参数(推荐)
Jenkins Pipeline的build步骤支持wait: false选项,触发任务后会立即返回该构建的RunWrapper对象,即使构建仍在运行,也能直接获取其编号。这种方式是最可靠的,因为返回的对象就是你当前触发的那个构建实例,完全不会和其他并行运行的实例混淆。
示例代码:
// 触发triggered_job且不等待完成 def triggeredBuild = build job: 'triggered_job', wait: false def targetBuildNumber = triggeredBuild.number echo "已触发构建:triggered_job #${targetBuildNumber}" // 后续根据业务逻辑判断是否停止构建 if (你的停止条件) { // 方式A:用Jenkins内部API停止构建(需脚本权限) def targetJob = Jenkins.instance.getItemByFullName('triggered_job') def runningBuild = targetJob.getBuildByNumber(targetBuildNumber) if (runningBuild.isBuilding()) { runningBuild.stop() echo "已停止triggered_job #${targetBuildNumber}" } // 方式B:用HTTP请求停止(适用于跨实例或权限受限场景) // def jenkinsAuth = "Basic " + Base64.getEncoder().encodeToString("用户名:密码".getBytes()) // sh "curl -X POST -H 'Authorization: ${jenkinsAuth}' http://你的Jenkins地址/job/triggered_job/${targetBuildNumber}/stop" }
注意:使用Jenkins内部API时,需要在Jenkins的「脚本审批」中允许相关方法的调用(比如Jenkins.instance.getItemByFullName、build.stop())。
方法2:通过Jenkins REST API触发并追踪构建编号
如果无法使用build步骤(比如特殊的触发逻辑),可以通过API触发任务,然后通过队列项获取对应的构建编号:
示例代码:
// 获取Jenkins防跨站请求伪造的crumb(若Jenkins未开启CSRF防护可省略) def jenkinsCrumb = sh(script: 'curl -s "http://你的Jenkins地址/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\\":\\",//crumb)"', returnStdout: true).trim() // 触发任务并获取队列项URL def queueItemUrl = sh( script: "curl -s -X POST -H '${jenkinsCrumb}' -D - http://你的Jenkins地址/job/triggered_job/build | grep -i location | awk '{print \$2}'", returnStdout: true ).trim() // 轮询队列项,直到构建被分配编号 def targetBuildNumber = null while (targetBuildNumber == null) { def queueItemJson = sh(script: "curl -s ${queueItemUrl}api/json", returnStdout: true) def queueData = new groovy.json.JsonSlurper().parseText(queueItemJson) targetBuildNumber = queueData.executable?.number sleep(time: 2, unit: 'SECONDS') // 间隔2秒轮询一次 } echo "获取到触发的构建编号:${targetBuildNumber}" // 后续停止构建的逻辑同方法1
这种方式需要处理CSRF crumb和轮询队列,步骤更繁琐,仅推荐在build步骤无法满足需求时使用。
内容的提问来源于stack exchange,提问作者jaafar Nasrallah
相关产品推荐
相关产品推荐

