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

Azure devops 使用变量扩展按环境加载模板变量文件,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,我试图在Azure DevOps中创建多个管道,但我希望重用相同的管道YAML文件,每个环境的差异都是从单独的模板变量文件加载的 为此,我创建了两个变量文件,它们与管道定义位于同一文件夹中: # vars.dev.yml variables: - name: EnvironmentName value: Development # vars.prd.yml variables: - name: EnvironmentName value: Production 管道的

我试图在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导入管道后,我可以转到每个管道的设置,并将环境代码变量设置为所需的任何环境代码:

但是,当我尝试运行管道时,无论我在变量值中填充的代码是什么,我总是会遇到相同的错误:

所以这里的问题是:这种变量扩展是不受支持的,还是有一种不同的方法可以实现这一点

谢谢

编辑

我可以用另一种方法展开变量。管道的新版本如下:

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
然而,仍然存在加载不同文件的问题。我做了不同的尝试,并验证了以下内容:

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
  • 如果在运行时使用UI提供不同的环境代码 管道,它假定的值仍然是 管道定义

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

是否不支持这种变量扩展,或者是否存在 我应该用不同的方式来完成这个任务

如果我没有误解的话,首先,您希望使用
$()
获取您使用UI定义的变量,但是失败了。但是稍后,
${{}
可以为您提供变量
环境代码的值

事实上,当您更改为使用
${{}
时,它只是访问您在YAML文件中预定义的变量,而不是使用UI定义的变量。请看这个文件:

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

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

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



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

是否可以使用条件逻辑来确定模板引用的EnvironmentFileName?使用静态yml变量值不允许这样做。在运行之前,您必须在编译时更改环境值。