Jenkins多分支流水线:Bitbucket分支合并/删除后无法触发清理任务
解决Jenkins多分支流水线分支关闭/合并后的清理问题
核心:让Jenkins接住Bitbucket的分支删除事件
首先检查Bitbucket的Webhook配置,默认可能没开启分支删除的触发逻辑:
1. 补全Bitbucket Webhook事件
- 登录Bitbucket仓库,进入仓库设置 > Webhooks
- 找到已配置的Jenkins Webhook,编辑它,勾选**分支删除(Branch deletion)**事件
- 保存后,Bitbucket会在分支被删除/合并(合并后分支通常会被删除)时向Jenkins发送触发请求
2. 配置Jenkins响应分支删除事件
Jenkins多分支流水线默认不会自动处理分支删除,需要手动配置:
- 确保安装Bitbucket Branch Source Plugin并更新到最新版本(旧版本可能不支持分支删除事件)
- 打开多分支流水线的配置页面,在Branch Sources的Bitbucket配置中,展开Advanced选项
- 勾选Prune stale branches,设置清理间隔(比如每天一次),同时启用当分支被删除时自动删除对应的流水线选项
- 还可以在流水线中添加专门的清理阶段,仅在分支删除事件触发时执行:
pipeline { agent any stages { stage('Cleanup') { when { triggeredBy cause: 'BranchIndexingCause', detail: 'Branch deleted' } steps { script { // 替换为你的实际清理命令 sh 'delete-dns-zone ${BRANCH_NAME}' sh 'drop-db-connection ${BRANCH_NAME}' } } } } }
3. 兜底方案:定时扫描批量清理
如果Webhook方式不稳定,可以用定时任务做兜底:
- 创建独立的Jenkins流水线项目,设置定时构建(比如每天凌晨2点)
- 流水线核心逻辑如下:
pipeline { agent any stages { stage('Cleanup Stale Branches') { steps { script { // 调用Bitbucket API获取当前活跃分支 def activeBranches = sh( script: 'curl -u 你的用户名:Bitbucket应用密码 https://api.bitbucket.org/2.0/repos/工作区/仓库名/refs/branches | jq -r \'.values[].name\'', returnStdout: true ).split('\n').findAll() // 获取Jenkins多分支项目中的所有分支任务 def jenkinsProject = Jenkins.instance.getItemByFullName('你的多分支项目名') def jenkinsBranches = jenkinsProject.items*.name // 筛选出Jenkins存在但Bitbucket已删除的分支 def staleBranches = jenkinsBranches - activeBranches staleBranches.each { branch -> // 执行资源清理操作 sh "delete-dns-zone ${branch}" sh "drop-db-connection ${branch}" // 删除Jenkins中对应的分支任务 jenkinsProject.getItem(branch).delete() } } } } } }
注意:执行该脚本需要Jenkins具备足够权限,且服务器需安装jq工具用于解析API返回的JSON数据。
4. 优化建议
- 将清理逻辑封装为Jenkins共享库,实现多流水线复用
- 分支创建时记录资源信息(如DNS名称、数据库连接名)到Jenkins参数或外部存储,清理时直接读取,避免硬编码
- 给清理任务添加详细日志,方便排查问题
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

