您的位置:首页 > 其它

关于自动编译的一点经验

2011-09-08 06:09 197 查看
一个项目想要成功,那配置管理的努力是必不可少的。如何做一个好的配置管理,同时减轻自己的负担,那就是一个值得认真思考的问题拉。" [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级的数据提供。

拉拉杂杂写啦一大堆,希望对大家有用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: