使用azure pipeline判断模板中是否存在变量

scp*_*ntm 15 azure-pipelines

我正在尝试找出一种方法来执行以下操作

variables:
  ${{ if eq(variables['var-a'], exists_and_is_set) }}:
    namespaceName: $(var-a)
  ${{ if ne(variables['var-a'], exists_and_is_set) }}:
    namespaceName: $(var-b)
Run Code Online (Sandbox Code Playgroud)

基本上,如果变量 A 存在并且有一个值 != null != '' 则使用它,否则使用另一个变量。这里的脚本非常简单,我找不到方法来做到这一点。原因是我正在进行更改,在使用此模板的数百个 CICD 管道中,只有 10 个左右会使用var-a,因此我试图找到一种方法来实现逻辑,而不必去更新数百个管道包含他们不会使用的东西。

Kev*_*SFT 17

您可以尝试使用''来表示不存在或没有值。

例如:eq(variables['var-a'], '')

如果您使用If 表达式,它可能无法实现您想要的功能。

根据我的测试,当我使用If Expression时,变量的值var-a将始终保持不存在或为空,即使它已被创建。

所以我找到了另一种方法来设置变量,它可以按预期工作:

这是我的例子:

模板:build.yml

steps:

- script: echo "##vso[task.setvariable variable=namespaceName;]$(var-a)"
  condition: ne(variables['var-a'], '')
- script: echo "##vso[task.setvariable variable=namespaceName;]$(var-b)"
  condition: eq(variables['var-a'], '')
Run Code Online (Sandbox Code Playgroud)

Azure pipelines.yml

....
steps:
- template: build.yml
- script: |
    echo $(namespaceName)
  displayName: 'Run a multi-line script'
Run Code Online (Sandbox Code Playgroud)

该示例使用条件表达式日志记录命令

在这种情况下,它将根据变量的值选择要运行的任务。在任务中,它将使用logging命令来设置变量。

var-a: null/不存在 -> 运行任务 2 -> 命名空间名称: var-b

var-a: 存在 -> 运行任务 1 -> 命名空间名称: var-a


cod*_*urn 8

Kevin Lu 是正确的,但这里有一些额外的背景来解释它为什么会这样工作。

${{ <expression> }}仅在模板编译时评估语法。这意味着任何用户变量尚未初始化。如果您尝试检查它们的值,它将始终返回空值。虽然${{ <expression> }}语法很方便有条件地输出模板行以进行处理,但用户变量值不会被设置限制您可以使用if.

语法$[ <expression> ]在运行时评估。变量将被初始化,但是您不能直接使用if语法有条件地直接输出不同的变量值。不过,您可以使用切肉刀黑客,如西蒙·阿林(Simon Alling)在这篇文章中的回答所述。

参考:https://learn.microsoft.com/en-us/azure/devops/pipelines/process/expressions

这个非常简单的 YAML Pipeline 说明了这个概念:

stages:
- stage: TestVarsCompile
  variables:
    - name: state_prefix
      # $subdirectory is not defined
      ${{ if eq(variables['subdirectory'], '') }}:
       value: 'subdirectory-not-set'

      # $subdirectory is defined 
      ${{ if ne(variables['subdirectory'], '') }}: 
       value: 'subdirectory-set'

  jobs:
   - job:
     steps:
     - checkout: none
     - script: |
        echo $(subdirectory)
        echo $(state_prefix)

- stage: TestVarsRuntime
  variables:
   state_prefix: $[
        replace(
          replace(
            eq(variables['subdirectory'], ''),
            True,
            'sub-directory-not-set'
          ),
          False,
          'sub-directory-set'
        )
      ]

  jobs:
   - job:
     steps:
     - checkout: none
     - script: |
        echo $(subdirectory)
        echo $(state_prefix)
Run Code Online (Sandbox Code Playgroud)

无论变量是否设置,阶段TestVarsCompile输出始终返回以下输出:subdirectory

some value
subdirectory-not-set

如果设置了变量,阶段TestVarsRuntime输出将返回以下内容:subdirectory

some value
subdirectory-set