如何为发布流程配置 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: []
我正在尝试配置 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: []