3

我正在尝试配置 GitVersion 以使用发布流分支策略。

在此处输入图像描述

基本上,我有一个主线主分支、发布、功能和修复分支。Feature 和 Fix 分支是从 Master 分支创建的,并通过拉取请求合并回 Master。在 sprint 结束时,我从 Master 创建一个 Release 分支,该分支将持续到下一个 sprint 结束时,将创建一个新的 Release 分支。Release 分支不会合并回 master。它们甚至可以在创建新的 Release 分支后被删除。如果需要修补程序,它将在从创建并合并回 master 的 Fix 分支上开发,然后将其挑选到当前的 Release 分支中。我只对主要版本使用 git 标签。

回到 GitVersion,我想对其进行配置,以便在创建新的发布分支时增加次要版本号,并在发布分支上有新提交时增加补丁号(从修复分支中挑选)。

有没有人已经这样做并且可以帮助我?

4

2 回答 2

4

我们使用与这个非常相似的流程(实际上是基于它)。我们在发布分支上进行修补程序,我们还在发布分支之前创建预发布分支(方便在 octopus-deploy 中有单独的通道)。

经过一番挣扎,我最终得到了自己的PowerShell 脚本。该脚本很简单并且运行速度非常快(接近 1 秒,与 GitVersion 不同,它可以在我们拥有大量分支的庞大存储库上运行 5-15 分钟)。现在,结果如下所示:

它主要设计用于 TeamCity,但我认为您可以轻松地将其更改为您需要的脚。您可以在脚本注释中查看计算算法的详细说明。在这张图上也简要说明了:

警告:在未来/主题分支中,与 GitVersion 不同,脚本始终使用来自 teamcity 的不断增长的构建计数器,而不是提交计数器。当我发现我们的大学使用武力推动(一些“干净的历史”政治)时,我不得不这样做,而且我不能依赖提交历史。

于 2019-02-09T22:35:41.570 回答
0

我能够让这个工作为发布流程的一部分做一个反模式。但是,如果您使用 Azure DevOps,这没什么大不了的,因为 Microsoft 提供了一种快速简便的方法来查看您的发布分支是否在主分支之前/之后。我已经对此进行了测试,并且除了在每个 sprint 结束时创建发布分支和新标签之外,我还使用 Release Flow 几乎完全自动化了版本控制。这种方法也适用于我的 Nuget 包的语义版本控制 2.0,我使用视图而不是后缀标签。

修改后的发布流程

我很抱歉,希望现在帮助别人还为时不晚。我已经添加了 yml,并且我还制作了一个 powershell,用于在从 master 挑选 HF 时处理发布分支命名。请注意,此 powershell 步骤会在发布分支上添加版本标记,以便 GitVersion 将其拾取。

Powershell:使用您的团队项目和存储库名称发布 {{TeamProject}}/{{RepoName}}

- powershell: |
   $url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/definitions/$($env:SYSTEM_DEFINITIONID)?api-version=2.0" 
   Write-Host "URL:" $url 
   $definition = Invoke-RestMethod -Uri $url -Headers @{ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN" } 
   Write-Host "Pipeline = $($definition | ConvertTo-Json -Depth 100)"
  displayName: Build Details
  env: 
   SYSTEM_ACCESSTOKEN: $(system.accesstoken)

- powershell: |
   #Get branch version and increment from release branch
   $branchName = "$env:BUILD_SOURCEBRANCHNAME"
   $versionNotIncremented = ($branchName -Split "-")[1]
   [System.Version] $version = "0.0"
   [System.Version]::TryParse($versionNotIncremented, [ref]$version) > Null
   $ver = New-Object System.Version($version.Major,($version.Minor + 1))
   #Create new commit and tag on master
   git checkout master
   $env:GIT_TRACE=1
   git pull
   git commit --allow-empty -m "Create Tag ***NO_CI***"
   git push https://$env:SYSTEM_ACCESSTOKEN@dev.azure.com/{{TeamProject}}/{{RepoName}}/_git/{{TeamProject}}.Lookup.Api
   $commitId = git log --format="%h" -n 1
   #$commitId = git rev-parse --short HEAD
   git tag $ver $commitId -f -m "Release-$ver"
   git push https://$env:SYSTEM_ACCESSTOKEN@dev.azure.com/{{TeamProject}}/{{RepoName}}/_git/{{TeamProject}}.Lookup.Api $ver -f --porcelain
  displayName: 'Update Version for Upcoming Release'
  condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/heads/releases/'))
  env: 
   SYSTEM_ACCESSTOKEN: $(system.accesstoken)

GitVersion Yaml:

assembly-informational-format: '{FullSemVer}'
mode: Mainline
branches:
  master:
    tag: ''
    increment: Patch
    prevent-increment-of-merged-branch-version: true
    track-merge-target: false
    regex: master|releases?[/-]
    tracks-release-branches: false
    is-release-branch: false
  feature:
    mode: ContinuousDelivery
    tag: useBranchName
    increment: Inherit
    prevent-increment-of-merged-branch-version: false
    track-merge-target: false
    regex: features?[/-]
    tracks-release-branches: false
    is-release-branch: false
  pull-request:
    mode: ContinuousDelivery
    tag: PullRequest
    increment: None
    prevent-increment-of-merged-branch-version: false
    tag-number-pattern: '[/-](?<number>\d+)[-/]'
    track-merge-target: false
    regex: (pull|pull\-requests|pr|[0-9]+)[/-]
    tracks-release-branches: false
    is-release-branch: false
  hotfix:
    mode: ContinuousDelivery
    tag: beta
    increment: Patch
    prevent-increment-of-merged-branch-version: false
    track-merge-target: false
    regex: hotfix(es)?[/-]
    tracks-release-branches: false
    is-release-branch: false
  develop:
    mode: ContinuousDeployment
    tag: unstable
    increment: Patch
    prevent-increment-of-merged-branch-version: false
    track-merge-target: true
    regex: dev(elop)?(ment)?$
    tracks-release-branches: true
    is-release-branch: false
ignore:
  sha: []

于 2019-02-26T17:43:48.623 回答