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

时间:2019-04-18 11:38:49

标签: azure-pipelines azure-pipelines-build-task

请帮助我获取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,但是问题是,如果$(Rev:.r)的主要部分被更改,则Build number format将被重置。这意味着对于数字格式$(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项目,因此对两种类型的源代码管理都使用相同的解决方案会很高兴。

1 个答案:

答案 0 :(得分:1)

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

  

创建一个新变量:patch: $[counter('versioncounter',100)]   然后,您将使用$(Rev:rrr)而不是使用$(patch)

我定义了两个测试变量:

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

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

在构建管道中

这是日志:

构建1个agent1日志

  

[section]开始:   准备作业Job_1变量:
      测试1:       解析表达式:       求值:counter('versioncounter',1)       展开式:1       结果:“ 1”
      测试2:       解析表达式:       评估:counter('versioncounter2',100)       展开式:100       结果:“ 100”

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

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

构建2个agent1日志

  

[section]开始:   准备作业Job_1变量:
      测试1:       解析表达式:       求值:counter('versioncounter',1)       展开式:2       结果:“ 2”
      测试2:       解析表达式:       评估:counter('versioncounter2',100)       展开式:101       结果:“ 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

是否可以从构建Power Shell脚本中访问$counter魔术?

upd2 必须使用两个作业来从文件读取版本并使用$ counter magic获得增量编号。 #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