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

问题描述 投票:1回答:1

请帮助我获取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变量中。

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

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

$(BuildId)是一个无法清除的唯一值(从零开始)

我试图在构建数字格式字符串中使用versionFromFile变量,但似乎在管道启动时计算构建号,并且无法在构建号中使用自定义(脚本)变量值。

我想在这个文件中再创建一个文件,比如revisionFile和store revision value。但是,我需要在每个构建和提交时更新revisionFile

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

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

有Git和Tfs项目,所以对两种类型的源代码控制都有相同的解决方案。

azure-pipelines azure-pipelines-build-task
1个回答
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)]

在构建管道中

这是日志:

build 1 agent1 log

[部分]开始:准备工作Job_1变量: test1:解析表达式:评估:counter('versioncounter',1)Expanded:1结果:'1' test2:解析表达式:评估:counter('versioncounter2',100)扩展:100结果:'100'

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

然后我再次执行构建管道,这是日志

build 2 agent1 log

[部分]开始:准备工作Job_1变量: test1:解析表达式:评估:counter('versioncounter',1)Expanded:2结果:'2' test2:解析表达式:评估: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

是否有可能从构建电源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

© www.soinside.com 2019 - 2024. All rights reserved.