如何在Jenkins构建中止时通知Bitbucket并区分失败状态?
Jenkins构建中止与失败状态在Bitbucket的区分方案
首先明确:Bitbucket官方的Build Status API本身支持区分多种构建状态(包括SUCCESSFUL、FAILED、INPROGRESS、STOPPED),但你使用的Bitbucket Build Status Notifier Plugin默认将Jenkins的中止(ABORTED)状态映射为失败(FAILED),所以才会无法区分。
解决办法
方案一:修改插件代码实现状态区分
插件的核心问题在于状态映射逻辑,你提到的代码段正是将ABORTED归为FAILED的部分。可以通过以下步骤修改:
- 找到插件代码中状态映射的逻辑,将Jenkins的
ABORTED状态对应到Bitbucket的STOPPED状态; - 重新编译插件包,替换Jenkins服务器上的原有插件;
- 测试:手动中止Jenkins构建,Bitbucket会显示
STOPPED状态,与FAILED状态明确区分开。
方案二:用Jenkins Pipeline手动调用Bitbucket API
如果不想修改插件,可以通过Pipeline脚本自定义处理不同构建状态的通知,直接调用Bitbucket API发送对应状态:
pipeline { agent any stages { stage('执行构建') { steps { // 这里替换成你的实际构建步骤 sh 'echo "正在执行构建任务..."' } } } post { // 构建中止时发送STOPPED状态到Bitbucket aborted { script { def repoOwner = "你的Bitbucket用户名" def repoName = "你的仓库名称" def commitHash = env.GIT_COMMIT def buildUrl = env.BUILD_URL def bitbucketAuth = "Basic " + Base64.getEncoder().encodeToString("你的Bitbucket账号:App密码".getBytes()) httpRequest( url: "https://api.bitbucket.org/2.0/repos/${repoOwner}/${repoName}/commit/${commitHash}/statuses/build", httpMode: 'POST', contentType: 'APPLICATION_JSON', headers: [Authorization: bitbucketAuth], requestBody: """{ "state": "STOPPED", "key": "jenkins-build", "name": "Jenkins 构建任务", "url": "${buildUrl}", "description": "构建已被手动中止" }""" ) } } // 构建失败时发送FAILED状态到Bitbucket failure { script { def repoOwner = "你的Bitbucket用户名" def repoName = "你的仓库名称" def commitHash = env.GIT_COMMIT def buildUrl = env.BUILD_URL def bitbucketAuth = "Basic " + Base64.getEncoder().encodeToString("你的Bitbucket账号:App密码".getBytes()) httpRequest( url: "https://api.bitbucket.org/2.0/repos/${repoOwner}/${repoName}/commit/${commitHash}/statuses/build", httpMode: 'POST', contentType: 'APPLICATION_JSON', headers: [Authorization: bitbucketAuth], requestBody: """{ "state": "FAILED", "key": "jenkins-build", "name": "Jenkins 构建任务", "url": "${buildUrl}", "description": "构建执行失败" }""" ) } } // 构建成功时发送SUCCESSFUL状态(可选) success { script { // 类似上面的逻辑,发送SUCCESSFUL状态 } } } }
注:使用此方案需要确保Jenkins安装了HTTP Request Plugin,并且在Bitbucket中创建了具有仓库权限的App密码。
内容的提问来源于stack exchange,提问作者bkomo
相关产品推荐
相关产品推荐

