开箱 GitLab Flow 的 Release 分支
Chirpy 项目从 v3.0.0
版开始,转型成了一个 gem-based 项目:支持在 RubyGems.org 上对外发布 gem 包,方便用户端升级。项目原本使用的是 GitLab Flow 的持续发布方案:采用 master
和 production
双子星分支。这对 gem 版本跟踪开始力不从心,所以计划将其转换成 release 分支。
Release 分支
GitLab Flow 的 Release 分支核心思想是:
主分支开发成熟后,商定一个语义化版本号,格式为:
<major>.<minor>.<patch>
。如果是新的 major 或 minor 版本,就从主分支派生一个新的release
分支,命名格式为<major>.<minor>-stable
。不过release
分支名命没有清规戒律,如果习惯 Git Flow 风格,也可以使用release/
前缀,例如,release/<major>.<minor>
。这样可以在 Git GUI 中把所有的release
分支归并到release/
目录下,方便查找管理。只有在版本发布后,出现严重缺陷需要紧急修复时,遵循「上源优先」法则,在主分支进行修复,然后 cherry-pick 到
release
分支,然后在release
分支上新建 tag,并增加 patch 版本号。
但是 GitLab 文档没有对 bump version (修改项目配置文件的版本号) 这个步骤的使用位置以及时机点出指引。所以在实际应用时,还需要根据自身项目情况进行细化思考。
包含 Bump version 的发布流程
经过一番思考与实验,个人觉得可以按照以下方式使用 release
分支:
在发布新的
major
/minor
版本,从主分支最后一个 commit 上实施 bump version,然后再派生一个新的release
分支,并在其上面创建 tag。在发布新的
patch
版本时,从主分支分离一个新的patch
分支,在它上面完成 hotfix,以及 bump version。完成后,把patch
分支用--no-ff
方式 merge 到主分支。接着,把主分支的 merge 记录 cherry-pick 到release
分支,然后在release
分支上创建 tag。
在实际场景中,分支模型会类似下图:
主分支和 release
分支拥有一个相同的 bump version 记录,同时也是 minor
版本的第一个 tag。release
分支从第一个 hot-fix 起,与主分支各自拥有不同的提交轨迹,往后增加 patch
版本号(即 patch
大于 0)的 tag,只会存在于 release
分支。
借力 Git flow
上面说了对 release
分支的适配,但是开发过程的 feature
分支也值得花点笔墨提及一下。
Git Flow 成名已久,也是 GitHub Flow 与 GitLab Flow 的老前辈。现在主流的 Git GUI 基本都集成了 Git Flow,因此可以在 Git GUI 上享受创建 feature
分支的便利:
从 master
派生一个影子分支 develop
,在它的基础上可以用 GUI 快速生成开发分枝 feature/<feat-name>
,然后合并回 develop
,同时自动删除 feature
分支。这些操作都是 Git Flow 的逻辑,在 GitLab Flow 模型上也可以通过 Git GUI 来享用。develop
分支某种意义上算是项目作者的私人长期 feature
分支,对于使用 Codacy 之类代码质量审核的项目,还能把 develop
分支作为长期监视的分支来控制代码品质。
结论
此次转型的好处是:每个版本的生命周期一目了然,同时可以随心所欲地把控指定的 commit 在指定的版本上发布,例如:在必须发布 patch 版本的时候,能有效避免主分支上的新功能的 commit 被提前发布(production
分支做不到这点)。再者,源代码的 Tag、Demo 网站、Wiki 文档,以及 gem 可以做到「四位一体」。个人觉得,GitLab Flow 的 release
分支模型配合 Git Flow 的 develop
分支,对个人开发者的开源项目来说是比较合适的。
Comments powered by Disqus.