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

问题描述 投票:0回答:3

假设我在 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 Pipeline 中具有不同的变量值,如下所示:

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

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

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

azure-devops yaml azure-pipelines continuous-deployment azure-pipelines-yaml
3个回答
23
投票

以下是如何使用包含在特定于环境的管道中的共享管道配置来完成此操作。

要支持 2 个环境(

dev
prod
),您需要:

  • 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

11
投票

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

关于触发分支,可以使用表达式{{if ......}}来判断触发分支条件。

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

这里有一个例子,你可以参考:

  1. 首先进入Pipelines下的Library,点击Variable group添加变量组。您可以将多个变量添加到该变量组中。 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中定义变量,无需添加变量组。


0
投票

我一直在寻找不同的东西,但遇到了你的这个问题。希望您部署顺利。

我正在做类似的事情,我实现了选项1。减少代码重复的方法是使用模板文件。

我创建了一个模板文件,现在我为多个开发、阶段、生产阶段调用它。除了模板文件之外,我不需要在任何地方更改它。我只传递 main.yml 文件中的变量。

© www.soinside.com 2019 - 2024. All rights reserved.