使用变量扩展按环境加载模板变量文件

时间:2019-09-17 09:28:58

标签: azure-devops azure-pipelines

我正在尝试在Azure DevOps中创建多个管道,但我想重复使用同一管道YAML文件,并从单独的模板变量文件加载每个环境的差异。

为此,我创建了两个变量文件,它们与管道定义位于相同的文件夹中:

# vars.dev.yml
variables:
  - name: EnvironmentName
    value: Development

# vars.prd.yml
variables:
  - name: EnvironmentName
    value: Production

管道的定义如下:

trigger: none
pr: none

variables:
  - name: EnvironmentCode
    value: dev
  - name: EnvironmentFileName
    value: vars.$('EnvironmentCode').yml

stages:
  - stage: LoadVariablesPerEnvironment
    displayName: Load Variables Per Environment
    variables:
      - template: $(EnvironmentFileName)
    jobs:
      - job: ShowcaseLoadedVariables
        steps:
          - pwsh: Write-Host "Variables have been loaded for the '$ENV:ENVIRONMENTNAME' environment"
            displayName: Output Environment Variables

使用Azure DevOps UI导入管道后,我可以转到每个管道的设置并将“环境代码”变量设置为所需的任何环境代码:

azure pipeline variables settings

但是,无论我填写变量值的代码如何,当我尝试运行管道时总是会遇到相同的错误:

azure pipeline run error

所以这里的问题是:是否支持这种变量扩展,或者我应该使用其他方式来完成此操作?

谢谢!

编辑

我能够使用另一种方法扩展变量。管道的新版本是这样的:

variables:
  - name: EnvironmentCode
    value: dev
  - name: EnvironmentFileName
    value: vars.${{ variables.EnvironmentCode }}.yml

stages:
  - stage: LoadVariablesPerEnvironment
    displayName: Load Variables Per Environment
    variables:
      - template: ${{ variables.EnvironmentFileName }}
    jobs:
      - job: ShowcaseLoadedVariables
        steps:
          - pwsh: Write-Host "Variables have been loaded for the '$ENV:ENVIRONMENTNAME' environment"
            displayName: Output Environment Variables

但是,仍然存在加载不同文件的问题。我进行了不同的尝试并验证了以下内容:

  • 如果在运行时使用UI提供其他环境代码 管道,它假定的值仍然是 管道定义;

  • 如果从管道定义中删除 默认值或变量完全是表达式 ${{variables.EnvironmentCode}}将返回一个空字符串 假设文件名是vars..yml,该文件名不存在。

1 个答案:

答案 0 :(得分:0)

  

不支持这种变量扩展吗?   我应该使用不同的方式来完成此任务?

如果我没有误会,首先,您想使用$()来获取使用UI定义但失败的变量。但是稍后,${{ }}可以为您提供变量EnvironmentCode的值。

实际上,当您更改为使用${{ }}时,它仅访问您在YAML文件中预定义的变量,而不是您使用UI定义的变量。只需查看此文档:Variable templates

对于使用UI定义的变量,可以使用$()格式获取和使用(注意:${{ }}是获取在YAML文件中定义的变量的格式)。但是,还有一些需要注意的事情是您在UI中定义的变量,只有在构建开始运行后才能获取/访问它,因为使用UI定义的变量仅在开始编译构建后才存在于环境中。一句话,它们就是 agent-scope变量。这就是为什么它使用的值仍然是管道定义而不是UI上的值。

  

如果从管道定义中删除默认值或   $ {{{variables.EnvironmentCode}}表达式完全可变   返回空字符串,假设文件名是vars..yml,其中   不存在。

正如我之前所定义的文档,${{}}是一种用于获取YAML文件中定义的变量值的格式,而不是使用UI定义的格式。


在工作步骤中,可以使用$()格式来获取/访问UI中定义的变量或YAML文件中定义的变量。不过,对于YAML文件中定义的变量,也可以使用${{variables.xxxx}}来获取。但是此时,如果YAML文件中定义的变量名称与UI定义的变量名称相同,则服务器只能获取YAML文件中定义的变量名称。