首页 > 解决方案 > 嵌套 yaml 管道 Azure DevOps 中的默认参数

问题描述

我有多个可重复使用的 yaml 模板来使用 Azure DevOps 构建我的项目。当我不想覆盖它时,我想让默认模板值。我遇到的问题是当我嵌套多个模板时,它没有按预期工作,这是我的问题的一个示例:

parameters:
  foo: 'data'

steps:
- task: Bash@3
  inputs: 
    targetType: 'inline'
    script: echo ${{ parameters.foo }}

在 job_template.yml 我这样称呼这个 task_template1.yml:

parameters:
  fooTemplate: 'data'

jobs:
- job:
  steps:
    - template: task_template1.yml
      parameters:
        ${{ if variables[parameters.fooTemplate] }}:
          foo: ${{ parameters.fooTemplate }}

然后是我的全局模板:

stages:

- stage: Build
  jobs:
  - template: job_template.yml
    parameters:
      fooTemplate: 'hello'

所以在这种情况下,默认情况下,我希望我的变量fooTemplate将我的变量的值设置为,因为我指定了它。但事实并非如此,因为它看起来像是在构建开始之前评估的,所以设置为而不是. 相反,如果我想保留( ) 的默认值,我只想不这样指定它:footask_template1.ymlhello${{ if variables[parameters.fooTemplate] }}:foodatahellofooTemplatedata

stages:

- stage: Build
  jobs:
  - template: job_template.yml

它看起来像嵌套模板的问题。我该怎么做才能符合这两条规则?如果需要,请随时问我更多细节。

编辑:

我总是收到这样的信息:'foo has no value: undefined'

我有的其他情况,而不是一个简单的参数:

parameters:
  foo:'data'
  foo1:'data1'

steps:
- task: Bash@3
  inputs: 
    targetType: 'inline'
    script: echo ${{ parameters.foo }}

所以对于我的工作:

parameters:
  fooTemplate:
   foo:'data'
   foo1:'data1'

jobs:
- job:
  steps:
    - template: task_template1.yml
      parameters:
        ${{ if ne(parameters.fooTemplate.foo, ' ') }}:
          foo: ${{ parameters.fooTemplate.foo }}
        ${{ if ne(parameters.fooTemplate.foo1, ' ') }}:
          foo: ${{ parameters.fooTemplate.foo1 }}

然后同样的情况,如果我没有指定foofoo1值,我有未定义的错误,而不是采用默认值:

stages:

- stage: Build
  jobs:
  - template: job_template.yml

标签: azure-devopsyaml

解决方案


我认为您的语法有问题:

parameters:
        ${{ if variables[parameters.fooTemplate] }}:
          foo: ${{ parameters.fooTemplate }}

试试这种方式(根据this):

parameters:
        ${{ if eq(parameters.fooTemplate, true) }}:
          foo: ${{ parameters.fooTemplate }}

它对我有用。

笔记:

你可以有这样的东西:

parameters:
  fooTemplate: 'data'

jobs:
- job:
  steps:
    - template: task_template1.yml
      parameters:
        ${{ if ne(parameters.fooTemplate, ' ') }}:
          foo: ${{ parameters.fooTemplate }}

现在,如果您在 中指定 'hello' stage_build.ymltask_template1.yml将输出hello。如果你没有stage_build.yml像这样指定参数:

pool:
  vmImage: 'ubuntu-latest'

jobs:
- template: job_template.yml

它将输出默认值data这是有关ExpressionsConditions的更多详细信息。


推荐阅读