【问题标题】:Pipeline parameter overwrites variable value管道参数覆盖变量值
【发布时间】:2020-09-05 06:13:13
【问题描述】:

我在 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 变量,那么仅使用参数值的最佳方法是什么?

【问题讨论】:

  • 不是Pipeline parameter overwrites variable value,只是在排队时变量并没有真正传递给yaml管道。

标签: azure-devops yaml azure-pipelines


【解决方案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创建经典UI构建管道:

通过命令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选项:

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

你可以像我一样做类似的测试来找出你遇到的行为的原因。

另外: VSTS CLI 已被弃用并由 Azure CLI with the Azure DevOps extension 代替很长时间。所以现在更推荐使用az pipelines build queue

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 太棒了!很高兴看到您的问题得到解决。请尽可能Accept it as an Answer,这对阅读此主题的其他社区成员会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多