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

Fra*_*man 7 yaml azure-devops azure-pipelines

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

stages:
- template: aspnet-core.yml@templates
  parameters:
    database:
      name: 'SomeDatabase'
      server: 'SomeServer'
Run Code Online (Sandbox Code Playgroud)

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

parameters:
  database: null
Run Code Online (Sandbox Code Playgroud)

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

- ${{ if ne('${{ parameters.database }}', null) }}:
Run Code Online (Sandbox Code Playgroud)

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

Lev*_*SFT 12

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

- ${{if parameters.database}}:
Run Code Online (Sandbox Code Playgroud)

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

脚本任务只会在database评估为 true时执行。我测试,发现database: ""database:将evalutated为false。如果它被定义为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'
Run Code Online (Sandbox Code Playgroud)

azure-pipeline.yml:

stages:
- template: deploy-jobs.yaml
  parameters:
    database: ""
Run Code Online (Sandbox Code Playgroud)

要在数据库为空时执行某些任务,您可以使用以下语句:

 steps:
    - ${{if not(parameters.database)}}:
      - script: echo "will run if database is empty"
        displayName: 'Base: Pre-build'
Run Code Online (Sandbox Code Playgroud)

  • 这在语法上确实有效,但它还要求调用者传入一个值为“”的参数。我开始觉得 YAML 无法知道是否使用此语法传递了参数。我确实发现我可以使用条件跳过任务。不过,我必须检查database.name属性,如果没有奇怪地传递,它不会引发空引用异常。条件: and(succeeded(), ne('${{parameters.database.name }}', '')) (2认同)

Fra*_*man 11

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

condition: and(succeeded(), ne('${{ parameters.database.name }}', ''))
Run Code Online (Sandbox Code Playgroud)


小智 8

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

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