2

我想为微服务以及登台和生产提供单独的管道。它看起来像这样:

在此处输入图像描述

我刚刚开始设置azure-pipelines.yaml并将其作为触发器admin

trigger:
  branches:
    include:
    - staging
    - production
  paths:
    include:
    - admin/*

resources:
  - repo: self

正如您可能马上看到的那样,我遇到的问题是,当我提交staging它时会触发两个管道。

所以我的问题是:有没有办法为这个微服务和这个微服务提供一个yaml,或者我需要有两个单独的文件吗?stagingproductionyaml


编辑:

鉴于这两件事,我认为我想做的事情不太可能,除非我分开adminStaging.yamland adminProduction.yaml

您不能在触发器中使用变量,因为变量是在运行时评估的(在触发器触发之后)。

如果您使用模板来创作 YAML 文件,那么您只能在管道的主 YAML 文件中指定触发器。您不能在模板文件中指定触发器。

https://docs.microsoft.com/en-us/azure/devops/pipelines/repos/azure-repos-git?view=azure-devops&tabs=yaml

4

1 回答 1

2

我同意@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 解释,并且不会显示在您的管道执行中。这意味着,如果您尝试在暂存生产分支以外的任何地方运行它,您的管道将失败。
于 2021-02-22T21:24:27.267 回答