【问题标题】:Tell if a variable exists in template with azure pipelines使用 azure 管道判断模板中是否存在变量
【发布时间】:2020-10-09 20:13:15
【问题描述】:

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

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)

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

【问题讨论】:

    标签: azure-pipelines


    【解决方案1】:

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

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

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

    根据我的测试,当我使用 If 表达式 时,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'], '')
    

    Azure 管道.yml

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

    此示例使用Condition ExpressionLogging command

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

    var-a: null/non-existence -> 运行任务 2 -> namespaceName: var-b

    var-a: 存在 -> 运行任务 1 -> namespaceName: var-a

    【讨论】:

      【解决方案2】:

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

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

      $[ <expression> ] 语法在运行时进行评估。变量将被初始化,但是您不能直接使用if 语法直接有条件地输出不同的变量值。但是,您可以使用切刀黑客,正如 Simon Alling 在this 帖子中的回答所记录的那样。

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

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

      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)
      

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

      some value
      subdirectory-not-set

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

      some value
      subdirectory-set

      【讨论】:

        猜你喜欢
        • 2016-06-18
        • 2018-12-28
        • 2020-08-20
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        相关资源
        最近更新 更多