使用YAML的Azure Pipelines用于具有不同变量值但没有YAML重复的多个环境阶段

问题描述

让我们假设我在Azure上有3个环境:开发,测试和生产。除了两个不同之处,我具有用于每个环境的构建和部署资源和代码的相同管道:

  • 不同的触发器分支
  • 不同的变量值

此方案的正确方法是什么?因为我想到至少有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)

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

解决方法

根据您的描述,如果您希望不同的阶段共享相同的回购资源,但是它们的触发分支和变量值是不同的。

关于触发器分支,可以使用表达式{{if ......}}确定触发器分支条件。

关于变量值,您可以定义模板和变量组以通过参数指定它们。

这里是一个例子,您可以参考它:

  1. 首先转到管道下的,单击变量组以添加变量组。您可以将多个变量添加到该变量组。 enter image description here enter image description here

  2. 回购结构: enter image description here

  3. azure-pipelines.yml:

    样本:

     stages:
     - template: stage/test.yml
       parameters:
        ${{if contains(variables['Build.SourceBranch'],'master')}}:
          variableGroup: devGroup
          stageName: Dev
          test: a
        ${{if contains(variables['Build.SourceBranch'],'test')}}:
          stageName: test
          test: b
    

阶段/测试。 yml:

parameters:
- name: stageName
  displayName: Test
  type: string
  default: test
  
- name: test
  displayName: Test
  type: string
  default: test

- name: variableGroup
  displayName: Test
  type: string
  default: test

stages:
- stage: Test_${{ parameters.stageName }}
  variables: 
    - group: ${{parameters.variableGroup}}
  jobs:
  - job: Test1
    pool:
      vmImage: vs2017-win2016
    steps:
    - script: echo "Hello Test1"
    - script: echo  ${{ parameters.test }}
    - script: echo $(dev1)

当然,如果要使用单个变量,则可以直接在yaml中定义变量,而无需添加变量组。

,

这是使用包含在特定于环境的管道中的共享管道配置来完成此操作的方法。

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

  • 1个共享管道Yaml
  • 2个特定于环境的Yaml,每个环境分别一个
  • 在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