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。
- 先加一条Include规则,填
- 另外,在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
相关产品推荐
相关产品推荐

