如何基于Git分支触发不同Azure CD流水线并复用CI流水线
问题梳理
我这边部署环境分为dev、uat、production三个阶段,Git仓库设有dev和main两个分支。目前推送代码到dev分支时,会自动触发CI流水线构建镜像并推送到镜像仓库,随后触发CD流水线自动部署到dev环境。
我希望在dev分支合并到main分支时触发后续部署阶段,但不确定能否复用同一CD流水线;当前采用两套CI/CD流水线架构:dev分支对应一套CI/CD,仅自动部署到dev环境;main分支对应一套CI/CD,自动部署到uat环境并包含production阶段。
我想优化为使用单个CI流水线,根据触发构建的Git分支控制CD流水线的运行,避免重复配置仅分支不同的CI流水线。当前的CI流水线YAML配置如下:
trigger: branches: include: - dev - main variables: - group: devops-project-group - template: app-variables.yml pool: vmImage: ubuntu-latest steps: - checkout: self - bash: | echo 'starting build ...'
优化方案
完全可以用单CI流水线实现需求,靠分支条件判断来控制不同的CD触发逻辑,核心CD步骤都能复用,只需要根据分支调整部署目标就行,具体配置思路和示例如下:
1. 保留原有分支触发规则
原有的trigger配置已经包含dev和main分支,无需修改,确保两个分支推送/合并时都能触发CI流水线。
2. 添加分支判断变量
新增一个自动匹配分支的环境变量,后续步骤可直接引用该变量区分部署目标:
variables: - group: devops-project-group - template: app-variables.yml - name: DEPLOY_ENV value: ${{ if eq(variables['Build.SourceBranchName'], 'dev') }}dev${{ elseif eq(variables['Build.SourceBranchName'], 'main') }}uat${{ else }}none${{ end }}
3. 复用构建核心步骤
原有的checkout、构建脚本等步骤可以直接保留,因为不管哪个分支,构建镜像、推送镜像仓库的逻辑是一致的,无需重复配置。
4. 按分支条件触发对应部署
构建完成后,通过condition属性过滤步骤,只在对应分支下执行部署逻辑:
steps: - checkout: self - bash: | echo 'starting build ...' # 替换为你实际的构建镜像、推送镜像仓库命令 displayName: '构建并推送镜像' # 仅dev分支触发dev环境部署 - bash: | echo '触发CD流水线部署到dev环境' # 替换为调用CD流水线部署dev环境的实际命令(如API调用、内置流水线触发任务) displayName: '部署至dev环境' condition: eq(variables['Build.SourceBranchName'], 'dev') # 仅main分支触发uat环境部署 - bash: | echo '触发CD流水线部署到uat环境' # 替换为调用CD流水线部署uat环境的实际命令 displayName: '部署至uat环境' condition: eq(variables['Build.SourceBranchName'], 'main') # production阶段建议设为手动触发(仅main分支下可手动执行) - bash: | echo '触发CD流水线部署到production环境' # 替换为调用CD流水线部署production环境的实际命令 displayName: '部署至production环境' condition: and(eq(variables['Build.SourceBranchName'], 'main'), eq(variables['Build.Reason'], 'Manual')) enabled: false # 默认禁用,需手动开启或设置为手动触发步骤
关键说明
- 利用
condition属性实现步骤的分支过滤,只有满足条件的步骤才会执行。 - 如果CD流水线是独立的,可以通过API调用或工具内置的流水线触发任务(如Azure DevOps的
Azure Pipelines任务),传递不同的环境参数即可复用同一套CD流水线。 - production阶段务必设置为手动触发,避免合并main分支后自动部署到生产环境,降低操作风险。
内容的提问来源于stack exchange,提问作者crowne
相关产品推荐
相关产品推荐

