如何在指定Jenkins任务运行时阻止BitBucket合并拉取请求?
当然可行!我来给你分享两种实操性强的实现方案
方案一:利用BitBucket分支保护 + Jenkins构建状态动态拦截
这是最常用的方式,核心思路是通过Jenkins向BitBucket提交自定义构建状态,配合BitBucket的合并规则来阻止PR合并:
第一步:配置BitBucket分支权限
打开你的BitBucket仓库,进入「Repository settings」→「Branch permissions」,给需要保护的分支(比如main)添加规则:- 勾选「Require all checks to pass before merging」
- 确保这个规则覆盖所有需要阻止合并的PR目标分支
第二步:在Jenkins任务中添加状态提交脚本
给你要监控的Jenkins任务添加两个步骤:构建前步骤(Shell/PowerShell):任务启动时,向BitBucket提交「运行中」的状态,告诉BitBucket现在不能合并:
# 替换成你的BitBucket实例地址、凭据变量 curl -X POST -u ${BITBUCKET_CREDS_USR}:${BITBUCKET_CREDS_PSW} \ "https://your-bitbucket-domain/rest/build-status/1.0/commits/${GIT_COMMIT}" \ -H "Content-Type: application/json" \ -d '{ "state": "INPROGRESS", "key": "block_merge_task", "name": "Critical Jenkins Task Running", "description": "指定的Jenkins任务正在运行,PR合并已被阻止", "url": "${BUILD_URL}" }'这里的
${GIT_COMMIT}是Jenkins内置变量,自动获取当前构建的提交ID;BITBUCKET_CREDS_USR和BITBUCKET_CREDS_PSW需要在Jenkins的「凭据管理」里配置好。构建后步骤(无论成功/失败都执行):任务结束后,更新状态为「完成」,解除合并限制:
curl -X POST -u ${BITBUCKET_CREDS_USR}:${BITBUCKET_CREDS_PSW} \ "https://your-bitbucket-domain/rest/build-status/1.0/commits/${GIT_COMMIT}" \ -H "Content-Type: application/json" \ -d '{ "state": "SUCCESS", "key": "block_merge_task", "name": "Critical Jenkins Task Completed", "description": "指定的Jenkins任务已完成,PR合并恢复允许", "url": "${BUILD_URL}" }'
方案二:针对定时/非PR触发的Jenkins任务(进阶)
如果你的Jenkins任务不是由PR触发的(比如定时执行的批量任务),需要阻止所有打开的PR合并,那可以在构建前先调用BitBucket API获取所有打开的PR,再逐个给对应的提交ID添加「运行中」状态:
# 获取所有打开的PR的提交ID PR_COMMITS=$(curl -u ${BITBUCKET_CREDS_USR}:${BITBUCKET_CREDS_PSW} \ "https://your-bitbucket-domain/rest/api/1.0/projects/[PROJECT_KEY]/repos/[REPO_SLUG]/pull-requests?state=OPEN" \ | jq -r '.values[] | .fromRef.latestCommit') # 遍历每个提交ID,添加阻止状态 for COMMIT in $PR_COMMITS; do curl -X POST -u ${BITBUCKET_CREDS_USR}:${BITBUCKET_CREDS_PSW} \ "https://your-bitbucket-domain/rest/build-status/1.0/commits/${COMMIT}" \ -H "Content-Type: application/json" \ -d '{ "state": "INPROGRESS", "key": "block_merge_task", "name": "Critical Jenkins Task Running", "description": "指定的Jenkins任务正在运行,PR合并已被阻止", "url": "${BUILD_URL}" }' done
构建后同样遍历这些提交ID,更新状态为完成即可。
注意事项
- 确保Jenkins服务器能正常访问BitBucket的API;
- BitBucket用户需要拥有仓库的「Write」权限,才能修改构建状态;
- 如果使用BitBucket Cloud,API地址和参数格式会略有不同,你可以直接搜BitBucket Build Status API调整细节。
内容的提问来源于stack exchange,提问作者wojtek1902
相关产品推荐
相关产品推荐

