Azure devops Azure管道为多个环境(阶段)使用YAML,这些环境具有不同的变量值,但没有YAML重复

Azure devops Azure管道为多个环境(阶段)使用YAML,这些环境具有不同的变量值,但没有YAML重复,azure-devops,yaml,azure-pipelines,continuous-deployment,azure-pipelines-yaml,Azure Devops,Yaml,Azure Pipelines,Continuous Deployment,Azure Pipelines Yaml,假设我在Azure上有3个环境:Dev、Test和Prod。我有相同的管道来为每个环境构建和部署资源和代码,除了两个不同之处: 不同触发支路 不同的变量值 对于这种情况,正确的方法是什么?因为我至少想到了3个,没有一个是完美的: 选项1:我想我可以在Azure DevOps上创建一个管道(由3个分支中的任何一个触发),每个环境有3个阶段,每个阶段根据源分支添加一个要运行的条件,如下所示: trigger: branches: include: - a-branch-nam

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

  • 不同触发支路
  • 不同的变量值
对于这种情况,正确的方法是什么?因为我至少想到了3个,没有一个是完美的:

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

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

steps:
- template: build-and-deploy.yaml
  parameters:
      parameterName1: $(parameterValue1)
      parameterName2: $(parameterValue2)
条件:eq(变量['Build.SourceBranch'],'refs/heads/a-branch-name')

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

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

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

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

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

这似乎是最好的选择,但我没有在示例中看到它的任何地方使用过,因此可能我不知道它的缺点(如果有)。

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

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

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

下面是一个示例,您可以参考它:

  • 首先转到管道下的,单击变量组添加变量组。您可以将多个变量添加到此变量组。

  • 回购结构:

  • 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中定义变量,而无需添加变量组。

    下面介绍如何使用包含在特定于环境的管道中的共享管道配置

    要支持两种环境(
    dev
    prod
    ),您需要:

    • 1共享管道yaml
    • 2个环境专用YAML,每个环境一个
    • 在Azure DevOps中创建2条管道,每个环境一条;每个管道引用相应的yaml
    管道共享.yml

    变量:
    工件名称:ApiBuild
    NPM_缓存_文件夹:$(Pipeline.Workspace)/.NPM
    阶段:
    -阶段:建造
    显示名称:构建
    游泳池:
    vmImage:“ubuntu最新版本”
    需求:npm
    工作:
    ...
    -阶段:发布
    显示名称:发布
    德彭森:建造
    游泳池:
    vmImage:“ubuntu最新版本”
    工作:
    ...
    
    pipeline-dev.yml

    #触发器建立在对分支的提交之上
    触发:
    -发展
    #不触发基于PRs的构建
    公关:没有
    延伸:
    模板:pipeline-shared.yml
    
    pipeline-prod.yml

    触发器:
    -主人
    公关:没有
    延伸:
    模板:pipeline-shared.yml