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

Mar*_*icz 6 yaml continuous-deployment azure-devops azure-pipelines azure-pipelines-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:build-and-deploy.yaml使用其中定义的步骤创建 1 个文件作为模板,然后创建另外 3 个引用该模板的 YAML 文件,每个文件在每个 Azure Pipeline 中都有不同的触发器分支和不同的变量值,如下所示:

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

steps:
- template: build-and-deploy.yaml
  parameters:
      parameterName1: $(parameterValue1)
      parameterName2: $(parameterValue2)
Run Code Online (Sandbox Code Playgroud)

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

Ali*_*SFT 10

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

\n

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

\n

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

\n

这里有一个例子,你可以参考\xef\xbc\x9a

\n
    \n
  1. 首先进入Pipelines下的Library,点击Variable组添加变量组。您可以向此变量组添加多个变量。\n在此输入图像描述\n在此输入图像描述

    \n
  2. \n
  3. 回购结构:\n在此输入图像描述

    \n
  4. \n
  5. azure-pipelines.yml\xef\xbc\x9a

    \n

    样本\xef\xbc\x9a

    \n
     stages:\n - template: stage/test.yml\n   parameters:\n    ${{if contains(variables[\'Build.SourceBranch\'], \'master\')}}:\n      variableGroup: devGroup\n      stageName: Dev\n      test: a\n    ${{if contains(variables[\'Build.SourceBranch\'], \'test\')}}:\n      stageName: test\n      test: b\n
    Run Code Online (Sandbox Code Playgroud)\n
  6. \n
\n

阶段/测试。yml\xef\xbc\x9a

\n
parameters:\n- name: stageName\n  displayName: Test\n  type: string\n  default: test\n  \n- name: test\n  displayName: Test\n  type: string\n  default: test\n\n- name: variableGroup\n  displayName: Test\n  type: string\n  default: test\n\nstages:\n- stage: Test_${{ parameters.stageName }}\n  variables: \n    - group: ${{parameters.variableGroup}}\n  jobs:\n  - job: Test1\n    pool:\n      vmImage: vs2017-win2016\n    steps:\n    - script: echo "Hello Test1"\n    - script: echo  ${{ parameters.test }}\n    - script: echo $(dev1)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n


max*_*x_i 10

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

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

  • 1个共享管道yaml
  • 2 个特定于环境的 yaml,每个环境一个
  • 2 个在 Azure DevOps 中创建的管道,每个环境一个;每个管道引用相应的 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:
      ...
Run Code Online (Sandbox Code Playgroud)

pipeline-dev.yml

# Trigger builds on commits to branches
trigger:
  - dev

# Do not trigger builds on PRs
pr: none

extends:
  template: pipeline-shared.yml
Run Code Online (Sandbox Code Playgroud)

pipeline-prod.yml

trigger:
  - master

pr: none

extends:
  template: pipeline-shared.yml
Run Code Online (Sandbox Code Playgroud)

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