Azure DevOps计数器表达式无法按预期运行

时间:2019-08-23 23:48:49

标签: azure-devops expression

我正在尝试创建一个计数器表达式

variables:
  internalBuildNumber: 1
  semanticBuildNumber: $[counter(variables['internalBuildNumber'], 0)]

问题在于计数器表达式似乎仅在作业开始时才扩展。我有一个Powershell脚本,用于设置internalBuildNumber

Write-Output "##vso[task.setvariable variable=internalBuildNumber]$version"

然后,我打算使用此internalBuildNumber和语义BuildNumber的组合来更新构建的内部版本号

powershell: echo "##vso[build.updatebuildnumber]$(internalBuildNumber).$(semanticBuildNumber)"

例如,我期望以下几点: 第一次运行:

    通过Powershell脚本将
  • internalBuildNumber设置为1.1.0-alpha1

  • semanticBuildNumber进行评估时应为0

  • 内部版本号将设置为1.1.0-alpha1.0

第二次运行:

    由于已完成新的提交,
  • internalBuildNumber通过powershell脚本设置为1.1.0-alpha2
  • semanticBuildNumber评估结果应为0

  • 内部版本号将设置为1.1.0-alpha2.0

但是,在第二次运行时,计数器设置为1,并且每次运行都会不断增加,这使我认为不是基于internalBuildNumber的设置值而是基于它的初始值进行评估。

希望我的意思是有道理的。这是期望吗?

1 个答案:

答案 0 :(得分:1)

  

Azure DevOps计数器表达式无法正常工作

实际上,Azure DevOps计数器表达式可以按预期工作。

它对您不起作用的原因是您没有区分运行时变量和预定义变量。

您已经在Varivales标签中定义了变量internalBuildNumbersemanticBuildNumber,它们是预定义的变量。

当您用值internalBuildNumber覆盖变量$version时。现在,变量internalBuildNumber是一个运行时变量,它在您要运行任务的环境中工作。 但是,它不会影响预定义变量,该变量不在当前环境中。

换句话说,覆盖变量internalBuildNumber仅在代理中有效,它不会更改您在Web门户中定义的值。当我们第二次开始运行管道时,管道仍然会获取预定义的变量,而无法从上一个封闭的环境中获取变量。

这就是为什么第二次运行计数器设置为1并仅基于其初始值不断增加的原因。

要解决此问题,您需要根据$version而不是internalBuildNumber的值来设置计数器。