TFS 2015 版本编号(按分支)
TFS 2015 Version Numbering By Branch
我正在针对 TFS 2015 中的 Git 存储库创建持续集成构建定义。该定义配置了针对 "master" 和 "develop" 分支的触发器。
基于触发构建的分支,版本号需要递增如下:
开发分支:
major.minor.(build+1)
IE;维护当前的主要和次要版本,仅增加内部版本号
主分支:
大.(小+1).0
IE;维护主要版本,增加次要版本并重置开发分支上后续构建的内部版本号
成功构建完成后,各个分支需要应用标记(标签)来指示构建的版本。
目前无法在单个 TFS 构建定义中实现这种复杂的版本号设置。
TFS 无法根据触发构建的分支增加构建号。它使用 $(Rev:.rr)
来确保每个完成的构建都有一个唯一的名称。当构建完成时,如果构建号中的其他内容没有发生变化,则 Rev 整数值 增加一个 。更多详情,请参考这两个话题Specify general build definition settings & vNext Build Awesomeness – Managing Version Numbers
对于您的情况,您可能必须创建两个构建定义对应 develop 和 master 分支。然后在开发构建定义中手动增加次要值或使用 powershell 脚本来实现此目的。
经过更多研究后,我决定通过使用两个构建定义(master 和 dev)和一个针对主构建定义执行以动态更新 dev 的 PowerShell 脚本来实现此目的。
因为这可能对以后的其他人有用,所以这是我的 PowerShell 脚本...
# Gather environment variables from TFS...
$buildNumber = $env:BUILD_BUILDNUMBER
$tfsCollectionUri = $env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI
$teamProjectId = $env:SYSTEM_TEAMPROJECTID
# Enable "Allow Scripts to Access OAuth Token" in the "master" build's Options
$accessToken = $env:SYSTEM_ACCESSTOKEN
# Declare "DevBuildDefinitionId" in the "master" build's Variables and populate with the id of the "dev" build
$devDefinitionId = $env:DevBuildDefinitionId
# Construct the new build number format based on the latest build number...
$parts = $buildNumber.split(".")
$buildNumberFormat = ($parts[0] + "." + $parts[1] + "`$(Rev:.r)")
Write-Host
Write-Host "New Dev build number format: $buildNumberFormat"
Write-Host
$uri = "$($tfsCollectionUri)$teamProjectId/_apis/build/definitions/$($devDefinitionId)?api-version=2.0"
#Retrieve the dev build definition...
try {
$definition = Invoke-RestMethod -Uri $uri -Method Get -Headers @{ Authorization = "Bearer $accessToken" }
# Modify the version number format...
$definition.buildNumberFormat = $buildNumberFormat
# Update the build definition
try {
$body = ConvertTo-Json $definition -Depth 1000
$result = Invoke-RestMethod -Uri $uri -Method Put -Headers @{ Authorization = "Bearer $accessToken" } -Body $body -ContentType application/json
Write-Host
Write-Host "Dev build definition successfully updated"
Write-Host
}
catch {
Write-Host
Write-Host "Failed to update the Dev build definition..."
Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__
Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
Write-Host
}
}
catch {
Write-Host
Write-Host "Failed to retrieve the Dev build definition..."
Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__
Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
Write-Host
}
请注意,为了使其正常工作,您需要稍微修改 "Project Build Collection Service" 权限,以避免在请求更新时收到安全异常。为此,导航 "Build definitions" 列表,单击开发版本旁边的下拉菜单 select "Security",滚动到用户部分并将 "Edit build definition" 权限设置为允许
我正在针对 TFS 2015 中的 Git 存储库创建持续集成构建定义。该定义配置了针对 "master" 和 "develop" 分支的触发器。
基于触发构建的分支,版本号需要递增如下:
开发分支:
major.minor.(build+1)
IE;维护当前的主要和次要版本,仅增加内部版本号
主分支:
大.(小+1).0
IE;维护主要版本,增加次要版本并重置开发分支上后续构建的内部版本号
成功构建完成后,各个分支需要应用标记(标签)来指示构建的版本。
目前无法在单个 TFS 构建定义中实现这种复杂的版本号设置。
TFS 无法根据触发构建的分支增加构建号。它使用 $(Rev:.rr)
来确保每个完成的构建都有一个唯一的名称。当构建完成时,如果构建号中的其他内容没有发生变化,则 Rev 整数值 增加一个 。更多详情,请参考这两个话题Specify general build definition settings & vNext Build Awesomeness – Managing Version Numbers
对于您的情况,您可能必须创建两个构建定义对应 develop 和 master 分支。然后在开发构建定义中手动增加次要值或使用 powershell 脚本来实现此目的。
经过更多研究后,我决定通过使用两个构建定义(master 和 dev)和一个针对主构建定义执行以动态更新 dev 的 PowerShell 脚本来实现此目的。
因为这可能对以后的其他人有用,所以这是我的 PowerShell 脚本...
# Gather environment variables from TFS...
$buildNumber = $env:BUILD_BUILDNUMBER
$tfsCollectionUri = $env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI
$teamProjectId = $env:SYSTEM_TEAMPROJECTID
# Enable "Allow Scripts to Access OAuth Token" in the "master" build's Options
$accessToken = $env:SYSTEM_ACCESSTOKEN
# Declare "DevBuildDefinitionId" in the "master" build's Variables and populate with the id of the "dev" build
$devDefinitionId = $env:DevBuildDefinitionId
# Construct the new build number format based on the latest build number...
$parts = $buildNumber.split(".")
$buildNumberFormat = ($parts[0] + "." + $parts[1] + "`$(Rev:.r)")
Write-Host
Write-Host "New Dev build number format: $buildNumberFormat"
Write-Host
$uri = "$($tfsCollectionUri)$teamProjectId/_apis/build/definitions/$($devDefinitionId)?api-version=2.0"
#Retrieve the dev build definition...
try {
$definition = Invoke-RestMethod -Uri $uri -Method Get -Headers @{ Authorization = "Bearer $accessToken" }
# Modify the version number format...
$definition.buildNumberFormat = $buildNumberFormat
# Update the build definition
try {
$body = ConvertTo-Json $definition -Depth 1000
$result = Invoke-RestMethod -Uri $uri -Method Put -Headers @{ Authorization = "Bearer $accessToken" } -Body $body -ContentType application/json
Write-Host
Write-Host "Dev build definition successfully updated"
Write-Host
}
catch {
Write-Host
Write-Host "Failed to update the Dev build definition..."
Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__
Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
Write-Host
}
}
catch {
Write-Host
Write-Host "Failed to retrieve the Dev build definition..."
Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__
Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
Write-Host
}
请注意,为了使其正常工作,您需要稍微修改 "Project Build Collection Service" 权限,以避免在请求更新时收到安全异常。为此,导航 "Build definitions" 列表,单击开发版本旁边的下拉菜单 select "Security",滚动到用户部分并将 "Edit build definition" 权限设置为允许