Bitbucket多分支差异化部署最佳方案咨询
我太懂你的痛点了——每个分支都存一份几乎一样的bitbucket-pipelines.yml,改一处要同步N个分支,简直是劳心劳力的重复工作。下面给你几个最实用的解决方案,按推荐度排序:
1. 统一配置文件+仓库变量+分支条件判断(首推)
这是最省心的方案,核心思路是用一份配置管所有分支,把差异部分交给仓库变量来处理:
- 只在默认分支(比如
main)存放完整的bitbucket-pipelines.yml,通用构建流程写死,分支专属逻辑用变量区分 - 在Bitbucket后台给不同分支配置专属变量(比如部署密钥、目标服务器地址)
- 开启「无配置文件分支复用默认分支配置」的开关,让所有分支都自动用这份统一配置
具体操作步骤:
第一步:在默认分支编写统一的yml
比如你的分支分main(生产)、staging(预发布)、feature/*(特性分支),yml可以这么写:
pipelines: branches: # 生产分支部署流程 main: - step: name: 构建并部署到生产环境 script: - echo "通用构建步骤:安装依赖、编译代码..." - npm install - npm run build # 使用生产环境专属变量 - ./deploy.sh --key $PROD_DEPLOY_KEY --target prod.example.com # 预发布分支部署流程 staging: - step: name: 构建并部署到预发布环境 script: # 复用通用构建步骤 - echo "通用构建步骤:安装依赖、编译代码..." - npm install - npm run build # 使用预发布环境专属变量 - ./deploy.sh --key $STAGING_DEPLOY_KEY --target staging.example.com # 所有特性分支只做构建检查,不部署 feature/*: - step: name: 仅执行构建与测试 script: - npm install - npm run build - npm run test
第二步:在Bitbucket后台配置分支专属变量
进入仓库的「Repository Settings > Repository variables」,添加对应变量:
PROD_DEPLOY_KEY:生产环境的部署密钥(可设置为「Secured」隐藏明文)STAGING_DEPLOY_KEY:预发布环境的部署密钥
第三步:开启默认分支配置复用
进入「Repository Settings > Pipelines > Settings」,找到**"Use the default branch's pipeline configuration for branches without a configuration file"**选项并勾选。这样一来,其他分支哪怕没有自己的bitbucket-pipelines.yml,推送后也会自动使用默认分支的配置触发构建。
2. 动态分支判断+通用脚本(适合分支数量极多的场景)
如果你的分支特别多(比如有几十个环境分支),逐个写分支条件太麻烦,可以用脚本动态判断当前分支,自动加载对应变量:
pipelines: default: - step: name: 通用构建与部署 script: # 通用构建步骤 - npm install - npm run build # 根据当前分支动态选择配置 - | if [ "$BITBUCKET_BRANCH" = "main" ]; then DEPLOY_KEY=$PROD_DEPLOY_KEY TARGET_SERVER=prod.example.com elif [ "$BITBUCKET_BRANCH" = "staging" ]; then DEPLOY_KEY=$STAGING_DEPLOY_KEY TARGET_SERVER=staging.example.com elif [[ "$BITBUCKET_BRANCH" =~ env/.* ]]; then # 匹配env/xxx格式的分支,用分支名作为变量前缀 BRANCH_SUFFIX=$(echo $BITBUCKET_BRANCH | cut -d'/' -f2) DEPLOY_KEY=$(eval echo "\$${BRANCH_SUFFIX}_DEPLOY_KEY") TARGET_SERVER=$(eval echo "\$${BRANCH_SUFFIX}_TARGET") else # 其他分支只构建不部署 echo "非部署分支,跳过部署步骤" exit 0 fi # 执行部署 - ./deploy.sh --key $DEPLOY_KEY --target $TARGET_SERVER
这种方式yml更简洁,新增分支只需要在后台加对应变量,不用修改yml文件。
3. 管道模板(适合复杂多步骤场景)
如果你的构建流程有很多重复的子步骤,可以把这些步骤抽成「模板锚点」,在分支配置里引用,不过这个方案还是需要每个分支有一个极简的yml文件,适合流程特别复杂的情况:
# 定义通用模板锚点 definitions: steps: - step: &build-step name: 通用构建步骤 script: - npm install - npm run build - npm run test pipelines: branches: main: - step: *build-step - step: name: 部署到生产 script: - ./deploy.sh --key $PROD_DEPLOY_KEY --target prod.example.com staging: - step: *build-step - step: name: 部署到预发布 script: - ./deploy.sh --key $STAGING_DEPLOY_KEY --target staging.example.com
为什么你之前的尝试没触发构建?
因为Bitbucket Pipelines默认会读取当前推送分支下的bitbucket-pipelines.yml,如果该分支没有这个文件,就不会触发构建。只要开启了前面说的「复用默认分支配置」开关,这个问题就彻底解决了!
内容的提问来源于stack exchange,提问作者liborm

