Azure devops 使用变量扩展按环境加载模板变量文件
我试图在Azure DevOps中创建多个管道,但我希望重用相同的管道YAML文件,每个环境的差异都是从单独的模板变量文件加载的 为此,我创建了两个变量文件,它们与管道定义位于同一文件夹中: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 管道的
# 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变量值不允许这样做。在运行之前,您必须在编译时更改环境值。