XXXXXXXX 代码版本管理规范
历史版本
目录
历史版本 (2)
1引言 (4)
1.1目的 (4)
1.2管理工具 (4)
2现状概述 (5)
3现状分析 (5)
3.1现状详述 (5)
3.2目标细化 (6)
3.3SVN版本管理 (6)
3.3.1概述 (6)
3.3.2使用对比 (7)
4完整的实施方案 (9)
4.1开发阶段 (9)
4.2预发布测试阶段 (9)
1引言
1.1目的
为了规范和制度化公司的软件版本管理制度,并保障项目开发资料的完整性和安全性,同时明确开发源代码的控制管理流程,特此制定此规范。
1.2管理工具
沿用SVN管理工具来进行开发的版本管理,源代码管理和开发资料归档。
2现状概述
目前公司研发部门对于代码的版本管理方式较为简单,只是在每次发版后做了基线库存档,导致所有正在开发的需求和项目都在同一个目录里面进行修改,造成每次发版的代码都有可能包含了本次发版以外的内容。
这样会造成如下两点影响:
●会有不稳定的因素存在,比如:测试只会对当前需要发版的内容进行测试,但是代码库
中同时存在多个版本和项目的代码,对于本次发版无涉及的代码没有进过测试就部署到了服务器上,影响运行的稳定性。
●一旦出现点问题不好定位,比如:出现问题后通常会优先排查发版涉及的内容,但是部
分问题是由于其他项目代码引起的。
因此,随着公司和项目规模的壮大,对软件代码版本管理提出了更高的要求。
3现状分析
3.1现状详述
当前代码版本管理现状如下:
1.所有的开发都在一个目录里面做,各种需求、项目、代码、文件混杂在一起。
2.提交测试服务器时,只考虑了编译能通过,而没有考虑功能本身有没有完成。
3.测试出bug以后,会在开发目录进行修改,然后再次提交到测试服务器。
这时提交的
代码就可能包含了他人对其他功能/项目的修改,而测试又只会针对此bug再做测试。
这就导致了除了此bug之外的修改可能会没有测试过就直接发布到了服务器上,引起预发布环境不稳定并增加预发布bug数量。
总体来说,当前工作流程是:预发布出bug,研发修改,再提交测试,然后预发布测试
通过的代码。
整个流程也较为复杂消耗了大量人力,从而间接的增大了研发成本。
(参照下图)
4.以上描述的过程还可能出现在正式环境上,导致更严重的后果。
3.2目标细化
结合第一章节提及的本文目标、SVN工具的能力以及之前工作中遇到的具体问题,将本规范的撰写目标具体细化为:
1.提交到测试服务器的代码只能包含本次需要测试的内容。
2.发布到预发布环境的代码只能包含这次需要测试的内容。
3.发布到正式环境的代码只能包含本次发版的内容。
3.3SVN版本管理
3.3.1概述
为了达成上述我们设定的版本管理目标,在指定具体的策略之前,我们需要理解SVN的版本管理思路,这里简单将其阐述如下:
首先,SVN(Subversion)有一个很标准的目录结构,如下:
project
+-- trunk
+-- branches
+-- tags (此目录为只读)
这个标准的目录结构在大多数的开源项目中都能看到,这套标准目录结构为软件开发提供了一种非常好的宏观的版本库管理机制,特别是在产品类项目管理中。
其中,trunk目录为主开发目录,branches目录为分支开发目录,tags目录为存档目录,也就是基线库。
其各自含义描述如下:
Trunk
中文翻译为“主干”,在项目运作过程中,日常的开发和管理资料都在此目录中进行维护和更新。
Branches
中文意思为“分支”,在项目运作过程中,用于存放阶段性的成果或者版本,这些阶段性的成果或者版本必须是可维护的。
同时,这里的开发成果物必须要保持每天一到两次把主干上的内容合并过来。
tags
中文意思“标签”,此目录对一些阶段性的成果进行存档。
此目录为只读目录,不允许进行修改。
3.3.2使用对比
以下假设一个开发场景,并设想当前管理机制和SVN管理思路下的不同流程和结果,以便更好的理解SVN管理思路和带来的收益。
场景描述:
设备管理模块,其v1.0已经上线,正在做v2.0的开发。
在这时,研发在开发库中正在做v2.0的开发,同时备份有v1.0的代码,现在有一个紧急需求,需要在v2.0发版之前就应用到正式环境中去。
3.3.2.1现有的发布流程
1.在当前开发库(v
2.0)的代码上直接修改实现紧急需求。
2.开发完成后,将本紧急需求连同v2.0的半成品代码(但编译能通过)一起打包提交到
测试服务器。
3.测试只针对此紧急需求进行测试(v2.0的内容不测试),并测试通过。
4.发预发布环境,同时测试(过程同上)。
5.发到正式服务器。
3.3.2.2SVN的发布流程
1. 2.0开始开发,trunk目录下此时的代码内容为v2.0的开发版(半成品未完成)。
2.基于v1.0的tag新建此紧急需求的开发分支(branchv1.1)
此时的目录结构为
svn://proj/
+trunk/ ( dev 2.0 )
+branches/
+dev_1.1(copy from tag/release_1.0)
+tags/
+release_1.0 (copy from trunk)
3.在v1.1 branch目录中进行紧急需求开发,在trunk目录中进行版本v2.0开发。
4.在v1.1 branch开发完成后,基于v1.1 的branch做现有的发布流程。
这时在v1.1的
branch版本里只涉及了本次要发版的紧急需求,不含有其他修改,很好的规避了现有流程中的弊端。
5.根据需要选择性的把v1.1这个分支merge回trunk(是否执行和具体执行时间需要根
据具体需求分析)
这是一种标准的开发模式,在很多公司中都有采用,此种模式下trunk永远是开发的主要目录。
4完整的实施方案
分为开发阶段和测试阶段来分别阐述此方案:
4.1开发阶段
1.每一次正式版本发布后,存档形成一个版本基线,例如v1.0,v1.3,v1.3.3。
2.拿到新需求(可以是多个)后,开发人员估计在下一次发版(v2.0)时能否开发完成。
确定能开发完成随v2.0一起发版的则直接在主线上开发。
3.若不能确定在下一次发版时能一起发版的,或者修改很大的的情况,就需要新建一个分
支,然后在这个分支上面开发。
需要注意的一点是为了保障发版前合并到主线尽量少产生冲突,需要至少每天把主线上的代码合并到自己开发的分支中来。
4.紧急发版(如bug修改)情况下,需要在下次发版前紧急再发一个版本的情况,就需
要基于最新的基线新建一个分支,然后在这个分支上面进行开发,测试,发版。
完成后再将其合并到主线上。
4.2预发布测试阶段
预发布阶段的情况会稍微特殊一些,流程如下:
1.在预发布的时候先在Tag中做一个发布版本的同步快照
2.然后发布到预发布环境进行测试
3.若发布测试通过要正式发版的时候,如果在发布版本上有了修改(如bug修复),需要再
往预发布环境发布的时候,就需要先和Tag中的快照进行版本比对,评估修改带来的影响范围。
4.针对影响范围重新进行测试
5.测试通过后把修改的内容合并到Tag中的同步快照中。
总之,在这个阶段的核心思想是,预发布中发现的问题,在修复后提交时需要先和T ag中文件进行对比评估出影响范围,针对影响内容进行测试后,才能提交合并到Tag中。