每个项目自动递增发布版本号
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 项目,因此如果两种类型的源代码管理有相同的解决方案就好了。
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
请帮助我为 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 项目,因此如果两种类型的源代码管理有相同的解决方案就好了。
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