请帮助我获取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项目,因此对两种类型的源代码管理都使用相同的解决方案会很高兴。
答案 0 :(得分:1)
创建一个新变量:
patch: $[counter('versioncounter',100)]
然后,您将使用$(Rev:rrr)
而不是使用$(patch)
。
我定义了两个测试变量:
test1: $[counter('versioncounter',1)]
test2: $[counter('versioncounter2',100)]
在构建管道中
这是日志:
[section]开始: 准备作业Job_1变量:
测试1: 解析表达式: 求值:counter('versioncounter',1) 展开式:1 结果:“ 1”
测试2: 解析表达式: 评估:counter('versioncounter2',100) 展开式:100 结果:“ 100”
在此构建管道中为另一个代理生成了与test1和test2相同的值
然后我又执行了一次构建管道,这是日志
[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