【问题标题】:TFS 2015 Version Numbering By BranchTFS 2015 版本编号(按分支)
【发布时间】:2016-09-12 14:11:35
【问题描述】:

我正在针对 TFS 2015 中的 Git 存储库创建持续集成构建定义。该定义配置了针对“master”和“develop”分支的触发器。

根据触发构建的分支,版本号需要按如下方式递增:

开发分支:
major.minor.(build+1)
IE;维护当前的主要和次要版本,仅增加内部版本号

主分支:
主要.(次要+1).0
IE;维护主要版本,增加次要版本并为开发分支上的后续构建重置构建号

成功构建完成后,各个分支需要应用标签(标签)来指示构建的版本。

【问题讨论】:

    标签: git msbuild versioning tfs-2015


    【解决方案1】:

    经过更多研究,我决定通过使用两个构建定义(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 
    }
    

    请注意,为了使其正常工作,您需要稍微修改“项目构建收集服务”权限以避免在请求更新时收到安全异常。为此,导航“构建定义”列表,单击开发构建旁边的下拉菜单,选择“安全”,滚动到用户部分并将“编辑构建定义”权限设置为允许

    【讨论】:

      【解决方案2】:

      目前无法在单个 TFS 构建定义中实现这种复杂的版本号设置。

      TFS 无法根据触发构建的分支来增加构建号。它使用$(Rev:.rr) 来确保每个完成的构建都有一个唯一的名称。构建完成后,如果构建号中没有其他内容发生变化,则 Rev 整数值加一。更多详情,请参考这两个线程Specify general build definition settings & vNext Build Awesomeness – Managing Version Numbers

      对于您的情况,您可能需要创建两个构建定义对应的 developmaster 分支。然后在开发构建定义中手动增加次要值或使用powershell脚本来实现。

      【讨论】:

      • 感谢帕特里克的回复。这听起来应该是一个相当普遍的要求,您是否预计这可能会在 TFS15 中发生变化?
      • 生产的新闻和发布,您可以关注visualstudio.com/en-us/news/news-overview-vs.aspx。暂时没有相关更新。此外,我对您的版本号结构有点困惑。为什么只在主分支上触发简单构建而不是使用通用结构时才应该增加次要版本(Major version).(Minor version).(Revision number).(Build number)programmers.stackexchange.com/questions/166215/…
      • 不确定我是否遵循您的问题,我们使用的架构是标准语义版本控制系统...主要版本意味着对应用程序的重大更改(例如;会破坏向后兼容性的东西) 次要版本意味着较小的更改(例如;现有功能的改进/改进,以保持向后兼容性)构建/修订号用于表示补丁,或者在我们的例子中,是导致新次要的测试版本
      猜你喜欢
      • 2016-03-25
      • 2016-01-19
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 2015-10-11
      相关资源
      最近更新 更多