每个项目自动递增发布版本号

auto increment release version number per project

请帮助我为 Azure 中的管道构建任务获取自动递增的修订号。

假设有 major.minor.patch.revision 个数字。 major.minor.patch 设置在存储在源代码管理中的版本文件中。这允许源代码维护者定义软件版本并且不更改构建任务定义(或其参数)。我想在构建新版本之前避免版本参数值更新。

但是我希望每次构建版本时自动增加修订。使 major.minor.patch 相同成为可能。

版本文件为纯文本文件,内容为major.minor.patch。我在构建管道中有 powershell 脚本任务。它读取版本文件并存储为构建变量,如下所示:

$fv = Get-Content versionFile

       $buildNumber = $env:BUILD_BUILDNUMBER
       if ($buildNumber -eq $null)
       {
           $buildIncrementalNumber = 0
       }
       else
       {
           $splitted = $buildNumber.Split('.')
           $buildIncrementalNumber = $splitted[$splitted.Length - 1]
       }

   Write-Host ("##vso[task.setvariable variable=versionFromFile]$fv.$buildIncrementalNumber")
   Write-Host ("from file $fv incremental .$buildIncrementalNumber")
   Write-Host ("##vso[task.setvariable variable=build.updatebuildnumber]$fv.$buildIncrementalNumber")

如您所见,它从 versionFile 读取并从 BUILDNUMBER 变量中获取 .N 部分以获得修订值。并将结果值存储到 versionFromFile 变量。

而且我想为特定项目的每个构建自动更新最新版本。只是不要为每次提交到 master 分支而启动的每个构建更新版本源文件。

我尝试使用 build number format,但问题是如果 Build number format 的主要部分被更改,$(Rev:.r) 会被重置。这意味着对于数字格式 $(BuildDefinitionName)_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r) Rev 每天从零开始。

$(BuildId)为唯一值,不可清零(从零开始)

我尝试在内部版本号格式字符串中使用 versionFromFile 变量,但似乎内部版本号是在管道启动时计算的,并且无法在内部版本号。

我想再创建一个文件,如 revisionFile 并将修订值存储在该文件中。但是,我将需要在每次构建和提交时更新 revisionFile

是否有任何其他选项来获取项目的构建自动递增计数? 我遇到了一个如何从 powershell 脚本更新构建管道变量的示例,但它与管道链接,因此拥有两个构建管道将为(可能)不同的版本产生相同的值。

PS 可以通过 outputing "##vso[build.updatebuildnumber]1.2.3.4" to the log during the build 更新内部版本号,但是 Rev 值是在任何任务有机会更新内部版本号之前计算的。

有 Git 和 Tfs 项目,因此如果两种类型的源代码管理有相同的解决方案就好了。

好像已经有答案了: https://developercommunity.visualstudio.com/content/problem/240373/vsts-build-revision-does-not-increment-after-calli.html

Create a new variable: patch: $[counter('versioncounter',100)] Then, instead of using $(Rev:rrr), you would use $(patch).

我定义了两个测试变量:

test1: $[counter('versioncounter',1)]

test2: $[counter('versioncounter2',100)]

在构建管道中

这是日志:

构建 1 agent1 日志

[section]Starting: Prepare job Job_1 Variables:
test1: Parsing expression: Evaluating: counter('versioncounter', 1) Expanded: 1 Result: '1'
test2: Parsing expression: Evaluating: counter('versioncounter2', 100) Expanded: 100 Result: '100'

在此构建管道中为另一个代理生成相​​同的 test1 和 test2 值

然后我又执行了一次构建管道,这是日志

build 2 agent1 日志

[section]Starting: Prepare job Job_1 Variables:
test1: Parsing expression: Evaluating: counter('versioncounter', 1) Expanded: 2 Result: '2'
test2: Parsing expression: Evaluating: counter('versioncounter2', 100) Expanded: 101 Result: '101'

我假设计数器值是根据第一个参数为键生成的

[del]这正是我要的[/del]

upd1 我在现实生活中试过运行这个

问题是 $[counter('versioncounter',1)] 仅对构建变量初始化有效。 我尝试在 PS 脚本中使用它,如下所示

- powershell: |
   $fv = Get-Content versionFile
   $buildIncrementalNumber = $[counter($fv,1)]

但失败了:

$[counter : The term '$[counter' is not recognized as the name of a cmdlet, 
function, script file, or operable program. Check the spelling of the name, or 
if a path was included, verify that the path is correct and try again.
At E:\buildagent\networkProxy\_work\_temp\d22e789f-bed0-465a-b447-60f634d73c38.
ps1:3 char:27
+ $buildIncrementalNumber = $[counter($fv,1)]
+                           ~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: ($[counter:String) [], ParentCon 
   tainsErrorRecordException
    + FullyQualifiedErrorId : CommandNotFoundException

是否可以从 build power shell 脚本访问 $counter 魔法?

upd2 必须使用两个作业从文件中读取版本并使用 $counter 魔法获取增量数字。在 #1802 issue 中有 moswald 使用两个作业的答案。

所以我实现如下:

jobs:
  - job: versionJob #reads version number from the source file
    steps:
      - powershell: |
          $fv = Get-Content versionFile
          Write-Host ("##vso[task.setvariable variable=versionFromFile;isOutput=true]$fv")
        displayName: 'version from file' 
        name: setVersionStep  


  - job: buildJob # consumes version number, calculates incremental number and set version using assemblyinfo.cs
    dependsOn: versionJob
    variables:
      versionFromFile: $[ dependencies.versionJob.outputs['setVersionStep.versionFromFile'] ] # please note that spaces required between $[ and dependencies
      buildIncrementalNumber: $[ counter(dependencies.versionJob.outputs['setVersionStep.versionFromFile'],1) ] #can't use $versionFromFile here


    steps:
      - powershell: |
          Write-Host ($env:versionFromFile)
          Write-Host ($env:versionFromFile + '.' + $env:buildIncrementalNumber)
        displayName: 'version from file output' 

here is yaml 变量文档

PS:不需要在作业部分

之前声明$variableFromFile