管道参数会覆盖变量值

时间:2020-09-04 05:06:18

标签: azure-devops yaml azure-pipelines

我在Azure DevOps中有一个类似以下的管道:

parameters:
- name: Scenario
  displayName: Scenario suite
  type: string
  default: 'Default'

variables:
  Scenario: ${{ parameters.Scenario }}

...
    steps:
    - script: echo Scenario is $(Scenario)

我正在通过VSTS CLI执行管道,如下所示:

vsts build queue ... --variables Scenario=Test

运行管道时,参数默认值似乎覆盖了我的cmd行指定的变量值,并且得到了步骤输出Scenario is Default。我尝试过类似Scenario: $[coalesce(variables['Scenario'], ${{ parameters.Scenario }})]的操作,但是我认为语法错误,因为这引起了解析问题。

如果尚未设置Scenario变量,仅使用参数值的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

仅在以下情况下才使用参数值的最佳方法是什么 尚未设置方案变量?

对不起,但据我所知,您的方案在设计上不受支持Note here指出:

在YAML文件中设置变量时,请不要在队列编辑器中将其定义为可设置的Web编辑器。您目前无法在队列时间更改YAML文件中设置的变量。如果您需要在队列时间设置变量,请不要在YAML文件中进行设置。

--variables中的切换命令只能 用于覆盖标记为在队列时间可设置的变量。由于yaml管道在设计上不支持Settable variables,因此在排队yaml管道时实际上不会传递您的--variables Scenario=Test

以下是我的几项测试,以证明:

1.Yaml管道不支持在队列时间设置的变量

pool:
  vmImage: 'windows-latest'

variables:
  Scenario: Test

steps:
- script: echo Scenario is $(Scenario)

我运行了命令vsts build queue ... --variables Scenario=Test123,管道运行开始了,但是输出日志始终是Scenario is Test而不是预期的Scenario is Test123。证明不是Pipeline parameter overwrites variable value,而是--variables Scenario=xxx未被传递,因为yaml管道不支持Settable变量。

2。使用管道变量Scenario创建Classic UI构建管道:

enter image description here

通过命令az pipelines build queue ... --variables Scenario=Test12345对其进行排队(它具有与vsts build queue ... --variables Scenario=Test相同的功能)只会给出以下错误:

Could not queue the build because there were validation errors or warnings.

3。然后启用此变量的Settable at queue time选项:

enter image description here

再次运行相同的命令,现在它可以使构建排队。此外,它还成功用命令行中设置的新值覆盖了原始管道变量。

您可以进行类似的测试,就像我所做的那样以找出导致您遇到的行为的原因。

此外: VSTS CLI已过时,并已由Azure CLI with the Azure DevOps extension取代。因此,现在更建议使用az pipelines build queue

答案 1 :(得分:1)

Lance有一个很好的建议,但这是我最终解决它的方法:

- name: Scenario
  displayName: Scenario suite
  type: string
  default: 'Default'

variables:
  ScenarioFinal: $[coalesce(variables['Scenario'], '${{ parameters.Scenario }}')]

...
    steps:
    - script: echo Scenario is $(ScenarioFinal)

在这种情况下,我们使用coalesce表达式来分配新变量ScenarioFinal的值。这样,我们仍然可以通过CLI使用--variables Scenario=Test或通过管道UI使用参数。 coalesce将采用第一个非空值,并有效地“重新排序”链接到此处的优先顺序Lance:https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#expansion-of-variables

(请注意,参数引用'${{}}'周围必须有单引号,因为${{}}会简单地转换为值,但是coalesce表达式不会不知道如何解释原始值,除非原始值周围有单引号将其表示为字符串)

请注意,通过CLI设置参数的功能是此处的当前功能建议:https://github.com/Azure/azure-devops-cli-extension/issues/972