Azure Devops yml 管道 if else 条件变量
Azure Devops yml pipeline if else condition with variables
我正在尝试在 Azure Devops yml 管道中使用 if else 条件和变量组。 I am trying to implement it as per latest Azure Devops yaml pipeline build.
以下是我的场景中 if else 条件的示例代码。 test 是我的全局变量组中的一个变量。
variables:
- group: my-global
- name: fileName
${{ if eq(variables['test'], 'true') }}:
value: 'product.js'
${{ elseif eq(variables['test'], false) }}:
value: 'productCost.js'
jobs:
- job:
steps:
- bash:
echo test variable value $(fileName)
执行上述代码时,在 echo 语句中我们没有看到文件名的任何值,即它为空,这意味着执行了上述 if else 条件的 none,但是当我测试 if else 符合以下条件。
- name: fileName
${{ if eq('true', 'true') }}:
value: 'product.js'
文件名确实回显了正确的值,即 product.js。所以我的结论是我无法正确引用变量组中的变量。所以任何建议都会有所帮助和赞赏。
谢谢!
我能够使用一些肮脏的解决方法实现目标,但我同意使用参数会更好,除非三元运算符可用于 Azure DevOps YAML 管道。
问题是${{ if condition }}:
是编译时表达式,因此变量组下的变量不可用
我能够使用运行时表达式 $[<expression>]
参考:https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops
我的管道:
trigger:
- none
variables:
- group: Temp-group-for-testing
- name: fileName
value: $[replace(replace('True',eq(variables['test'], 'True'), 'value1'),'True','value2')]
stages:
- stage: test
jobs:
- job: testvar
continueOnError: false
steps:
- bash: echo $(fileName)
displayName: "echo variable"
结果可在 github
获得
经过详细调查后,我意识到 if else 不适用于 Az Devop yaml 管道中的变量,它仅适用于参数。然而,@Tejas Nagchandi 发布的解决方案是一种变通方法,并且可能能够完成与 if else 使用替换命令设置变量值相同的逻辑。向 TN 致敬。
遗憾的是,Azure DevOps Pipelines 中没有三元运算符。考虑到 https://github.com/microsoft/azure-pipelines-yaml/issues/256 and https://github.com/microsoft/azure-pipelines-yaml/issues/278 的状态,这似乎不太可能。所以目前唯一的选择是:
- conditional insertion : 它与参数一起工作,并且根据文档应该与变量一起工作(但很难正确使用),
- 或者您可以在这个 Stack Overflow 问题中找到的技巧。
另一个 work-around 已由 Simon Alling 在 GitHub (https://github.com/microsoft/azure-pipelines-yaml/issues/256#issuecomment-1077684972) 上发布:
format(
replace(replace(condition, True, '{0}'), False, '{1}'),
valueIfTrue,
valueIfFalse
)
它类似于 Tejas Nagchandi 提供的解决方案,但我发现它更好一些,因为语法看起来更接近于存在三元运算符时的语法。
我正在尝试在 Azure Devops yml 管道中使用 if else 条件和变量组。 I am trying to implement it as per latest Azure Devops yaml pipeline build.
以下是我的场景中 if else 条件的示例代码。 test 是我的全局变量组中的一个变量。
variables:
- group: my-global
- name: fileName
${{ if eq(variables['test'], 'true') }}:
value: 'product.js'
${{ elseif eq(variables['test'], false) }}:
value: 'productCost.js'
jobs:
- job:
steps:
- bash:
echo test variable value $(fileName)
执行上述代码时,在 echo 语句中我们没有看到文件名的任何值,即它为空,这意味着执行了上述 if else 条件的 none,但是当我测试 if else 符合以下条件。
- name: fileName
${{ if eq('true', 'true') }}:
value: 'product.js'
文件名确实回显了正确的值,即 product.js。所以我的结论是我无法正确引用变量组中的变量。所以任何建议都会有所帮助和赞赏。 谢谢!
我能够使用一些肮脏的解决方法实现目标,但我同意使用参数会更好,除非三元运算符可用于 Azure DevOps YAML 管道。
问题是${{ if condition }}:
是编译时表达式,因此变量组下的变量不可用
我能够使用运行时表达式 $[<expression>]
参考:https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops
我的管道:
trigger:
- none
variables:
- group: Temp-group-for-testing
- name: fileName
value: $[replace(replace('True',eq(variables['test'], 'True'), 'value1'),'True','value2')]
stages:
- stage: test
jobs:
- job: testvar
continueOnError: false
steps:
- bash: echo $(fileName)
displayName: "echo variable"
结果可在 github
获得经过详细调查后,我意识到 if else 不适用于 Az Devop yaml 管道中的变量,它仅适用于参数。然而,@Tejas Nagchandi 发布的解决方案是一种变通方法,并且可能能够完成与 if else 使用替换命令设置变量值相同的逻辑。向 TN 致敬。
遗憾的是,Azure DevOps Pipelines 中没有三元运算符。考虑到 https://github.com/microsoft/azure-pipelines-yaml/issues/256 and https://github.com/microsoft/azure-pipelines-yaml/issues/278 的状态,这似乎不太可能。所以目前唯一的选择是:
- conditional insertion : 它与参数一起工作,并且根据文档应该与变量一起工作(但很难正确使用),
- 或者您可以在这个 Stack Overflow 问题中找到的技巧。
另一个 work-around 已由 Simon Alling 在 GitHub (https://github.com/microsoft/azure-pipelines-yaml/issues/256#issuecomment-1077684972) 上发布:
format(
replace(replace(condition, True, '{0}'), False, '{1}'),
valueIfTrue,
valueIfFalse
)
它类似于 Tejas Nagchandi 提供的解决方案,但我发现它更好一些,因为语法看起来更接近于存在三元运算符时的语法。