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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:50:07