在 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 文件并检查对象的单元测试