首页 > 解决方案 > Azure Pipelines 将 YAML 用于具有不同变量值但没有 YAML 重复的多个环境(阶段)

问题描述

假设我在 Azure 上有 3 个环境:Dev、Test 和 Prod。我有相同的管道来构建和部署每个环境的资源和代码,除了两个不同之处:

这种情况的正确方法是什么?因为我想到了至少 3 个,其中没有一个是完美的:

选项 1:我想我可以在 Azure DevOps 上创建一个管道(由 3 个分支中的任何一个触发),每个环境有 3 个阶段,并为每个阶段添加一个根据源分支运行的条件,如下所示:

condition: eq(variables['Build.SourceBranch'], 'refs/heads/a-branch-name')

并在每个阶段引用不同的变量。但这会在每个阶段引入代码重复——当添加或修改一个步骤时,我必须记住编辑 3 个阶段——这是不可取的。

选项 2:在我的存储库中创建 3 个单独的 YAML 文件,每个文件都有指定的触发器分支并引用相同的变量名称,然后在 Azure DevOps 上创建 3 个不同的管道,每个文件都有不同的变量值。但这也会引入代码重复。

选项 3:使用其中定义的步骤创建 1 个build-and-deploy.yaml文件作为模板,然后创建另外 3 个引用该模板的 YAML 文件,每个文件在每个 Azure 管道中具有不同的触发器分支和不同的变量值,如下所示:

trigger:
  branches:
    include:
    - a-branch-name

steps:
- template: build-and-deploy.yaml
  parameters:
      parameterName1: $(parameterValue1)
      parameterName2: $(parameterValue2)

这似乎是最好的选择,但我没有看到它在示例中的任何地方使用过,所以也许我只是不知道它的缺点,如果有的话。

标签: azure-devopsyamlazure-pipelinescontinuous-deploymentazure-pipelines-yaml

解决方案


这是使用包含在特定于环境的管道中的共享管道配置的方法。

要支持 2 个环境(devprod),您需要:

  • 1个共享管道yaml
  • 2 个特定于 env 的 yaml,每个 env 一个
  • 在 Azure DevOps 中创建了 2 个管道,每个环境一个;每个管道引用相应的 yaml

pipeline-shared.yml

variables:
  ARTIFACT_NAME: ApiBuild
  NPM_CACHE_FOLDER: $(Pipeline.Workspace)/.npm

stages:
  - stage: Build
    displayName: Build
    pool:
      vmImage: 'ubuntu-latest'
      demands: npm
    jobs:
      ...

  - stage: Release
    displayName: Release
    dependsOn: Build
    pool:
      vmImage: 'ubuntu-latest'
    jobs:
      ...

pipeline-dev.yml

# Trigger builds on commits to branches
trigger:
  - dev

# Do not trigger builds on PRs
pr: none

extends:
  template: pipeline-shared.yml

pipeline-prod.yml

trigger:
  - master

pr: none

extends:
  template: pipeline-shared.yml

推荐阅读