Azure DevOps YML管道中的if else条件与变量

3
我正在尝试在Azure DevOps的yml管道中使用变量组的if else条件。 我正在尝试按照最新的Azure Devops yaml管道构建实现它
以下是我的场景中if else条件的示例代码。test是my-global变量组内的一个变量。
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语句中我们看不到filename的任何值,即它为空,意味着以上if else条件都未被执行,但是当我使用以下条件测试if else条件时。
  - name: fileName
    ${{ if eq('true', 'true') }}:
       value: 'product.js'


文件名没有输出正确的值,即为 "product.js"。因此,我的结论是我无法正确地从变量组中引用变量。因此,任何建议都将是有帮助和感激的。 谢谢!

https://dev59.com/22kMtIcB2Jgan1znYp6n#69379088 - jessehouwing
这个链接不正确,我正在尝试做其他的事情。你不能仅仅给我一个链接然后关闭我的问题,那是不公平的。 - lavoizer
好的,重新打开了,但我仍然认为你在问同样的问题。你想使用一个条件来覆盖一个使用另一个变量声明的 YAML 变量的值。这是行不通的,因为在扩展 YAML 模板时,我们自己的变量还不可用。所以你需要在运行时解决这个问题。或者我完全误解了你的问题。 - jessehouwing
1
基本上,在模板扩展时,变量variables ['test']未声明,因为变量组在变量块扩展之前不会完全加载。 - jessehouwing
我会 echo @jessehouwing 对于变量引用的评论 - 如果变量在当前文件的变量部分中静态定义,您应该能够引用它 - 组变量引用此时不应在您的文件中可用。 - WaitingForGuacamole
@WaitingForGuacamole - 我认为if else语句不能与变量一起使用,但是如果你有任何可以使用变量的if else代码示例,那将会很有趣。请分享。 - lavoizer
3个回答

5
我使用了一些不太正规的方法来达到目标,但我同意,除非 Azure DevOps YAML pipeline 支持三元运算符,否则使用参数会是更好的方式。
问题在于 `${{ if condition }}:` 是编译时表达式,因此变量组中的变量不可用。我能够使用运行时表达式 `$[]`。
参考链接:https://learn.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops 我的pipeline:
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上获取。


你能重新测试一下你的工作场景吗?因为它会将测试的值设置为value1,而不受if else条件的影响。 - lavoizer
重新测试,缩进与您的一样。 代码 ${{如果eq(variables['test'],'False')}}: 值:'value1' ${{否则}}: 值:'value2'输出: value2 - Tejas Nagchandi
1
@lavoizer:我现在明白了问题,没有很好的解决方案,但通过一些变通方法达到了目标。我已更新解决方案,更多详细信息可在 https://github.com/tejas-nagchandi/azure-devops-conditional-variable 上找到。 - Tejas Nagchandi
@lavoizer:这里提供了解释 https://github.com/tejas-nagchandi/azure-devops-conditional-variable#explaination-of-the-condition-used - Tejas Nagchandi
1
更新 GitHub 仓库路径 https://github.com/tejas-nagchandi/stackoverflowissues/tree/main/69652609。 - Tejas Nagchandi
显示剩余2条评论

4

很遗憾,在Azure DevOps Pipelines中没有三元运算符。考虑到https://github.com/microsoft/azure-pipelines-yaml/issues/256https://github.com/microsoft/azure-pipelines-yaml/issues/278的情况,似乎不太可能实现。因此,目前唯一的选择是:

  • 条件插入:它可以使用参数,并且根据文档应该可以使用变量(但难以正确使用),
  • 或者在这个Stack Overflow问题中找到的各种技巧。

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 提供的方案相似,但我认为它更好一些,因为语法看起来更接近三元运算符的语法。


2

经过详细调查,我意识到在 Az Devop yaml 流水线中,if else 无法使用变量,只能使用参数。然而,@Tejas Nagchandi 发布的解决方案是一种变通方法,可以使用替换命令实现 if else 设置变量值的相同逻辑。向 TN 致敬。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接