版本分支管理
words: 4.2k views: time: 15min基本目标是保证所有里程碑式的产物都能有对应的版本或Tag跟踪,并且作为结果归档是不可改变的;
版本管理
- 示意图
一般情况下,由产品负责规划发布版本,然后测试根据发布版本制定alpha版本,最后研发根据给定的alpha版本进行开发,过程中使用开发版本进行部署验证;
研发完成开发并且验证通过后,构建alpha版本交给测试进行验证,然后准备进入下一轮alpha版本(修复上一轮的问题以及开发未完成的功能),如果alpha版本经由测试确认,满足发布要求,那么根据对应的alpha版本构建发布版本交给产品;
发布版本[Tag]
使用简单的语义化版本规范:{主版本号}.{次版本号}.{修订版本},比如:1.0.0
- 主版本号:跟踪重大功能变动或重构升级;
- 次版本号:跟踪发布或迭代周期;
- 修订版本:跟踪版本发布之后的修订;
测试版本[Tag]
可以在发布版本后面添加一个后缀表示测试版本,比如alpha,即 {主版本号}.{次版本号}.{修订版本}-{alpha版本}
这样也可以称为alpha版本,比如:1.0.0-alpha1
测试版本作用: |
开发版本
继续在测试版本后面添加后缀,比如build,即{主版本号}.{次版本号}.{修订版本}-{alpha版本}-{build版本};
通过构建工具,比如jenkins,一般都会有一个构建序列,可以将其作为build号(如果没有,也可以简单使用一个时间戳),比如:1.0.0-alpha1-build1
开发版本作用: |
场景示例
迭代开发
比如首轮迭代,产品规划起始版本 1.0.0 |
版本修订
针对已发布的版本,如果出现Bug(按理应该尽力避免这种情况),那么我们可以找到版本对应的Tag,check出分支进行修改,然后验证并发布对应的修订版本;
假设之前发布的版本 1.0.0 出现Bug,那么它对应第一次的修订版本为 1.0.1,过程基本同上面迭代开发; |
产品版本
以上版本说明,都是以具体的应用模块作为跟踪对象;如果对于一个产品,它可能包含多个应用,并且各个应用的版本不同;此时我们可以针对产品整体定义一个独立的版本路线,使用同样的版本管理方法;
具体产品版本可以交给产品测试负责,由他们负责将所有需要的应用模块收集,然后制定一个产品版本,并记录产品版本与各个应用模块的版本关系;
可以根据产品版本的规划来制定应用模块的版本,示例如下:
假设当前的产品版本为 1.0.0,其中包含A、B、C、D四个应用模块; |
分支管理
Git的推荐是修改之前先拉分支,以下是对如何拉取和管理分支,提了一些规范建议;
- 示意图
- 示意图说明
只有主分支是永久分支,其它都是临时分支,主分支包括最初的main或master分支,以及后续的功能定制分支,或者修订后无法合并的修订分支;
一般会在主分支下面拉一层版本分支,并控制版本分支的提交权限,在版本分支之下则不做限制,可以自由拉取分支进行开发验证等操作,只要最终将结果合并到版本分支就行;根据版本计划,当版本分支上合并的内容到了一定阶段时,会进行构建打包以及部署验证,标记版本Tag等操作;
场景示例
迭代开发
对于一般迭代开发,可以只保留一个主分支(通常是master,限制push与merge权限),然后在此基础上拉取临时分支进行开发验证;
版本分支:基于主分支创建的临时分支(限制push与merge权限),比如1.1.0-alpha1,用于跟踪一个开发测试周期,一般在周期结束时创建Tag,合入主分支后删除 |
版本修订
对于已发布的版本,如果出现Bug,那么先基于版本Tag创建修订分支,比如版本1.0.0对应的修订分支为:1.0.0-fix(如果不能合并到主分支,那么修订分支就保留为独立的主分支,专门用于修订版本后续的问题);
具体过程与上面类似: |
多环境
如果条件允许,可能会将环境分成多个层次,比如:dev开发环境,beta测试环境,release预发布环境,以及prod生产环境;
那么对应的可以保留多个主分支(相对上面单个主分支,全部由开发进行管理,这里需要开发、测试、运维分别进行管理)
master: 开发环境分支,还是由开发负责,开发环境基于此分支进行构建; |
定制版本
一个产品可能要交付给不同的客户,所以可能存在不同的定制化需求,且互相不兼容,那么此时只有一个主分支就无法满足了;
可以创建多个主分支(通过一些标识来区分),来应对不同的定制开发,至于每个主分支中的版本开发管理则与上面保持不变; |
迭代重合
比如1.1.0正在某个alpha阶段,现在要开启1.2.0的迭代开发;
这种情况还是先拉取一个1.2.0-alpha1的版本分支,问题只在于是从主分支上拉,还是从1.1.0-{alpha版本}的迭代分支上拉; |
独立发布
比如一个迭代中原计划要开发多个功能,然后某个功能要提前单独发布(需求规划时应该应尽量避免);
可能发生了破坏性的修改或重构,那么可以规划一个大版本号来拉取分支,专门用来跟踪这个功能及后续的变化; |
简易分支管理
对于一些只有个别人负责,而且版本迭代节奏也比较清晰的模块,可能不想太麻烦。那么也可以直接在master分支上开发,尽量不拉分支,除非已发布的Tag需要修改时才拉分支
如下图所示:
直接在master上提交并发布4.5.0和4.6.0版本,如果4.6.0需要修改才拉分支fix-4.6.0,修改确认后再按版本关系逐层合并到master。这里相当于简化了上面的做法,只保留了主分支开发和修订分支开发,就不再区分什么版本分支和合作分支了。
提交规范
这里借鉴Idea中的Git提交插件,采用的Angular规范,规范的格式中包括3部分内容:Header、Body、Footer
- Header
Header格式: type(scope): subject ,举例:feat(用户模块): 新增用户查询接口
type:必填,表示提交类型,由如下选择(当然我们也可以自定义添加一些自己的type,保持格式统一就行):
feat: (常用)新功能feature |
scope:选填(建议必填),用于说明commit的影响的范围,自行描述;
subject:必填,commit的简短描述,比如变更的主要目的;
- Body
对本次 commit 的详细描述,可分成多行,如果觉得Header中subject已经描述足够清楚了,则Body部分可以省略
- Footer
Breaking changes: 提示不兼容的变动;
Closed issues: 关闭的issue,对应的可以填写任务或Bug单号;
[skip ci] :标识是否跳过构建
对于流水线的构建动作可以通过commit-log来触发(不要通过推送Tag来触发,避免只是为了构建而产生一些没有意义的Tag)
可以约定触发构建的commit-log格式:[Build] 和 [Tag] |
参考: