一个项目想要成功,那配置管理的努力是必不可少的。如何做一个好的配置管理,同时减轻自己的负担,那就是一个值得认真思考的问题拉。" [6 o* ? x* Y: `' L, ?* ]
一个产品想要实现持续集成及日创建,那么非得有一套好的自动编译系统支撑才可以,否则对于一个庞大的系统而言,一个配置管理就算累死也无法满足需求的。
下面以我的经验说说任何构建一个自动编译系统。
为了更好的自动编译,我想应该建立一个这样的系统,那就是:" a% \" J- ]" _$ g" B/ w# y% b# v: N
1、开发人员或定时触发。
2、自动更新编译环境。
3、自动编译。: w. E7 n2 s4 `' o- V4 [3 a
4、自动分析编译结果。2 X5 E3 u$ ?+ G
5、自动通知开发、测试及配置管理员。
( C. ?7 C5 F6 V @, u9 P
下面我假设情况如下:
1、操作系统:平台包括:HP-UX、SunOS、AIX、Linux 、Windows (均包括多个版本)、。' h2 p& R+ o; b4 d" Q( F) S! p
2、数据库包括:oracle 8i、9i、10G
3、编译器包括:aCC、CC、xlC、gcc、bcb(windows 上的集成开发环境) 、java(包括多个版本)8 q) {9 Z7 |/ K% Q3 J: J. x9 L/ \
4、项目规模超过千万行代码、模块众多、调用复杂。3 R* p2 ?/ w7 g) [. R- r
那么在这样一个情况下,如果我们考虑用一般的商用工具做,显然成本是很高的。) X5 C, b- |5 R; ^$ M+ Q7 e5 p
对于这样一个庞大,复杂的系统,我想在项目启动后,首先要做的是:$ H$ E9 r* Q. g$ s
1、定义编码规范。
2、定义C++及java的编译选项(由于C++语言中编译器及平台版本不同,32、64位要求及数据库的版本等不同要求,所以编译选项显然要提取出来单独处理)。5 R- x C# C" K9 Y
3、定义Makefile 规范。. J2 e, q4 T" B8 ^# w! `1 \
4、定义模块目录结构。
5、定义接口提供方式。# }& p2 F, f2 v) Q
在定义以上内容的时候,一定要遵循一个原则,符合命名规范、尽量可配置、易懂、易于理解。最后组合出的编译命令的字符串不要太长(unix操作系统下,不 同版本的shell 对一个命令的长度有不同要求、同时由于Makefile中如果有很多shell 脚本的话,编译性能也会受影响)。
在我用过的系统中,make 工具,unix 平台我们使用的是 GNU make 版本3.80,java 用的是 ant,windows 平台C++用的是bcb 自带的make,不过在编译前先要将bcb的工程文件bpr文件转换为Makefile文件,使用的工具是bpr2make(之所以不用bcb直接编译, 主要是为拉自动编译,自动分发编译结果)。4 k0 O3 u* ^ Q6 J& Q: O
为了更好的跟踪代码及需求、bug变更情况,自动编译系统,应该从开发人员提交代码开始,到发布结束。+ J8 [! L6 N4 l9 t! q% g& G
流程如下:- O: L+ F$ o$ G- E
1、开发人员提交代码。
2、编译脚本触发,从版本库更新代码到编译服务器。! y! U' v* j9 h3 J! ]$ ]
3、设置编译需要的环境变量。$ I( F% }& D. J5 v
4、构造编译需要的Makefile。" i) l- C5 e* J' G1 L/ y
5、执行编译。
6、分析编译结果、记录编译结果。
7、发邮件通知开发、配置管理、测试人员等相关人。6 X# m! ]/ n5 a4 s3 k$ [: z. Y
8、更新到测试环境测试。& ~2 Z( W" ?! Y. O* s0 `1 d
9、配置管理员发布。; N3 ]5 ~. V7 {/ R8 ~* d7 h
下面我以cvs或svn为源码版本库做作说明,需要写一些适当的脚本,并且需要数据库的配合才能工作的比较顺利。
1、建议用户表
2、在数据库中建立产品表。6 [1 b" [5 Y" H0 P4 F
3、在数据库中建立模块表(需要记录模块优先级、模块路径、Makefile 文件的名称等功能)。
4、建立需求表、任务单表、bug表、编译记录表。$ P0 i$ q( t: h. K) l9 l% Y6 w" X
5、编写代码提交脚本。实现提交代码的同时,在编译记录表中增加记录,并关联需求单、任务单、BUG单功能。
6、编写自动编译脚本。实现定时查询数据库,根据编译单,进行编译的功能。需要实现,获取编译单后,自动生成编译环境所需的环境变量,构造编译用 Makefile,更新待编译代码,编译完成后分析编译结果,给被编译代码打tag,获取编译结果的特征串,然后记录到数据库中,并发邮件通知开发人员、 测试人员及配置管理人员。
如果以上脚本实现,那么,不管你是要日创建还是随时编译,还是全系统编译,都是轻松的事情拉。" i/ E" y3 H, F1 q4 O
虽然windows 平台和unix 平台差别很大,c++和java的差异也很大,但是如果大家将以上要求都用函数实现。我想迁移还是很方便的。/ g! e0 M7 N% {4 n
尤其是脚本语言,多数是支持跨平台的。
这里主要可能碰到的问题是。# a1 S) d- Z2 h1 o+ [8 q5 Q
1、模块结构规划不合理。) M& w5 d/ q$ k( m
2、公共调用文件的安装问题。
3、模块编译顺序的问题。对于复杂的系统,那么调用关系就决定了编译顺序,可能要多次调整。
4、编译结果的安装问题。最好是编译完成通知测试人员,让他们自己安装。否则你自动杀掉他们正在测试的进程,他们会找你算账的。! B0 j0 P7 S u. B1 Y- u) l
5、编译结果的分析问题。编译结果的分析就需要自己写正则表达式来分析日志了,级联编译中是无法通过失败信号获取编译失败的,只能分析日志。
6、邮件发送问题。unix 平台,配置好DNS和sendmail就好啦,windows平台,如果没有找到你所用脚本语言的邮件发送函数,那么你就的自己用telnet 加 smtp 协议实现拉。
6 ~. M0 V& I0 x$ F% O; I$ R
可能有人奇怪我为什么要设计一个数据出来,我想如果有数据库的话,方便维护人员根据编译目标文件的特征串,查找出,这是那一次编译的,生成他的源码有那些,具体版本是什么。$ S* ~3 y" _9 F+ p% ^. }$ u, ]
同时也可以查找出是为那个需求或BUG而修改代码的,修改了那些地方等。同时也可以通过数据库统计,分析出,模块代码的变更情况和工作量,进度等。9 G4 B6 x! I x5 g# @4 A' ?
同时也可以分析出那些人老是提交错,经常容易犯那些错误,编译流程改进,作为cmmi 5级的数据提供。
拉拉杂杂写啦一大堆,希望对大家有用。
转载于:https://www.cnblogs.com/wrmfw/archive/2011/09/08/2170474.html