请帮助我获取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项目,所以对两种类型的源代码控制都有相同的解决方案。
创建一个新变量:
patch: $[counter('versioncounter',100)]
然后,您将使用$(Rev:rrr)
而不是使用$(patch)
。
我已经定义了两个测试变量:
test1: $[counter('versioncounter',1)]
test2: $[counter('versioncounter2',100)]
在构建管道中
这是日志:
[部分]开始:准备工作Job_1变量: test1:解析表达式:评估:counter('versioncounter',1)Expanded:1结果:'1' test2:解析表达式:评估:counter('versioncounter2',100)扩展:100结果:'100'
为此构建管道中的另一个代理生成test1和test2的相同值
然后我再次执行构建管道,这是日志
[部分]开始:准备工作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