Posted on 2011-05-13 20:44
幻海藍(lán)夢(mèng) 閱讀(777)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
版本管理 、
配置管理
原文:http://bbs.scmlife.com/thread-16603-1-1.html
一個(gè)項(xiàng)目想要成功,那配置管理的努力是必不可少的。如何做一個(gè)好的配置管理,同時(shí)減輕自己的負(fù)擔(dān),那就是一個(gè)值得認(rèn)真思考的問(wèn)題拉。+ Z, Z7 d1 W/ J/ e) Q0 A* O1 J# i+ X
一個(gè)產(chǎn)品想要實(shí)現(xiàn)持續(xù)集成及日創(chuàng)建,那么非得有一套好的自動(dòng)編譯系統(tǒng)支撐才可以,否則對(duì)于一個(gè)龐大的系統(tǒng)而言,一個(gè)配置管理就算累死也無(wú)法滿足需求的。
下面以我的經(jīng)驗(yàn)說(shuō)說(shuō)任何構(gòu)建一個(gè)自動(dòng)編譯系統(tǒng)。
$ E( i$ {4 U: N
為了更好的自動(dòng)編譯,我想應(yīng)該建立一個(gè)這樣的系統(tǒng),那就是:
1、開(kāi)發(fā)人員或定時(shí)觸發(fā)。
2、自動(dòng)更新編譯環(huán)境。- P$ e; s `% ^" c* U2 A0 L
3、自動(dòng)編譯。
( b: C$ m* F t: W9
w l4、自動(dòng)分析編譯結(jié)果。. U5 A! [6 X4 h6 Z2 ]+ |4 V9 v
5、自動(dòng)通知開(kāi)發(fā)、測(cè)試及配置管理員。$ C+ ~9 h& D! y4 m" c% d
下面我假設(shè)情況如下:
1、操作系統(tǒng):平臺(tái)包括:HP-UX、SunOS、AIX、Linux 、Windows (均包括多個(gè)版本)、。 M! c$ t9 ": k
2、數(shù)據(jù)庫(kù)包括:oracle
8i、9i、10G
3、編譯器包括:aCC、CC、xlC、gcc、bcb(windows 上的集成開(kāi)發(fā)環(huán)境) 、java(包括多個(gè)版本)/ R" N3 J* F$ "% L- R, D' b
4、項(xiàng)目規(guī)模超過(guò)千萬(wàn)行代碼、模塊眾多、調(diào)用復(fù)雜。# H! A# y: "8 J% f7 C, G! j" `( E
那么在這樣一個(gè)情況下,如果我們考慮用一般的商用工具做,顯然成本是很高的。0 y; l( I* Y: x
對(duì)于這樣一個(gè)龐大,復(fù)雜的系統(tǒng),我想在項(xiàng)目啟動(dòng)后,首先要做的是:
1、定義編碼規(guī)范。0 L# S* D9 |' y2 @3 @1 G h
2、定義C++及java的編譯選項(xiàng)(由于C++語(yǔ)言中編譯器及平臺(tái)版本不同,32、64位要求及數(shù)據(jù)庫(kù)的版本等不同要求,所以編譯選項(xiàng)顯然要提取出來(lái)單獨(dú)處理)。
3、定義Makefile 規(guī)范。
4、定義模塊目錄結(jié)構(gòu)。
5、定義接口提供方式。
4 C( J w$ v1 n*
_ {, {+ m在定義以上內(nèi)容的時(shí) 候,一定要遵循一個(gè)原則,符合命名規(guī)范、盡量可配置、易懂、易于理解。最后組合出的編譯命令的字符串不要太長(zhǎng)(unix操作系統(tǒng)下,不同版本的shell
對(duì)一個(gè)命令的長(zhǎng)度有不同要求、同時(shí)由于Makefile中如果有很多shell 腳本的話,編譯性能也會(huì)受影響)。3 U& P* h8 Q6 x& A8 E+ P
在我用過(guò)的系統(tǒng)中,make 工具,unix 平臺(tái)我們使用的是 GNU make 版本3.80,java 用的是 ant,windows 平臺(tái)C++用的是bcb 自帶的make,不過(guò)在編譯前先要將bcb的工程文件bpr文件轉(zhuǎn)換為Makefile文件,使用的工具是bpr2make(之所以不用bcb直接編譯, 主要是為拉自動(dòng)編譯,自動(dòng)分發(fā)編譯結(jié)果)。
2 [3 `" W; x% d- O
為了更好的跟蹤代碼及需求、bug變更情況,自動(dòng)編譯系統(tǒng),應(yīng)該從開(kāi)發(fā)人員提交代碼開(kāi)始,到發(fā)布結(jié)束。( W- J% J4 O4 O/ E, a" m% s
流程如下:( V+ t: ~4 G+ }3 V* e' H; G8 ": k
1、開(kāi)發(fā)人員提交代碼。
2、編譯腳本觸發(fā),從版本庫(kù)更新代碼到編譯服務(wù)器。
3、設(shè)置編譯需要的環(huán)境變量。
4、構(gòu)造編譯需要的Makefile。6
z% i( G5 ~. U2 l( q#
I3 ^+ z9 ~
5、執(zhí)行編譯。
6、分析編譯結(jié)果、記錄編譯結(jié)果。* N2 |9 P5 d% i: N. L
7、發(fā)郵件通知開(kāi)發(fā)、配置管理、測(cè)試人員等相關(guān)人。# k5 |$ u9 ]2 `1 L2 ]0 I
8、更新到測(cè)試環(huán)境測(cè)試。 t, {9 D4 y3 ?7 v( Y5 q8 H- @
9、配置管理員發(fā)布。
2 ]2 b# _: ]5 q5 S# G! S* F
下面我以cvs或svn為源碼版本庫(kù)做作說(shuō)明,需要寫(xiě)一些適當(dāng)?shù)哪_本,并且需要數(shù)據(jù)庫(kù)的配合才能工作的比較順利。
1、建議用戶表
( z q O: |- F0 R6
r2、在數(shù)據(jù)庫(kù)中建立產(chǎn)品表。
3、在數(shù)據(jù)庫(kù)中建立模塊表(需要記錄模塊優(yōu)先級(jí)、模塊路徑、Makefile 文件的名稱(chēng)等功能)。/ w* n9 y' D3 y3 R( L3 u9 x
4、建立需求表、任務(wù)單表、bug表、編譯記錄表。, s' t5 N4 m5 L& t) N- Q* X* [
5、編寫(xiě)代碼提交腳本。實(shí)現(xiàn)提交代碼的同時(shí),在編譯記錄表中增加記錄,并關(guān)聯(lián)需求單、任務(wù)單、BUG單功能。3 O+ N0 n3 e2 p' f
6、編寫(xiě)自動(dòng)編譯腳本。實(shí)現(xiàn)定時(shí)查詢數(shù)據(jù)庫(kù),根據(jù)編譯單,進(jìn)行編譯的功能。需要實(shí)現(xiàn),獲取編譯單后,自動(dòng)生成編譯環(huán)境所需的環(huán)境變量,構(gòu)造編譯用 Makefile,更新待編譯代碼,編譯完成后分析編譯結(jié)果,給被編譯代碼打tag,獲取編譯結(jié)果的特征串,然后記錄到數(shù)據(jù)庫(kù)中,并發(fā)郵件通知開(kāi)發(fā)人員、
測(cè)試人員及配置管理人員。
如果以上腳本實(shí)現(xiàn),那么,不管你是要日創(chuàng)建還是隨時(shí)編譯,還是全系統(tǒng)編譯,都是輕松的事情拉。
雖然windows 平臺(tái)和unix 平臺(tái)差別很大,c++和java的差異也很大,但是如果大家將以上要求都用函數(shù)實(shí)現(xiàn)。我想遷移還是很方便的。1 t" v+ t U' U*
`" N% ~. L
尤其是腳本語(yǔ)言,多數(shù)是支持跨平臺(tái)的。
2 _* W: V3 t/ Q0 _0 C' q/ k" @) j)
T& m這里主要可能碰到的問(wèn)題是。7 r8 O- u! R2 t6 B% @
1、模塊結(jié)構(gòu)規(guī)劃不合理。
: ?# j z: ?' |* g. |0 w. T*
E9 n m2、公共調(diào)用文件的安裝問(wèn)題。
3、模塊編譯順序的問(wèn)題。對(duì)于復(fù)雜的系統(tǒng),那么調(diào)用關(guān)系就決定了編譯順序,可能要多次調(diào)整。
4、編譯結(jié)果的安裝問(wèn)題。最好是編譯完成通知測(cè)試人員,讓他們自己安裝。否則你自動(dòng)殺掉他們正在測(cè)試的進(jìn)程,他們會(huì)找你算賬的。( k/ |( ?$ e' {$ T: q
5、編譯結(jié)果的分析問(wèn)題。編譯結(jié)果的分析就需要自己寫(xiě)正則表達(dá)式來(lái)分析日志了,級(jí)聯(lián)編譯中是無(wú)法通過(guò)失敗信號(hào)獲取編譯失敗的,只能分析日志。
6、郵件發(fā)送問(wèn)題。unix 平臺(tái),配置好DNS和sendmail就好啦,windows平臺(tái),如果沒(méi)有找到你所用腳本語(yǔ)言的郵件發(fā)送函數(shù),那么你就的自己用telnet
加 smtp 協(xié)議實(shí)現(xiàn)拉。- h5 F!
e" h1 R3 N% F5 e
6 `! g" j" Q- l$ f, U8 ^) W0
@# y# y可能有人奇怪我為什么要設(shè)計(jì)一個(gè)數(shù)據(jù)出來(lái),我想如果有數(shù)據(jù)庫(kù)的話,方便維護(hù)人員根據(jù)編譯目標(biāo)文件的特征串,查找出,這是那一次編譯的,生成他的源碼有那些,具體版本是什么。/ n3 i& _+ p9 n5 N) V&
D w
同時(shí)也可以查找出是為那個(gè)需求或BUG而修改代碼的,修改了那些地方等。同時(shí)也可以通過(guò)數(shù)據(jù)庫(kù)統(tǒng)計(jì),分析出,模塊代碼的變更情況和工作量,進(jìn)度等。8 W/ |; s& w& x* v( |
同時(shí)也可以分析出那些人老是提交錯(cuò),經(jīng)常容易犯那些錯(cuò)誤,編譯流程改進(jìn),作為cmmi 5級(jí)的數(shù)據(jù)提供。1 P/ e5 r$ D8 u0 j7 x' q' R0 ?
拉拉雜雜寫(xiě)啦一大堆,希望對(duì)大家有用。
看到論壇里面有很多人詢問(wèn),工具的選擇和使用問(wèn)題。個(gè)人建議:如果沒(méi)有采購(gòu)的想法。那么我建議使用SVN做版本管理工具。理由如下:
一、SVN的開(kāi)發(fā)團(tuán)隊(duì)就是當(dāng)初CVS的開(kāi)發(fā)團(tuán)隊(duì)。( q3 "9 K- W( V" O* i/ n/ S" D
1、正式由于CVS的很多缺陷,所以才放棄CVS,改開(kāi)發(fā)SVN的。
2、CVS以后只會(huì)修改BUG,不會(huì)在出新功能拉。
3、CVS的權(quán)限功能很不完全,猶如雞肋。
二、SVN相對(duì)于CVS有很多優(yōu)點(diǎn)。) o+ p; C1 M3 f
SVN的優(yōu)點(diǎn)如下:
1、天然支持web。SVN服務(wù)器是可以和apache集成的,所以天然就支持HTTP協(xié)議,就可以通過(guò)互聯(lián)網(wǎng)訪問(wèn),同時(shí)可以使用apache的權(quán)限系統(tǒng)。而CVS只能通過(guò)CVSWEB來(lái)通過(guò)瀏覽器訪問(wèn)。4 ^1 h3 V2 ]0 P( Z# [ q, `; "$ q
2、SVN支持文件的移動(dòng),支持文件的改名,支持目錄版本。
3、SVN提供拉API,提供拉各種語(yǔ)言的開(kāi)發(fā)庫(kù),這個(gè)是CVS所不支持的。CVS的二次開(kāi)發(fā),只能通過(guò)命令行的方式做腳本,否則你就要在CVS的C代碼中做接口,才能增加或修改功能。
4、SVN便于和自己開(kāi)發(fā)的配置管理工具集成。原因如上。8 |3 g7 P o/ _
5、SVN可以通過(guò)LDAP和公司的域結(jié)合起來(lái),實(shí)現(xiàn)單點(diǎn)認(rèn)證。
三、相對(duì)于CVS和SVN,VSS有幾個(gè)個(gè)很大的缺點(diǎn)。
1、VSS是基于CHECKOUT、鎖模式的,而SVN和CVS及基于CHECKOUT、合并模式的。后者顯然更適合協(xié)同開(kāi)發(fā),適合多人修改同一份代碼。而且作為配置管理員,也不用疲于奔命的去刪除鎖。
2、VSS只支持windows平臺(tái),而CVS和SVN是跨平臺(tái)的。也許一時(shí)無(wú)所謂,但是如果有一天公司轉(zhuǎn)向類(lèi)unix平臺(tái),你就得遷移配置庫(kù),重新編寫(xiě)使用手冊(cè),并且做培訓(xùn),為什么不把問(wèn)題消滅在萌芽狀態(tài)呢。* }0 x4 `" `4 e2 `7 Q5 `% _
3、VSS是要共享目錄以便訪問(wèn)。這樣在網(wǎng)絡(luò)病毒猖獗的日子里,你就和病毒做斗爭(zhēng)去吧。同時(shí)代碼安全和是一個(gè)大問(wèn)題啊。
4、VSS是不支持web訪問(wèn)的。9 V5 b: _" E1 U# ?1 X" o
5、權(quán)限配置也不夠友好。" S. y$ J, X8