我有一个需要同时满足以下条件的场景:
运行时参数,以便可以从UI手动触发管道,触发该管道的用户可以从一组预定义的选项(在YAML中定义)中进行选择
< / li>变量,以便可以通过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脚本的输出消息中。
关于变量,我在此处定义了一个称为“图像”的图片(注意,该值为空):
现在的想法是从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) ]
这些都不起作用,所以我怀疑这可能根本不可行。
我目前正在考虑一种解决方法,即创建两个不同的管道,以便可以独立调用它们,但是鉴于我正在使用许多模板,这对我来说很容易实现,我找不到正确的进行方式,因此我愿意接受任何建议。
答案 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
以使变量在队列时间可设置。
更新:
您可以尝试将变量传递给模板的参数,以使模板的参数动态化。请检查以下简单的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}}"