我正在尝试在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
但是,仍然存在加载不同文件的问题。我进行了不同的尝试并验证了以下内容:
如果在运行时使用UI提供其他环境代码 管道,它假定的值仍然是 管道定义;
如果从管道定义中删除
默认值或变量完全是表达式
${{variables.EnvironmentCode}}
将返回一个空字符串
假设文件名是vars..yml
,该文件名不存在。
答案 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文件中定义的变量名称。