如何调用同时具有变量和运行时参数的YAML管道?

时间:2020-05-02 09:16:32

标签: azure-devops yaml azure-pipelines

我有一个需要同时满足以下条件的场景:

  1. 运行时参数,以便可以从UI手动触发管道,触发该管道的用户可以从一组预定义的选项(在YAML中定义)中进行选择

    < / li>
  2. 变量,以便可以通过REST API调用管道

关于运行时参数,我能够创建以下示例管道:

parameters:
- name: image
  displayName: Pool Image
  type: string
  default: ubuntu-latest
  values:
  - windows-latest
  - ubuntu-latest

trigger: none

stages:
- stage: A
  jobs:
  - job: A
    steps:
    - pwsh: |
        echo "This should be triggering against image: $MY_IMAGE_NAME"
      env:
        MY_IMAGE_NAME: ${{ parameters.image }}

运行它时,我可以看到一个下拉列表,从中可以选择图像名称,它反映在PowerShell脚本的输出消息中。

关于变量,我在此处定义了一个称为“图像”的图片(注意,该值为空):

pipeline variable

现在的想法是从REST API调用管道,并将图像名称替换为来自变量的值:

{
    "definition": {
        "id": 1
    },
    "sourceBranch": "master",
    "parameters":  "{\"image\": \"windows-latest\" }"
}

为了使步骤打印我在此处传递的值,我需要以某种方式更正环境变量。我认为写这样的东西就足够了:

env:
  MY_IMAGE_NAME: ${{ coalesce(variables.image, parameters.image) }}

那是因为我想将优先级赋予变量,然后赋予参数,以便在未指定任何优先级的情况下,我始终具有管道可以使用的默认值。

但是,这种方法不起作用,可能是因为我们正在处理变量的不同扩展时间,但是我真的不知道我应该写什么(当然,如果有可行的选择)。

我也尝试过的是:

env:
  MY_IMAGE_NAME: ${{ coalesce($(image), parameters.image) }}
  MY_IMAGE_NAME: ${{ coalesce('$(image)', parameters.image) }}
  MY_IMAGE_NAME: $[ coalesce(variables.image, parameters.image) ]
  MY_IMAGE_NAME: $[ coalesce($(image), parameters.image) ]

这些都不起作用,所以我怀疑这可能根本不可行。

我目前正在考虑一种解决方法,即创建两个不同的管道,以便可以独立调用它们,但是鉴于我正在使用许多模板,这对我来说很容易实现,我找不到正确的进行方式,因此我愿意接受任何建议。

1 个答案:

答案 0 :(得分:1)

我进行了测试,发现您可能需要定义一个变量并将其值分配给它(例如Mimage: ${{parameters.image}})。并定义另一个变量(例如Vimage)并为其分配$[coalesce(variables.image, variables.Vimage)]。然后,在powershell任务的env字段中参考$(Vimage)。请在下面查看yaml。

parameters:
- name: image
  displayName: Pool Image
  type: string
  default: ubuntu-latest
  values:
  - windows-latest
  - ubuntu-latest

trigger: none

stages:

- stage: A
  jobs:
  - job: A
    variables:
      Mimage: ${{parameters.image}}
      Vimage: $[coalesce(variables.image, variables.Mimage)]

    steps:
    - pwsh: |
        echo "This should be triggering against image: $env:MY_IMAGE_NAME"
      env:
        MY_IMAGE_NAME: $(Vimage)

powershell任务的Env字段通常用于mapping secret variables。您可以在powershell脚本$(Vimage)中直接引用echo "This should be triggering against image: $(Vimage)

注意:要通过具有提供的参数的REST API来对构建进行排队,您需要检查Let users override this value when running this pipeline以使变量在队列时间可设置。

enter image description here

更新:

您可以尝试将变量传递给模板的参数,以使模板的参数动态化。请检查以下简单的Yaml。

 jobs:
  - template: template.yaml
    parameters:
      MTimage: ${{parameters.image}}
      VTimage: $(Vimage)

template.yaml:

parameters:
  MTimage: 
  VTimage:  

jobs:
- job: buildjob
  steps:
  - powershell: |
      echo "${{parameters.VTimage}}"
      echo "${{parameters.MTimage}}"