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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:57:45