【问题标题】:Setting and checking null in Azure Pipeline YAML在 Azure Pipeline YAML 中设置和检查 null
【发布时间】:2022-02-04 14:05:08
【问题描述】:

我正在尝试向我们的 YAML 管道之一添加一个选项,该选项允许用户设置项目的哪些部分将部署和不部署。为此,我根据用户的复选框选择设置变量,如下所示:

 variables:
    - template:         variables.yml 
    - name: deliverStageOne
      ${{ if eq(parameters.DeliverStageOne, 'False') }}:
        value: ''
      ${{ if eq(parameters.DeliverStageOne, 'True') }}:
        value: 'STAGE_ONE'

该过程的下一部分将所有这些变量作为一个名为 dbNames 的数组,并使用 for 循环使用相同的代码块处理每个变量:

steps:
  - ${{ each dbName in parameters.dbNames }}: 
    - ${{ if ne(dbName, '') }}:
      - powershell:               [powershell command]

我遇到的麻烦是上述循环中的条件似乎永远不会起作用 - 它总是评估为 True。

我尝试将值设置为 x 并使用

- ${{ if ne(dbName, 'x') }}:

即使我用 echo 检查了 dbName 的值并确认它是 x,它的计算结果也是 true。

所以我认为这与 YAML 处理字符串的方式有关,而且由于 '' 无论如何都是笨拙的语法,我认为将其设置为 null 会更好更清晰:

      ${{ if eq(parameters.DeliverStageOne, 'False') }}:
        value: null

在 ne 表达式中使用 this 会导致编译错误:

- ${{ if ne(dbName, null) }}:

阅读文档表明我可以这样做:

- ${{ if dbName }}:

但是,虽然上面的代码编译了,但它继续将 null 视为字符串“null”并落入下面的 powershell 步骤。

我该如何设置,以便 YAML 识别出我创建了一个空值并成功检查它?

【问题讨论】:

    标签: null yaml azure-pipelines azure-pipelines-release-pipeline azure-pipelines-yaml


    【解决方案1】:

    对于参数,支持各种数据类型。见link

    但对于变量,它们总是字符串数据类型,带引号或不带引号。换句话说,'' 被评估为空字符串,但不是 null。见link

    由于在 Azure Pipelines 中所有变量都被视为字符串,因此空字符串在此管道中等同于 null。

    请尝试使用此语法来测试您的情况下变量是否为空字符串:

    - ${{ if eq(length(dbName), 0) }}:
    

    【讨论】:

    • 感谢您的建议,但由于我无法理解的原因,即使字符串为空,长度也不会返回零。例如脚本:echo 'dbName ${{ dbName }}' 后跟脚本:echo 'length ${{ length(dbName) }}' return "dbName" 和 "length 18"。任何想法为什么?
    • 您能否为您的管道中的dbNames 列表提供一个示例?它是对象类型数组吗?它的默认值是[]吗?或者它是一个地图对象数组,其中数组中的一个地图对象可以像- db1: thisDB?对于地图对象,您必须使用dbName.keydbName.value 来获取键/值。此外,参数在运行时是只读的。
    猜你喜欢
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2021-12-19
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多