Bitbucket Pipeline不支持变量设置部署环境的解决方案咨询
基于目标分支动态设置Bitbucket Pipeline部署环境的解决方案
问题场景
我希望基于$BITBUCKET_PR_DESTINATION_BRANCH设置部署环境,在set-deployment-environment步骤中通过以下代码定义ENV_NAME变量:
if [[ "$BITBUCKET_PR_DESTINATION_BRANCH" == "master" ]]; then export ENV_NAME=prd elif [[ "$BITBUCKET_PR_DESTINATION_BRANCH" == "uat" ]]; then export ENV_NAME=uat ...
但Bitbucket Pipeline不支持deployment: $ENV_NAME这种动态变量写法,当前流水线配置如下:
pull-requests: release/*: - step: *set-deployment-environment - step: <<: *ansible-build-deploy name: Deploying to environment deployment: $ENV_NAME
需要一个无需重复大量代码(仅需修改deployment: uat或deployment: prd这类行)的解决方案。
可行方案
利用YAML的锚点与合并特性,配合Bitbucket Pipeline的分支匹配规则,就能实现少代码复用的目标:
- 提取通用部署步骤锚点
把ansible-build-deploy中除deployment外的所有通用配置抽成基础锚点,避免重复编写:
definitions: steps: - &ansible-build-deploy-base name: Deploying to environment # 这里填入原ansible-build-deploy的所有通用配置,比如脚本、镜像、依赖等 image: ansible/ansible-runner:latest script: - ansible-playbook deploy.yml # 其他部署相关命令
- 创建分环境的部署锚点
基于基础锚点,分别定义对应不同环境的部署步骤,仅修改deployment字段:
- &deploy-to-prd <<: *ansible-build-deploy-base deployment: prd - &deploy-to-uat <<: *ansible-build-deploy-base deployment: uat
- 配置分支匹配的流水线
针对不同目标分支的PR,组合对应的前置步骤与部署步骤:
pull-requests: # 针对目标分支为master的PR master: - step: *set-deployment-environment - step: *deploy-to-prd # 针对目标分支为uat的PR uat: - step: *set-deployment-environment - step: *deploy-to-uat # 如果需要保留release/*分支的PR触发,可按需求指定默认环境 release/*: - step: *set-deployment-environment - step: *deploy-to-uat
这种方式下,后续新增环境时,只需要新增一个&deploy-to-xxx锚点(仅修改deployment值),再在pull-requests下添加对应目标分支的步骤组合即可,完全无需重复编写大量部署代码。
内容的提问来源于stack exchange,提问作者munchine
相关产品推荐
相关产品推荐

