目前公司配置管理在策略上采用的是不稳定主干(unstable trunk) 模式,所有的项目都在同一主干上进行修改,在每次上线后并没有明确的stable分支版本,基本上是靠测试人员TAG代码来管理维护的。
问题
1)、多个项目组开发人员都可能并发对同样代码进行修改,造成了严重的代码冲突问题。例如张三修改了a.java并上QA测试服务器,在QA测试过程中,
2)、由于没有明确stable分支版本,导致上QA、上生产只能采用增量更新,上QA、上生产出问题后的代码回滚很麻烦,严重影响了测试、上线效率。对于生产环境运行的代码的具体版本并没有明确的管理,导致生产系统出问题后要排查问题也很难查。
3)、由于核心基础包没有与上层应用隔离,导致大家都会对核心包进行修改,修改后代码质量并没有有效控制。于是出现因为修改基础包影响整个系统功能等现象
如何避免,至少要从如下几个方面来:
- 1)、分支管理策略:采用适当的分支管理策略来保证开发库、测试库、发布库的隔离
- 2)、适当引入每日编译、持续集成、Code Review等敏捷开发的最佳实践
- 3)、采用自动化脚本完成上QA、上生产的部署工作,避免人工失误
- 4)、对核心框架、后台应用、前端页面开发采用不同的配置管理策略
版本管理的策略:不稳定主干策略、稳定主干策略、敏捷发布策略。
下面是对这几种策略的摘录:
不稳定主干策略
- 使用用主干作为新功能开发主线,分支用作发布。
- 被广泛的应用于开源项目。
- 比较适合诸如传统软件产品的开发模式,比如微软的office等。
- bug修改需要在各个分支中合并。
- 新代码在主干上开发,因此如果主干不能达到稳定的标准,就不可以进行发布。
- 这种策略的好处是没有分支合并的工作量,因此比较简单。
稳定主干策略
- 使用主干作为稳定版的发布。
- bug的修改和新功能的增加,全部在分支上进行。
- 不同的修改或新功能开发以分支隔离。
- 分支上的开发和测试完毕以后才合并到主干。
- 主干上的每一次发布都做一个标签而不是分支。
- 每次发布的内容调整起来比较容易。
- 缺点是分支合并所增加的成本。
敏捷发布策略
- 敏捷开发模式的项目中广泛采用,敏捷开发的项目具有固定的发布周期。
- 为每个task建立分支。
- 为每个发布建立分支,每个周期内的task分支需要合并到发布分支发布。
- 在完成发布后,发布分支的功能合并到主干和尚在进行的任务分支中。
- 一种稳定主干策略的变体。
- 团队成员要求较高。
团队当前情况
- 负责互联网产品的开发,发布更新较为频繁。
- 有固定的发布周期,同时也存在比较多的hotfix。
- 修改任务通常比较小,改动范围通常不大,时间通常较短。
- 不同的功能页面有不同的小组负责,耦合度相对较低。
- 团队目前没有采用分支策略,开发人员协商进行增量更新,出现错误的几率较高。
- 已使用SVN版本控制工具。
初步实践
参考上述策略,结合当前团队的现状,初步设计了下面的版本控制解决方案。
此方案已稳定主干策略为主结合了一些敏捷发布策略的思路,具体实施方案如下:
1、主干时刻处于稳定状态,随时可以发布。设SCM人员对主干代码进行管理,普通开发人员只读。
2、SCM为开发任务建立开发分支。常规的可以以小组为单位建立分支,较大的任务可以建立专门的分支。
3、在发布日,从主干复制一个测试分支,需要在本发布日发布的各开发分支向此测试分支合并。
4、对测试分支代码进行测试,出现bug在测试分支上更改,无误后发布。
5、测试分支代码发布后,合并入主干,并在主干上进行标记。
6、对紧急修复(Hotfix)的情况,可以从主干复制出测试分支,在测试分支上进行紧急修改,并在测试后发布,发布后同样将代码合并会主干,做标记。
7、 Hotfix仅限于可以很快解决的小问题,如果更改时间过长,则需采用常规方法完成。
8、如果在测试分支测试过程中需要hotfix工作,则在复制一个新的测试分支进行hotfix,测试后发布。然后同时合并入原测试分支和主干,并在主干上做标记。此过程未在上图中画出。
9、测试分支发布后,开发分支可以删除;测试分支合并入主干后,测试分支可以定期删除。
方案的优缺点
方案优点
1、解决了没有实施分支策略时,代码不能经常签入的问题。
2、主干代码始终处于稳定的状态随时可以发布,降低了风险。
3、可以基于一个完整的测试分支进行测试及发布,而不是以口口相传的方式增量更新。
方案缺点
1、建立分支、合并分支增加了工作量。考虑实际情况,以及版本控制工具的辅助,增加的工作量应该可以接受。
2、如果某些开发分支工期跨越多个发布周期,修改过于剧烈,合并分支时可能工作量较大。可以考虑分解任务,避免过大的任务出现。
3、在同一时间最好只有一个测试分支,因此建立测试分支的权限需要限制,除hotfix场景外应当避免。
最佳实践
介绍
每个人使用 Git 有不同的使用习惯,无所谓对错,但是涉及团队协助,必须有一个统一的规范。
参考了TBD、GitHub Flow、git-flow 以及 AoneFlow 等不同分支管理策略,我们制定了此规范,特点如下:
- 操作简单,不要像 GitHub Flow 这么复杂;
- 可以确认任何时间发布的版本;
- 如果有重大 bug,可以快速回滚到上一个稳定版本;
- 修复紧急 bug,可以快速修复,而不用发布不该发布的内容;
分支
每个项目的有且只有 master 和 release 两个永久分支,开发中会用到 feature 和 hotfix 临时分支。
master分支
开发分支,所有开发的代码都须合并到此分支。
release分支
产品发布分支,主要用于发布产品版本。
feature分支
特性分支,每当开发新功能从 master 分支拉出。为了不重名,feature这么命名:feature/用户代号-模块名-子模块(如果有的话)
hotfix分支
bug修改分支,发布版本有bug的时候,可以从 master 拉出分支进行修正。每一个bug都要提交到工单中,工单都有一个数字的id,hot分支可以这么命名:hotfix/issue-工单id
tag 命名
- tag 只针对 release 分支,别的分支不需要打 tag。
- 客户端程序(如 App、小程序)遵照 major.minor.patch 的命名,如 2.3.1。
- 服务端程序(如 Api 接口、后台管理系统)以发布的日期命名,如 2018.5.20。
- 如果有 bug 修正,第 2 条直接最后发布号+1,如果上一个 tag 是 2.3.1,这个 tag 应该是 2.3.2,如果是日期命名,在后面增加小写字母,如 2018.5.20 后是 2018.5.20a,然后是 2018.5.20b。
新功能开发流程
- 从 master 分支创建 feature 分支;
- 开发调试完将 feature 分支提交到远程版本库;
- 提交 pull request 请求合并到 master 分支;
- 相关负责人 code review 后如果同意合并后,删除远程 feature 分支,如果不同意,重新修改后再上传 feature 分支请求 pull request。
发布流程
- 确保所有要发布的 pull request 已经 merge 到 master;
- 使用 master branch 的代码进行测试,如果发现 bug,把对应的 bugfix merge 到 master;
- 从 master 分支 git cherry-pick 过来新功能的 commit或者直接从 master 拉出(具体取决于 master 分支是否有不在本次 release 的commit,如果没有,直接 merge,如果有,就 cherry-commit);
- 测试并发布 release;
- 发布完成后打上版本 tag。
Bugfix 流程
这里的 bugfix 指的是修复已经发布的程序(release branch)中的缺陷。master 里的 bug 请直接 merge bugfix 到 master。
如果发现 bug,请先提交到工单系统。
- 如果此缺陷在 master 中还存在,请先 merge bugfix 到 master,否则跳到下一步;
- 在 release branch 从 master cherrypick 修复该缺陷的一个或多个 commit;
- 发布当前 release branch;
- 发布完成后在当前的 release branch 打上递增的 tag。
、