在 Azure YAML 中检查空对象类型参数

Posted

技术标签:

【中文标题】在 Azure YAML 中检查空对象类型参数【英文标题】:Checking for null object type parameter in Azure YAML 【发布时间】:2020-05-22 17:19:27 【问题描述】:

我正在设置构建模板,但无法确定可选对象类型参数的语法。在我的管道中,我这样调用模板:

stages:
- template: aspnet-core.yml@templates
  parameters:
    database:
      name: 'SomeDatabase'
      server: 'SomeServer'

我在模板中有这样定义的参数:

parameters:
  database: null

我想在模板中进行这样的检查,以便有条件地运行任务:

- $ if ne('$ parameters.database ', null) :

但是,它不喜欢if语句中的关键字null,我不知道如何表示它没有传入的事实。我这里有什么选择?

【问题讨论】:

您是否尝试使用空字符串而不是null 是的,但发生的事情是我在运行管道时遇到错误:无法从对象转换为字符串。值:对象 【参考方案1】:

您可以使用下面的表达式来检查参数是否为空。下面的例子

- $if parameters.database:

下面是我的测试模板和 azure-pipeline.yml。

脚本任务只有在database 被评估为真时才会被执行。我测试并发现database: ""database: 将被评估为假。如果定义为database: ,则判断为真。

模板:deploy-jobs.yaml

parameters:
  database: 

stages:
- stage: buildstage
  pool: Hosted VS2017

  jobs:
  - job: secure_buildjob
    steps:
    - $if parameters.database:
      - script: echo "will run if database is not empty"
        displayName: 'Base: Pre-build'

天蓝色管道.yml:

stages:
- template: deploy-jobs.yaml
  parameters:
    database: ""

要在数据库为空的情况下执行一些任务,您可以使用以下语句:

 steps:
    - $if not(parameters.database):
      - script: echo "will run if database is empty"
        displayName: 'Base: Pre-build'

【讨论】:

这在语法上确实有效,但它也要求调用者传入一个值为“”的参数。我开始觉得 YAML 没有办法知道没有使用这种语法传递参数。我确实发现我可以使用条件跳过任务。我不得不检查 database.name 属性,如果没有奇怪地传递,它不会引发空引用异常。条件:and(succeeded(), ne('$ parameters.database.name ', '')) 由于检查条件中的 database.name 属性有效,您可以发布此解决方案作为答案。【参考方案2】:

它看起来像 if 语法的替代方法是使用 conditions 代替。这允许您跳过该步骤。虽然我必须检查对象的属性以查看它是否真的通过了,所以不是超级理想。

condition: and(succeeded(), ne('$ parameters.database.name ', ''))

【讨论】:

看起来参数扩展在模板表达式中无法正常工作。有一个GitHub issue 在我写这篇文章的时候它仍然是开放的。有一个关于该问题的建议使用条件作为解决方法,类似于您在答案中提出的内容。 需要注意的一点 - 可能是赞成/反对 - 使用 - $if parameters.database:语法优于条件语法是带有“if”的 - 如果条件不计算为是的,甚至没有渲染步骤。这可能仅适用于编译时参数而不适用于运行时...在某些情况下,“if”语法可以通过删除未运行的部分来使构建输出看起来更清晰。使用条件,您仍然会看到它“被跳过”。【参考方案3】:

我找到了另一种解决方案,您可以使用传入对象的长度。 如果对象为空,则长度为0

parameters:
  - name: myObject
    type: object
    default: []
  
steps:
  - $ if not(eq(length(parameters.myObject), 0)) :
      - script: |
          echo "hello world"
        displayName: "next task"

【讨论】:

以上是关于在 Azure YAML 中检查空对象类型参数的主要内容,如果未能解决你的问题,请参考以下文章

空对象设计模式与空对象检查

Golang - 用于解析 yaml 文件并检查对象的单元测试

Azure管道构建阶段验证

Terraform - 将类型对象作为参数传递给 Azure 模板部署

软件构造课程提纲

Java 8可选在分层对象中执行空检查