【问题标题】:Azure Pipelines using YAML for multiple environments (stages) with different variable values but no YAML duplicationAzure Pipelines 将 YAML 用于具有不同变量值但没有 YAML 重复的多个环境(阶段)
【发布时间】:2021-02-22 21:51:33
【问题描述】:

假设我在 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-devops yaml azure-pipelines continuous-deployment azure-pipelines-yaml


    【解决方案1】:

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

    要支持 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
    

    【讨论】:

    • 据我所知,这不使用管道“库”(或变量组),或管道“环境”或“部署阶段”。我正在阅读所有 Azure DevOps 文档,试图了解这些文档是如何相互关联的,特别是考虑到非常重视从经典转向 YAML。该解决方案似乎没有使用任何这些东西 - 你能确认一下吗?
    【解决方案2】:

    根据你的描述,如果你想让不同的stage共享同一个repo资源,但是它们的触发分支和变量值不同。

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

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

    这里是一个例子,大家可以参考:

    1. 首先进入Pipelines下的Library,点击Variable group添加变量组。您可以将多个变量添加到此变量组。

    2. 回购结构:

    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中定义变量,不用添加变量组。

    【讨论】:

      猜你喜欢
      • 2020-12-02
      • 1970-01-01
      • 2020-06-10
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2020-01-30
      相关资源
      最近更新 更多