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

Jenkins能否将完成的流水线置为Pending状态并通过Webhook更新PR状态?

Jenkins 构建状态与外部Webhook回调的实现方案

首先明确:Jenkins 原生构建状态中确实没有 PENDING 这个值(currentBuild.currentResult 的可选值仅为 SUCCESS、FAILURE、ABORTED、UNSTABLE 等),所以直接让构建结束后保持 Pending 状态是无法实现的。但可以通过以下几种替代方案满足你的需求:

方案1:通过暂停构建等待外部回调

在流水线中加入 input 步骤让构建暂停,此时构建会处于等待用户输入的状态(视觉上接近Pending),直到外部Webhook通过Jenkins API触发该步骤继续执行:

pipeline {
    agent any
    stages {
        stage('发起外部请求') {
            steps {
                // 调用外部系统的请求逻辑
                sh 'curl -X POST "外部系统接口地址"'
            }
        }
        stage('等待Webhook回调') {
            steps {
                // 定义可通过API触发的input步骤
                input id: 'waitForCallback', message: '等待外部系统回调', ok: '继续构建'
            }
        }
        stage('根据回调结果更新状态') {
            steps {
                script {
                    // 从Webhook传递的参数中获取外部系统执行结果
                    def externalResult = params.EXTERNAL_RESULT
                    if (externalResult == 'SUCCESS') {
                        currentBuild.result = 'SUCCESS'
                        // 更新GitHub PR状态为成功
                        sh 'curl -X POST "https://api.github.com/repos/用户名/仓库名/statuses/${GIT_COMMIT}" -H "Authorization: token 你的Token" -d \'{"state":"success","description":"外部系统执行成功","context":"jenkins-external"}\''
                    } else {
                        currentBuild.result = 'FAILURE'
                        // 更新GitHub PR状态为失败
                        sh 'curl -X POST "https://api.github.com/repos/用户名/仓库名/statuses/${GIT_COMMIT}" -H "Authorization: token 你的Token" -d \'{"state":"failure","description":"外部系统执行失败","context":"jenkins-external"}\''
                    }
                }
            }
        }
    }
}

当外部系统完成后,调用Jenkins API触发input步骤:

curl -X POST "http://Jenkins地址/job/流水线名/构建号/input/waitForCallback/proceed" --user "用户名:密码或Token" --data-urlencode "json={\"parameter\":[{\"name\":\"EXTERNAL_RESULT\",\"value\":\"SUCCESS\"}]}"

方案2:拆分流水线为“触发+回调更新”两个部分

  1. 第一部分流水线仅负责发起外部请求,完成后将构建标记为 UNSTABLE(作为过渡状态),同时向GitHub PR提交pending状态标识:
pipeline {
    agent any
    stages {
        stage('发起外部请求') {
            steps {
                sh 'curl -X POST "外部系统接口地址" -d "jenkins_build_url=${BUILD_URL}&git_commit=${GIT_COMMIT}"'
                // 先给GitHub PR设置pending状态
                sh 'curl -X POST "https://api.github.com/repos/用户名/仓库名/statuses/${GIT_COMMIT}" -H "Authorization: token 你的Token" -d \'{"state":"pending","description":"等待外部系统执行","context":"jenkins-external"}\''
            }
        }
    }
    post {
        always {
            // 标记构建为UNSTABLE作为过渡
            script {
                currentBuild.result = 'UNSTABLE'
            }
        }
    }
}
  1. 外部系统完成后,通过Webhook触发第二个流水线(或同一个流水线的特定任务),根据外部结果更新Jenkins构建状态和GitHub PR状态:
pipeline {
    agent any
    parameters {
        string(name: 'BUILD_URL', description: '需要更新的Jenkins构建地址')
        string(name: 'GIT_COMMIT', description: '对应的Git提交哈希')
        string(name: 'EXTERNAL_RESULT', description: '外部系统执行结果(SUCCESS/FAILURE)')
    }
    stages {
        stage('更新Jenkins构建状态') {
            steps {
                script {
                    // 通过Jenkins API更新目标构建的状态
                    def buildNumber = BUILD_URL.split('/')[-2]
                    sh "curl -X POST \"http://Jenkins地址/job/流水线名/${buildNumber}/submitBuildResult\" --user \"用户名:密码或Token\" --data-urlencode \"result=${EXTERNAL_RESULT}\""
                }
            }
        }
        stage('更新GitHub PR状态') {
            steps {
                script {
                    def githubState = EXTERNAL_RESULT == 'SUCCESS' ? 'success' : 'failure'
                    def description = EXTERNAL_RESULT == 'SUCCESS' ? '外部系统执行成功' : '外部系统执行失败'
                    sh "curl -X POST \"https://api.github.com/repos/用户名/仓库名/statuses/${GIT_COMMIT}\" -H \"Authorization: token 你的Token\" -d '{\"state\":\"${githubState}\",\"description\":\"${description}\",\"context\":\"jenkins-external\"}'"
                }
            }
        }
    }
}

关键说明

  • Jenkins原生不支持构建结束后保持Pending状态,上述方案均通过过渡状态或拆分流程模拟需求;
  • 更新GitHub PR状态时,需确保Jenkins拥有对应的GitHub Token权限,且context参数能唯一标识该外部任务状态,避免与Jenkins默认构建状态混淆。

内容的提问来源于stack exchange,提问作者KVISH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:43:19