提供具有默认值的管道队列时间变量

ssc*_*eck 5 azure-devops azure-pipelines

在 Azure Pipelines 中,您可以在排队时设置管道变量。您可以像使用管道本身定义的变量一样使用此类变量。

例子:

# pipeline.yml
steps:
- checkout: none
- template: steps/some.yml
  parameters:
    name: $(queueTimeVar)

# steps/some.yml
parameters:
  name: 'World'

steps:
  - bash: |
      echo "Hello ${{ parameters.name }}!"

Run Code Online (Sandbox Code Playgroud)

但是,如果未明确设置该变量,则管道会将此表达式评估为字符串本身。步骤模板将使用name: '$(queueTimeVar)'和 print调用Hello $(queueTimeVar)!

如果未设置变量,如何设置默认值?


我尝试将默认值添加为变量,但没有按预期工作。

variables:
  queueTimeVar: MyDefault
Run Code Online (Sandbox Code Playgroud)

之后,排队时间变量没有影响。变量始终是 YAML 值。

作为解决方法,我必须为每个使用该值的任务添加默认处理。

# bash task
value="MyDefault"
if [ -n "$QUEUETIMEVAR" ]; then
  value="$QUEUETIMEVAR"
fi
Run Code Online (Sandbox Code Playgroud)

Mer*_*SFT 6

如果未设置变量,如何设置默认值?

如果你的意思是没有queueTimeVar在任何地方设置这个变量,包括在触发器页面的变量选项卡中,或者在 YAML 配置页面的变量选项卡中。不幸的是,不,如果没有明确设置变量,服务器无法知道应该从哪里获取值。

到目前为止,如果您使用的管道配置类型是 YAML,服务器只能识别在三个地方定义的变量:(1) YAML 脚本中的变量块,(2)配置页面中的变量面板,(3)变量触发器设置中的选项卡。

在此处输入图片说明

服务器无法识别未在这三个位置之一中定义的任何变量,即使只是在以下位置创建一个新变量:

在此处输入图片说明

一句话,如果你只是在排队时创建了一个新的变量,而没有先在这三个位置定义它,服务器仍然无法识别该变量及其值。

因此,您必须在我之前提到的位置之一中设置变量。或者管道不会得到它。

  • 也许我不明白答案。但是设置管道变量 (1) 并使用队列时间变量覆盖它在我的环境中不起作用。 (3认同)
  • @sschmeck根据[关于变量扩展的MS文档](https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#expansion- of-variables),“当您在 YAML 文件中设置变量时,请勿在 Web 编辑器中将其定义为“可在队列时间设置”。当前您无法更改在队列时间在 YAML 文件中设置的变量。如果您需要在队列时设置一个变量,那么不要在 YAML 文件中设置它。” 所以您看到的行为与文档相符。 (3认同)