【问题标题】:How to configure GitVersion for Release Flow?如何为发布流程配置 GitVersion?
【发布时间】:2019-06-24 16:21:12
【问题描述】:

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

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

回到 GitVersion,我想配置它,以便当我创建新的发布分支时次要版本号会增加,而当发布分支上有新提交时补丁号会增加(从修复中挑选的樱桃)分支)。

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

【问题讨论】:

    标签: git branching-strategy gitversion


    【解决方案1】:

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

    Modified Release Flow

    我很抱歉,希望现在帮助别人还为时不晚。我已经添加了 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: []
    
    

    【讨论】:

    • 如果您需要查看 GitVersion YML 文件,请告诉我
    • 是的,当然。请在答案中添加它,以便我看到它。
    • @Stoopered 我也对 yml 文件感兴趣,请将其添加到答案中。谢谢! :)
    • @stoopered 你能添加 gitversion 配置 yml 文件吗,我遇到了与 gitversion 相同的问题,
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 顺便说一句,我还有一个 script 模仿 GitVersion 的 assemblyInfo 修补功能。
    • 感谢您的回答。这不是我想要的,但它可能会起作用。我要等几个星期,看看有没有其他人回答。如果不是,我会接受你的回答。
    • @AntonSmolkov 谢谢你!这将很有帮助,因为我们希望在我们的团队中遵循 ReleaseFlow 原则来构建新的东西。我也对您如何在 Octopus 和 TeamCity 上进行设置感兴趣。比如,你们会自动将每个功能分支推送到 dev 中吗?或者你们的故事是什么?此外,如果我们自己使用 OctpusDeploy 来了解您是如何设置 Octopus 的,那将是非常棒的,因此任何指针都很有趣。
    • @mengstorm 欢迎您!不,我们使用拉取请求将代码从功能分支合并到主分支。我们的管道看起来非常接近描述的here
    猜你喜欢
    • 2015-06-14
    • 2020-01-17
    • 2020-02-23
    • 2022-08-22
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多