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:拆分流水线为“触发+回调更新”两个部分
- 第一部分流水线仅负责发起外部请求,完成后将构建标记为 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' } } } }
- 外部系统完成后,通过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
相关产品推荐
相关产品推荐

