【问题标题】:Separate staging and production pipelines独立的暂存和生产管道
【发布时间】:2021-02-22 18:58:42
【问题描述】:

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

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

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

resources:
  - repo: self

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

所以我的问题是:有没有办法让这个微服务的stagingproduction 都有一个yaml,还是我需要有两个单独的yaml 文件?


编辑:

鉴于这两件事,我认为除非我将adminStaging.yamladminProduction.yaml 分开,否则我想做的事情不太可能:

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

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

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

【问题讨论】:

  • Branch-per-environment 是一种过时的模式,不适用于 Git 或关于如何实施持续交付的现代思维。我建议重新审视你的分支策略并采用 GitFlow 或 GitHubFlow 之类的东西。
  • @DanielMann 感谢您的建议。现在阅读它。
  • 另外,在没有看到管道的其余部分的情况下,我不相信您构建/部署生产环境的原因是因为您的 trigger 声明。按照编码,您的示例说,在其中任何一个分支上的提交都会触发管道,而不是它会触发两个环境。

标签: azure azure-devops azure-pipelines azure-devops-pipelines


【解决方案1】:

我同意@Daniel Mann 的观点,您应该采用更现代的分支策略。我通常使用基于 Gitflow 或带有发布分支的主干:

它们各有优缺点,但都可以涵盖您的用例。您需要一个非生产分支(develop 或 rc/*)和一个生产分支(ma​​ster)。 UAT 部署将从非 prod 分支触发,prod 版本将从 ma​​ster 触发。

但是,要解决您的问题,即是否可以同时部署到 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 解释,并且不会显示在您的管道执行中。这意味着,如果您尝试在 stagingproduction 分支以外的任何地方运行它,您的管道将失败

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-14
    • 2011-09-22
    • 2016-09-14
    • 2017-12-17
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2016-07-15
    相关资源
    最近更新 更多