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

Bitbucket任意分支推送触发Jenkins流水线,仅测试目标分支方案咨询

解决方案

我来帮你搞定这个问题,结合你双仓库的Jenkins流水线场景,咱们分三步实现「仅非master分支推送时触发流水线,且只测试被推送的目标分支」的需求:

1. 先把触发范围限制在非master分支

首先得让Bitbucket的Webhook只在非master分支推送时才给Jenkins发请求,避免master分支误触发:

  • 登录你的Bitbucket仓库,找到对应Webhook的配置页面,找到「Branch filtering」(分支过滤)选项:
    • 先加一条Include规则,填refs/heads/*(匹配所有分支)
    • 再加一条Exclude规则,填refs/heads/master(排除master分支)
      这样只有非master分支的推送才会触发Webhook。
  • 另外,在Jenkins的流水线项目「构建触发器」里,如果你用的Bitbucket插件版本支持,也可以直接在触发器设置里加分支过滤规则,比如填!master,双重保险。

2. 修改流水线脚本,动态拉取触发的分支

你现在的checkout脚本用的是branches: [[name: '**']],这会拉取所有分支,咱们改成动态获取推送的分支,精准拉取对应代码:

2.1 先搞懂触发时的分支变量

Bitbucket插件触发流水线时,会自动给Jenkins设置一个环境变量BITBUCKET_BRANCH,这个变量里就存着被推送的分支名(比如feature/user-profile),不管是repo1还是repo2的推送,这个变量都会正确对应。

2.2 改写两个仓库的checkout代码

不管是repo1还是repo2,都要拉取这个触发的分支,而不是全部分支:

// 先克隆repo1,拉取触发的目标分支
checkout([
    $class: 'GitSCM',
    branches: [[name: "*/${env.BITBUCKET_BRANCH}"]],
    doGenerateSubmoduleConfigurations: false,
    submoduleCfg: [],
    userRemoteConfigs: [[credentialsId: '你的repo1凭证ID', url: 'repo1的Bitbucket地址']]
])

// 再克隆repo2到src目录,同样拉取对应分支
checkout([
    $class: 'GitSCM',
    branches: [[name: "*/${env.BITBUCKET_BRANCH}"]],
    doGenerateSubmoduleConfigurations: false,
    extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'src']],
    submoduleCfg: [],
    userRemoteConfigs: [[credentialsId: 'XXXX-XXXX-XXXX', url: 'https://BITBUCKETURL']]
])

小提醒:如果repo1和repo2的分支是一一对应的(比如推repo1的feature/pay,repo2也有同名分支),这样写就没问题。如果分支名不对应,你得根据实际情况调整分支匹配规则哦。

2.3 加个分支校验,防止漏网之鱼

为了绝对避免master分支被触发,咱们在流水线最开头加个判断,直接终止不符合条件的运行:

pipeline {
    agent any
    stages {
        stage('校验分支合法性') {
            steps {
                script {
                    if (env.BITBUCKET_BRANCH == 'master') {
                        error('禁止master分支触发此流水线!')
                    }
                }
            }
        }
        stage('克隆仓库') {
            steps {
                // 上面的checkout代码放这里
            }
        }
        stage('安装依赖') {
            steps {
                sh 'composer install'
            }
        }
        stage('运行测试') {
            steps {
                // 这里执行你的测试命令,比如phpunit,只会跑当前分支的代码
                sh 'phpunit'
            }
        }
    }
}

3. 最后验证一下

  • 推一个非master分支到Bitbucket,看看Jenkins是不是自动触发了,而且拉取的是你刚推的分支代码
  • 再推一次master分支,确认流水线要么不触发,要么在「校验分支合法性」阶段直接失败

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:27:20