Azure Pipelines - Build.SourceVersionMessage 变量在表达式函数中不起作用

Azure Pipelines - Build.SourceVersionMessage variable not working in expression function

我正在尝试根据提交消息片段 运行 Azure DevOps Server 2020 在我的管道中插入一个额外的参数。我尝试使用以下代码实现它,但没有成功:

variables:
  - name: commitMessage
    value: $(Build.SourceVersionMessage)
steps:
  - template: myTemplate.yaml
    parameters:
      ${{ if contains(variables['commitMessage'], 'SPECIAL_MESSAGE') }}:
        specialParam: 'someValue'

在调查过程中,我发现表达式的行为有些出乎意料:

variables:
  - name: commitMessage
    value: $(Build.SourceVersionMessage)
steps:
  - bash: | 
      echo "${{ variables['commitMessage'] }}"
      echo "${{ contains(variables['commitMessage'], 'SPECIAL_MESSAGE') }}"
      echo "${{ contains('test SPECIAL_MESSAGE', 'SPECIAL_MESSAGE') }}"

脚本输出为:

test SPECIAL_MESSAGE
False
True

脚本的第一行正确输出了提交信息。但是脚本第二行中的 contains() 函数似乎无法处理变量,即使提交消息包含 SPECIAL_MESSAGE,表达式 returns False

但是,如果我将我的变量设置为静态字符串而不是 $(Build.SourceVersionMessage) 变量,表达式 returns True,我可以添加额外的参数:

variables:
  - name: commitMessage
    value: 'test SPECIAL_MESSAGE'

知道为什么管道会这样吗,或者如何让它工作?

您可以更改为如下赞:

variables:
- name: commitMessage
  value: ${{ variables['Build.SourceVersionMessage'] }}

表达式“${{ variables['Build.SourceVersionMessage'] }}”会将值传递给自定义变量“commitMessage”编译时间。这相当于在运行管道之前手动分配静态值。

并且表达式“$(Build.SourceVersionMessage)”在运行时。

我已经用表达式'${{ variables['Build.SourceVersionMessage'] }}'进行了测试,它可以按预期工作。

更多详细信息,您可以参考关于“Understand variable syntax”的文档。

documentation 关于 Build.SourceVersionMessage 变量的说明:

The variable is only available on the step level and is neither available in the job nor stage levels (i.e. the message is not extracted until the job had started and checked out the code).

这意味着在有条件地插入步骤或参数时,无法在编译时表达式中正确使用此变量。有一个功能请求使这个变量在编译时完全可用:https://developercommunity.visualstudio.com/t/post/10029833