如何为发布流程配置 GitVersion?

How to configure GitVersion for Release Flow?

我正在尝试配置 GitVersion 以使用 Release Flow 分支策略。

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

回到 GitVersion,我想配置它,以便在我创建新的发布分支时增加次要版本号,并在发布分支上有新提交时增加补丁号(从 cherry-picked修复分支)。

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

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

过了bit struggle, i ended up with my own PowerShell script。 该脚本很简单并且运行速度超快(接近 1 秒,不像 GitVersion,它可以在我们有大量分支的大型仓库上运行 5-15 分钟)。 现在,结果如下所示:

它主要是为与 TeamCity 一起使用而设计的,但我认为您可以轻松地将其更改为您需要的脚。 您可以在脚本注释中看到计算算法的详细说明。 这张图上也简单说明一下:

警告: 在 future/topic 分支中,与 GitVersion 不同,脚本使用来自 teamcity 的始终增长的构建计数器,而不是提交计数器。我不得不这样做,当我发现我们的大学使用强制推动(一些 "clean history" 政治)时,我不能依赖提交历史。

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

Modified Release Flow

我深表歉意,希望现在帮助别人还为时不晚。我已经添加了 yml,而且我还有一个 powershell,当从 master 那里挑选 HF 时,我制作了一个 powershell 来处理发布分支命名。请注意,此 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)

Git 版本 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: []