我同意@Daniel Mann 的观点,您应该采用更现代的分支策略。我通常使用基于 Gitflow 或带有发布分支的主干:
它们各有优缺点,但都可以涵盖您的用例。您需要一个非生产分支(develop 或 rc/ *)和一个生产分支(master)。UAT 部署将从非 prod 分支触发,prod 版本将从master触发。
但是,要解决您关于是否可以同时部署到 UAT 和生产的问题,同时将触发器指向两个分支,是的。您可以设置您的 YAML 管道,但它有点不雅。
实际上,您想要做的是使用条件或if 语句根据我在下面的示例中包含的分支有选择地运行您的阶段:
name: Stackoverflow-Example-Multiple-Triggers
trigger:
- staging
- production
stages:
- ${{ if contains(variables['Build.SourceBranch'], 'refs/heads/staging') }}:
- stage: StageA
displayName: "Stage A"
jobs:
- job: output_message_job_a
displayName: "Output Message Job"
pool:
vmImage: "ubuntu-latest"
steps:
- powershell: echo "Hello World!"
displayName: "Output Message"
condition: contains(variables['Build.SourceBranch'], 'refs/heads/staging')
- ${{ if contains(variables['Build.SourceBranch'], 'refs/heads/production') }}:
- stage: StageB
displayName: "Stage B"
jobs:
- job: output_message_job_b
displayName: "Output Message Job"
pool:
vmImage: "ubuntu-latest"
steps:
- powershell: echo "Hello World!"
displayName: "Output Message"
condition: contains(variables['Build.SourceBranch'], 'refs/heads/production')
您需要注意条件与 if 语句的行为不同:
- 条件:将显示管道中跳过的阶段,但不运行它们。
- If 语句:将跳过不完全满足 if 语句标准的 YAML 解释,并且不会显示在您的管道执行中。这意味着,如果您尝试在暂存或生产分支以外的任何地方运行它,您的管道将失败。