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 提供的解决方案,但我发现它更好一些,因为语法看起来更接近于存在三元运算符时的语法。