bash脚本:depweb.sh% r, D! @9 U. V$ b
运行环境:linux/UNIX操作系统,CVS配置管理库,ant工具,JDK
局限性:只对java代码进行构建
实现功能:取出全量版本标签(代码基线标签)代码,进行构建,封装打包(tar ball)
把包发布给部署人员进行部署,部署完毕通知测试人员可以对此版本产品进行测试。" ~) |( }$ q* ^& `% |
编写此脚本的目的:简化基于java代码项目的编译,完成一个通用java代码的构建脚本,通过对配置文件的设置来达到对多个项目进行构建。; o, ]% |  ^4 j7 n$ F2 N6 g

运行前可以通过执行
depweb.sh -h  来查看脚本的帮助(简明使用方法)# |# w! b+ k- p2 g, V8 r& f
运行前需要设置配置文件,可以通过执行2 u& r' O: h% Q8 a
depweb.sh -i project ' w. }% k" X# s2 b! ^1 b8 Z$ V
生成project-build.properties配置文件,配置文件内容填写实例如下:)

1. # Must set the "CVSROOT" environment variable
2. CVSROOT=:pserver:user:passwd@cvs-server:/cvs/repository/root# I# G+ d. l( T- R% I1 H9 v) Y
3.      
4. # Must set the module name of project in CVS Repository( Q1 H* A! a3 |5 v2 \6 o6 H
5. MODULE_NAME=projectsample' I, \) }( O  J
6.      
7. # Must set the "$module" source code path relative to \$CVSROOT5 z# j* v3 w  _; b3 ]0 f' K
8. SRC_PATH=projectsample/codepath/  L  F6 T8 u3 J$ E
9. ( z# J& ^( D; k" |+ ]  }4 x
10. # Must set the java files path relative to $SRC_HOME
11. javadir=src"
12. 
13. # Must set the class files path relative to $DST_HOME4 j" V, ~$ v& b& o! m3 L* u4 q9 B
14. classdir=WEB-INF/classes
15. 6 h  p7 ?' d3 v5 _$ q
16. # Must set the jars path relative to \$SRC_PATH3 ?. m* P& h0 H1 [7 X
17. srclib=WEB-INF/lib
18. - m3 J* |) O) S
19. # The absolute common lib path
20. svrlib=/userhome/soft/tomcat/common/lib
21. 
22. 以下内容为脚本内容,此内容包含整个构建打包过程以及一个build.xml的模板
23. ####################################################
24. #prog:depweb.sh                                                                                                   #  C6 u$ X+ `" N+ ~& ~6 e
25. #func:Web Application build create and tar package                                              #+ v7 @1 n( ?" G5 _, v- T- @
26. #vern:1.6                                                                                                                #
27. #auth:liurs                                                                                                              #
28. #comp:FORLINK                                                                                                      #1 p* `6 k3 O9 r% r) x
29. ####################################################+ V! n9 t2 K, |9 o/ y2 \
30. #!/bin/sh
31. 2 g# K4 V1 a% z1 N+ H
32. usage()
33. {* P" S3 \3 u$ K6 V
34. 5 s1 _0 t' z& j5 y- y5 ?& a
35.         echo        "USAGE: $PROG [-a|--add] [-h|--help] [-i|--initial] [-c|--complete]"
36. 5 `" O4 }7 O, e( d7 q0 j
37.         echo         "WHERE: -h --help         = Display help infomation"
38. & W4 ~& k' V' n: e% t
39.         echo
40.         echo         "        -i --initial        = 设置配置文件,初始化构建环境"
41.         echo         "Usage: $PROG -i <模块名>"
42. ; ^7 ^1 r: `6 F" r) x4 T* I; }: f
43.         echo         "       -a --add         = 直接增量部署,用如下格式:"
44.         echo         "Usage: $PROG -a <增量标签> <模块名>"
45.         echo
46. 5 [. G  A) u3 Y% L
47.         echo        "Usage: $PROG -c <全量标签> <模块名>"
48. : l% Z4 b. S8 Y; _1 V+ C& H
49. ) B2 f8 d5 r& F9 s& O0 u( B+ T. t  P) h
50. ; e8 ?" r+ |. s2 W
51. ( \. H. a. T: N, ?, [
52.         return 0
53. }
54. 0 b9 Y. o3 X. l
55. setsample()+ [7 W: N8 E0 Y# ~
56. {

57. - ^7 M# K, V+ Z7 w4 C" S
58. 7 K/ |9 `0 W# u- L% ]! [- y- k! `" w0 l
59. 6 k) I8 m5 j9 u: W8 J3 z$ k% M8 T. R
60. , s, a3 a! ^" |1 I- b
61.         echo         "* such as: "
62.         echo
63. 3 s* M; P  M+ X0 ~7 j
64. 7 f. m  ?: Q+ Q; X! J% c5 I
65.         echo
66.         echo        "# Must set the module name of project in CVS Repository"
67. , P# {* ?; y3 Q; H$ j/ e5 ~! i
68. % o4 {, i! M! g( n2 B( g# s, P/ J
69. ! q9 z9 l+ l  r5 _6 a3 X
70.         echo         "SRC_PATH=projectsample/codepath/"
71.         echo
72.         echo        "# Must set the java files path relative to $SRC_HOME"
73.         echo        "javadir=src"
74.         echo
75.         echo        "# Must set the class files path relative to $DST_HOME"
76. $ a: P. O' m! @/ d" S3 A
77. 4 J5 K0 A3 b4 Y/ n
78. ! \, w8 m5 I. R
79. 6 g7 d4 M$ P6 g4 R4 {& Z. g
80. 2 ?" w4 }# p: x. O6 P6 I* J
81.         echo        "# The absolute common lib path"
82.         echo        "svrlib=/userhome/soft/tomcat/common/lib"
83. 8 I" \9 Q$ Z% `$ ]: M' @- K
84. 5 C% R' J0 ?; t
85. }
86. 8 _: \9 \9 w* k' q
87. echoxml()
88. {" [' i* C, j3 E( D
89. echo '<?xml version="1.0" encoding="GB2312"?>
90. <project name="proname" default="all" basedir=".">; n, ?/ }# x! y4 f
91.     <property environment="sysenv"/>
92. * G5 L6 c9 C$ D
93.     <property name="proname"            value="${sysenv.MODULE}"/>
94. 3 c4 G! G+ F7 w
95.     <property name="dstdir"             value="${sysenv.DST_HOME}"/>
96.     <property name="depdir"             value="${sysenv.DEP_HOME}"/>
97.     <property name="wwwdir"             value="${sysenv.WWW_HOME}"/>
98. " T# ~: U% `; b! A+ c8 G
99.     <property name="cvshome"            value="${sysenv.CVSROOT}"/>
100. / p% E) B& n0 x% E( U6 j& g
101.     <property name="buidir"             value="${srcdir}"/>
102.     <property name="buidir.java"        value="${buidir}/${javadir}"/>
103.     <property name="dstdir.java"        value="${dstdir}/${javadir}"/>
104. / {% w" [* w' D  s
105.     <property name="comlib"             value="${svrlib}"/>
106. $ O' [% G% N- q2 H! E* Q; |
107. 
108. ' g/ g' n6 Z. z) W, n
109.         <fileset dir="${devlib}">
110.             <include name="*.jar"/>
111. ' M' r/ N" b( g. ?4 T# }; S+ d; `
112.         <fileset dir="${comlib}">
113. 4 _5 J9 p  E3 F) ]& s
114.         </fileset>
115. : i5 ^! y8 n3 X! u5 r
116. - L* _9 e) J! v0 h7 q' G
117. 8 a0 a3 E" J4 e( c
118.     <target name="all"  depends="clean,init,copy,compile,deploy"/>
119. : ?/ c7 H' R0 n* u
120. ' e* E# P7 h" {  _1 Z* w
121.         <mkdir dir="${dstdir}"/>
122.         <mkdir dir="${depdir}"/>
123. , o5 X4 h8 O/ D+ e* G
124. 6 T6 R6 g1 z$ R0 F6 E2 a, H
125. 
126. ! t6 Y9 [- C" t5 q* a3 u/ i
127.         <javac srcdir="${buidir.java}" destdir="${appdir}" debug="true" deprecation="false" optimize="false" failοnerrοr="true" encoding="gb2312">
128. : v  n: Q3 O) S. q
129. 1 }% t2 }: I( U
130. / z- ^) }& D7 z3 S% `0 N4 T% F
131. + K7 V7 N) d, ^: K# q4 Z1 M0 V7 J
132.     <target name="clean" depends="clndst,clndep" description="Clean output directories"/>
133. 
134. 6 J0 A3 O( U) P$ ^
135.         <delete>
136.                 <fileset dir="${srcdir}">
137.                         <include name="**/*.class"/>
138. * n2 [1 d+ h- n7 N
139. 0 T+ n6 G5 e: d- B# [5 q* @$ F
140.     </target>
141. 8 G* G( E* z+ a3 F9 R
142.     <target name="clnjava" depends="" description="Clean out source code file">
143. 9 h& i3 L" P! S. [- n% Y) ~$ N
144. / H4 W* K  Y8 L! P4 E# ]2 I. [
145. . @, n4 Z6 V2 p: n/ e: ~
146.                 </fileset>
147.         </delete>
148.     </target>
149. 
150. 
151.     <target name="clndst" depends="" description="Clean out dest directorie">
152. 2 ]" R5 I$ ^9 y* C% i) X
153.     </target>
154. 6 o. `. i8 `' h0 }- p* ~
155. 7 H9 K5 A/ o/ w5 z) c, ?
156. ! a) f( L( r- Z
157. ) c1 ^& B: h& d- z, j. {. i9 F! K4 e
158.                 <include name="*.tar"/>
159.         </fileset>
160. : Q6 v( k" j; g- E0 x, X
161. 3 r9 F3 f. w4 }' q. \) c( G3 O4 ^
162.   S+ S1 E. M  O5 l6 E; ^, B
163. % D% ~. V1 r1 `+ ]3 z. F
164.         <copydir src="${buidir}" dest="${dstdir}"/>
165. 7 L* u3 V+ G* N! `- J
166.                     <fileset dir="${buidir.java}">
167.   F' r8 S& ?, o8 Q/ E
168. 9 n. T$ x+ d4 U
169.                 </fileset>
170. ' E  p7 y+ o/ S  X  |
171.         <!--delete dir="${dstdir.java}"/-->
172. 2 |. S  L# u) t6 x  _: b  w
173. 
174.     <target name="deploy" depends="init" description="Create web tar file">
175. ! I2 a2 I! B) W
176. ! Q3 ]0 ^, a7 t7 |: I' r, V# w. B
177. 
178.   Y5 ?0 R* H+ ~- c- f+ O& c* Z# \
179. : }2 S$ p+ P' n  ]3 ^+ ~
180.         <!--<cvspass cvsroot="${svshome}"/>-->
181.         <cvs command="export" tag="${tagname}" failOnError="true" cvsroot="${cvshome}" package="web/impl" dest="${srcdir}"/>
182.     </target>
183. </project>'
184. return 0
185. }
186. : C5 Y, w" v$ z( k9 v# l6 E6 F
187. echocfg()4 m+ w' O) S5 C; Z0 d  C7 W
188. {! C8 I) x" L5 d) j9 x4 \, I
189. echo '#The config file of depweb.sh and build.xml
190. ) [* s# _% Z; _6 f( I' u1 I! _
191. # Must set the value of "CVSROOT" environment variable
192. CVSROOT=
193. 
194. # Must set the module name of project in CVS Repository
195. MODULE_NAME=  n, Y1 U. |7 @9 c
196. - D" s; G5 d% N
197. # Must set the "$module" source code path relative to \$CVSROOT3 o" q, h4 G1 v' A: b
198. SRC_PATH=
199. 7 y- z) w( m+ V( S* U" q; k5 z
200. # Must set the java files path relative to \$SRC_HOME
201. javadir=7 ]/ s6 j1 p$ R5 t
202. 
203. # Must set the class files path relative to \$DST_HOME( s1 o. d, C# t7 B& T7 W; Q: t9 ]
204. classdir=
205. 
206. # Must set the jars path relative to \$SRC_PATH: W# I; P* N9 |; q) w5 i  h# J
207. srclib=) b* v# J: K0 t" Q/ m
208. 
209. # Set the absolute common lib path* i0 n5 _$ d7 r  `
210. svrlib=
211. '6 I/ B  o' \" K4 o0 x. z
212. return 0/ v1 }% X6 y  a" h# F6 P
213. }( d" Z* d7 P6 k) x
214. 
215. cmpdir()
216. {

217. echo '. a* `1 N- v; P: C
218. #!/bin/sh( M* m5 [0 {' o
219. cmp_dir()3 n0 d% l* `: K% k: A7 v
220. {

221. RET=0
222. cd $HOME_DIR
223. DIFF_NAME=$HOME_DIR/diff.err# b: O( _- \# x: M1 e3 ~
224. EXIST_NAME=$HOME_DIR/$3.exist.err* m7 R6 t/ S4 ^0 I
225. >$EXIST_NAME
226. >$DIFF_NAME/ V7 c' \3 A7 \9 ^1 Y+ c( b" w
227. if [ ! -d $1 ]
228. then, V7 n5 A* m& y9 K
229.         echo directory $1 does not exit!
230. % {* h% B, L6 |2 M! Z, F
231. fi8 w' M2 Q2 H( N/ C/ E
232. if [ ! -d $2 ]
233. then
234.         echo directory $2 does not exit!
235.         exit 2
236. fi4 m: `# }6 ^9 @- ]
237. 
238. cd $1
239. for i in `find . -type f ! -path "*\ *"`( \& I8 U% W6 w4 V4 M
240. do
241. & H* C! [& s1 Q# u
242.         then
243. 5 @/ `: }6 p+ U3 q
244.                 if [ $? -ne 0 ]
245. 8 J- Y4 v( o# S: B
246. 9 y' H% {4 n/ F
247. 5 P3 I+ f8 C+ c; e
248.                         echo $i >>$DIFF_NAME
249.                 fi
250. 3 Z; M/ v6 @* v4 H5 W6 t+ B
251. 0 m# ?+ ?. [' c  Z, C1 u9 W
252.                 #echo $i
253.                 RET=1
254. ) g1 I9 z+ t: V/ X( \5 f5 O
255. 
256. 4 q. \& R/ C% o& ]" v0 w
257. done
258. cd $HOME_DIR' g) T4 G; |, k/ |9 I) A
259. return $RET
260. }* d2 I+ p, K, d7 u
261. 3 {/ T8 U" h8 I. `  i
262. HOME_DIR=`pwd`
263. if [ $# -ne 2 ]4 C! T& c) I9 r8 S2 N
264. then
265.         echo "Usage: `basename $0` 目录1 目录2"
266. % l( o+ \2 e4 C7 |! ~, D
267. fi) i0 I3 E% F( r' C
268. : u0 C# H4 q, M) P6 b, z! U, T
269. DIR_1=$1
270. DIR_2=$2
271. 2 |8 w0 b- i% Q# I0 `
272. if [ `expr substr $1 1 1` != "/" ]- v: {0 R: X; T
273. then7 n; K$ O; M5 E# X
274.         DIR_1="$HOME_DIR""/""$1"
275. fi
276. 
277. if [ `expr substr $2 1 1` != "/" ]. q' ]0 M0 j/ x, V% |( m
278. then+ g# n3 _' D+ g. h
279.         DIR_2="$HOME_DIR""/""$2"
280. fi
281. 7 M7 Z$ d: f8 y- N
282. #echo 第一个目录
283. cmp_dir $DIR_1 $DIR_2 1
284. RET1=$?; N# g7 c" r  [0 g1 w1 O# i
285. #echo 第二个目录
286. cmp_dir $DIR_2 $DIR_1 2" v! Q% T3 }- Q& x* R. W
287. RET2=$?
288. 
289. RET=0! F9 C! w! L0 s3 B, i
290. cd $HOME_DIR) h7 G. J0 i6 o! V
291. if [ $RET1 -ne 0 -o $RET2 -ne 0 ]
292. then, D) N2 ?+ I! k6 r
293. $ i1 f; c( i- C0 S9 Y1 K+ Z7 T
294. : L1 J! Z9 ]% M" R+ f
295. 5 H( B9 U6 [3 u
296. fi; o1 ^4 M: i2 H. Y
297. 
298. exit $RET'2 \  f. @/ V2 ^6 p$ U" _
299. return 0& r; P+ \+ C: U
300. }3 q7 ~3 |/ A' t6 ^/ e
301. ! G. c0 c* E  @0 G; R
302. #check environment
303. 
304. if [ -z $JAVA_HOME ]
305. then/ S: H3 @# `" q$ C1 W% S
306.     echo "Environment is wrong,please check the environment!"
307. : M( g* f8 u2 k7 k9 z. J/ m
308. fi6 N' q, o4 T- X8 W6 ~6 T% i
309. & k9 D- Z' q4 r( ?0 J
310. if [ -z $CVSROOT ]- f( C* H/ t* _$ B- d  G/ W" O
311. then
312.     echo "The CVSROOT environment variable isn't setted"
313.     #exit 1
314. fi" h4 K9 X' d; Q% [) y9 B
315. + J: H, B( V9 q' E% o# L" L& X% E# p
316. if [ ! `which cvs` ]
317. then
318.     echo "The cvs command is not setted in \$PATH or cvs isn't installed!"
319.     echo "Please check the environment or installed"
320.     exit 1
321. fi) `" G1 {# w2 q$ ?( X7 D* x9 M
322. 3 g" h1 {9 c6 C. i9 `8 F+ Z
323. if [ ! `which ant` ]
324. then
325.     echo "The ant isn't installed"
326.     echo "Please install the ant"
327.     exit 1
328. fi
329. if [ ! `which cmp_dir` ]
330. then
331. / I, W3 d: F2 i; u5 R, S
332. 9 F0 U# y3 Q3 ~7 N& n3 w3 x) C
333.                 mkdir -p $HOME/bin
334.         fi
335.         cmpdir >$HOME/bin/cmp_dir
336.         chmod +x $HOME/bin/cmp_dir
337. 6 P' v" h* H8 g! r% r0 q+ }
338. fi& b& `" F8 ]' {5 ^$ h; F3 n- v
339. 
340. PROG=`basename $0`, T& W# b- g1 v3 o5 G, b
341. ARGV="$@"
342. ARGC="$#"
343. 
344. export DATE=`date +%Y%m%d`
345. if [ `uname` = Linux ]' r$ k/ w) K! a8 m/ M
346. then
347. 1 {% o7 f7 G  R: _  l
348. elif [ `uname` = HP-UX ]
349. then
350.         export LANG=zh_CN.hp15CN
351. else/ g! E, F. _3 U8 H
352. " x! s* H+ G$ I3 t
353. fi
354. 
355. if [ $ARGC -lt 1 -o $ARGC -gt 3 ]
356. then
357.         usage;exit 1;
358. fi/ `& N( i, W- h5 o
359. 
360. if [ `uname` = Linux ]
361. then8 D# a7 ]/ [: ?; @2 C9 b; T
362. & `9 Z3 f, N9 F
363. else  \. h# j$ @: v% i
364.         OPTS=`getopt haic: $*`
365. fi6 U! R, y: P+ F0 Q: j6 g
366.        
367. if [ $? -ne 0 ]; h9 _% T* [/ K0 p& H, [8 V( m+ N
368. then
369.         echo "Please use $PROG -h"
370.         exit 1
371. fi
372. #eval set -- "$OPTS"% [3 j, ?- p8 e4 q! |) e% l' A- g; T
373. for args in $OPTS
374. do
375. 0 _. y+ b. X4 U+ b% m: G' H( X
376. . ~/ i% _/ v3 N6 q! e
377. 8 P7 ~4 i" m! g' k/ y: r
378.                         then
379. 3 O" j# C4 d* w# Y5 g- b
380.                         fi
381.   G& ?, Y" O. e6 R8 P" R+ N
382.                    -a|--add)               
383. ( ]: ?6 d. F+ S' @! _
384.                         then
385.                                 usage;exit 1;
386. / ^% T, a% W' C5 v/ ~( S
387. 3 O' o4 p  F1 B2 [5 V" O( w' G
388.                         export MODULE=$3
389. 7 Y% f( O; L2 J" U$ d9 q
390.                         if [ ! -f "$BUD_CFG" ]                             
391. 1 H- Q2 K" ?# [
392. 6 k4 p0 o+ u# ~" I
393.                                 echo "Please use: "depweb.sh -i <$MODULE>""
394.                                 exit 1                                    
395. 2 w  r2 T$ d- V: }8 V
396. ; v) |+ y. u, v! y5 _
397.                         break;;
398. * {9 ]' g( y& t+ Z5 w
399.                    -i|--initial)       
400.                         if [ $ARGC -ne 2 ]
401.                         then
402. * |% W2 T8 Y! D. z2 @6 @5 E
403. 9 Q. v, h* D- U" G. N1 {- h7 f
404. ; P0 f$ O/ V1 C( U7 V2 F% D
405. * G5 c, q  R, H0 E6 R- \0 Q
406.                                 echo "Not install vim"
407. 3 X$ |# O* U* G( W
408. . c2 w5 z0 a+ L2 H# \8 v" |
409.                         export MODULE="$2"
410.                         BUD_CFG="$HOME/build/"$MODULE"-build.properties"
411.                         if [ ! -f "$BUD_CFG" ]
412.                         then
413. ! b. k2 o! D( c) F
414. 1 @: V. q5 W/ w) h& E/ Y6 k" ]
415.                                         mkdir -p $HOME/build
416. " s) `; y! e+ G6 {1 o
417.                                 echocfg>"$BUD_CFG"
418. - W( |9 |; {( I% G& J
419.                         setsample;
420. 8 P0 i& H! z! N- z% p. g
421. 9 C" N+ c5 A& J1 J7 H
422. ) n' r) T4 v( l; R
423. 3 f) ~8 a, l/ v. K) [
424.                         exit 0 ;;
425.                         #break;;
426.                         #shift;;         #increase files deploy
427.                    -c|--complete)        
428. 8 Z% o+ o; q' G' n7 @, N
429. 1 s; U& z: F; i9 A  r/ a  |
430.                                 usage;exit 1;
431.                         fi
432.                         export CVSTAG=$2
433. 5 X" Q0 {) T" @7 w, D$ ~# |
434.                         BUD_CFG="$HOME/build/"$MODULE"-build.properties"     
435.                           if [ ! -f "$BUD_CFG" ]                             
436.                           then                                               
437. ' [: K6 v# h! c7 m; g' z: U8 G# b
438. : E, ^: w# O2 F3 t
439. : C5 L: B7 [  n) n2 y4 L
440.                           fi                                                
441. ' d' s4 V4 U- W$ f" m0 R1 d+ X
442. ' F1 n- W0 H! I( K. f" B0 Q
443.                         #shift;;         # complete files deploy
444. 2 K6 d0 e* G$ G! ?8 \
445.                         if [ $ARGC -ne 2 ]
446.                         then
447. 3 B+ l0 m- S/ O3 N
448. 7 q. P  V% L3 J& f! L/ {
449.                         fi
450. 2 ?  @! \5 {. q* u4 T4 _( X
451.                         export MODULE=$2
452.                         FLAG="cmpold"
453.                         break;;
454. % |8 m4 b" b  b5 \
455. 9 F+ x7 C/ i8 m( a
456. 8 L8 R! ~! F  U  ]9 }
457. 4 y% ^7 \5 ~4 w: Y3 z6 V+ e# V7 [
458. done1 B+ s! S& t* Z$ n0 H& C( E
459. 
460. #init part/ f; \, z" `% i7 R
461. ' J% h$ L5 O8 W
462. rm -rf $HOME/build/src! h* @7 y1 ^# T8 \' [% f, u: F
463. 
464. if [ ! -d $HOME/bin/tmpdir ]
465. then$ t% u) {  d. h. P0 u+ y
466. & H! @" _, V% F+ N0 B
467. fi
468. if [ ! -d $HOME/build ]
469. then . L7 U  `& U0 U6 V
470.     mkdir -p $HOME/build
471. fi
472. if [ ! -d $HOME/build/src ]
473. then  ]2 h% H9 H2 u% ~. D
474. + t! [. s) s9 _6 H( r8 o  a# Y
475. fi) P7 g, l: }( B. N, r1 V# ~  n
476. if [ ! -d $HOME/build/dest ]
477. then3 Q9 D# ?; D0 Z" |
478.     mkdir -p $HOME/build/dest
479. fi
480. if [ ! -d $HOME/build/deploy ]
481. then" F0 ^  A2 `- f) `/ U
482. , T8 D0 @# `, ?- Y; N# N
483. fi
484. if [ ! -d $HOME/deploy ]
485. then0 ~  r3 A; q2 T0 l8 O
486.     mkdir -p $HOME/deploy
487. fi
488. 
489. export SRC_HOME=$HOME/build/src1 j' A( \2 u  D2 ^8 Y4 |/ ^
490. export DST_HOME=$HOME/build/dest; `3 @& I: q# J8 O* Q; @
491. export DEP_HOME=$HOME/build/deploy
492. export WWW_HOME=$HOME/build/deploy/$MODULE4 `& D  f4 E' o
493. ; O5 H9 j# J( \; G( ]
494. BUD_XML="$HOME/build/build.xml"
495. . g% S5 t( R' d3 F, h# ^9 [
496. if [ ! -f "$BUD_XML" ]
497. then
498. 5 l  Z5 l/ \6 M) K5 e
499. * U9 W! I5 d1 E6 \1 x# M
500. fi
501. 
502. BUD_CFG="$HOME/build/"$MODULE"-build.properties"
503. * a- I& D' |% K! ^: @& X4 C
504. if [ ! -f "$BUD_CFG" ]. ]  B) D8 F4 b; {2 p
505. then/ W* W/ i0 l  N/ N
506.         echo "The $MODULE has not been initialed!"
507.         echo "Please use: "depweb.sh -i \<$MODULE\>" to initial the \<$MODULE\> module"
508.         exit 1
509. fi; Q- K1 H: V3 J+ h
510. " R1 A% K; [' J
511. export CVSROOT=`grep "CVSROOT=" "$BUD_CFG"|awk -F = '{print $2}'`' T6 ^1 _4 N, k1 `* ]# i' ^
512. 
513. SRCPATH=`grep "SRC_PATH=" "$BUD_CFG"|awk -F = '{print $2}'`4 O9 r. k; q  I' f7 _
514. 
515. if [ ! "$SRCPATH" ]# n! [2 R# a- O% T/ v
516. then
517. / T) M3 p8 A- G/ u/ f. Y
518. ! m0 w2 @* |# p+ j) I
519.             exit 1
520. fi
521. ( b$ C$ V8 G( }6 |1 Q7 T
522. CONFLST=`cat $HOME/build/config.lst`
523. DEPFILE=""$MODULE"-"$CVSTAG".tar"
524. JAVADIR=`grep -w javadir "$BUD_CFG"|awk -F = '{print $2}'`
525. SRCLIB=`grep -w srclib "$BUD_CFG"|awk -F = '{print $2}'`
526. 
527. #========================build part========================#
528. echo "cvs login"1 W. F; [5 O/ }+ Q
529. cvs login
530. echo "cd $HOME/build"8 m! p. ~: o. f' m- c4 q! _
531. cd $HOME/build
532. echo "cvs -q export -r "$CVSTAG" -d src "$SRCPATH""/ V; U* }! `: |
533. cvs -q export -r "$CVSTAG" -d src "$SRCPATH"
534. if [ $? -ne 0 ]/ t* I- E! u" m
535. then
536. * B* T% l5 V# q, R
537. 8 M. \. e! G6 r+ \0 p
538. fi
539. 
540. ant clean
541. if [ $? -ne 0 ]
542. then 9 K; n# |( D! V: ]  y4 m! ~
543.     echo "ant clean target have error!"
544.     exit 1
545. fi
546. 2 |: _& _# e& f% R
547. ant clnclass. I# L. B$ `0 L* Y1 {# Q
548. 
549. ant copy
550. if [ $? -ne 0 ]
551. then
552.     echo "ant copy target have error!"
553. . u4 I/ Z( j& E3 w: |& i
554. fi* \; R* e7 q0 v3 L7 J4 ?9 _
555. 
556. ant clnjava' |6 q) l4 B& K5 ]6 H" ]3 m9 l
557.   x' B* e7 F  t- p
558. if [ $FLAG = "cmpold" ]6 K- P% b: H8 q
559. then4 G" Y3 F: c5 {$ T% k, X' i1 `4 G
560.     export srclib=$SRC_HOME/$SRCLIB
561.     TARNAME="$MODULE"-"$CVSTAG"-add.tar
562.     if [ -d $SRC_HOME/$JAVADIR ]
563. - W  [( @2 ^0 Z2 r$ s$ b% e- S8 o
564.         ant compile
565.         if [ $? -ne 0 ]
566. # q, d7 f/ ~( n3 H# M  D. U
567. ( C* c3 J( c4 _  r1 i- u
568. - U- ~* N  e: M' c+ q
569. : j, s* i+ I0 F* O  C8 _( ^
570.     fi
571.    
572.     cd $DST_HOME
573. $ y( u* y( I6 d# R' E
574. . {/ [+ J; n6 j7 L$ }
575.     do
576. $ ?) Y/ r: }  k  T2 q8 s
577.   @) l; A6 h( {" r: G9 p% x. I
578.    
579. ( a( `9 {9 ^% j' f: L8 Y9 Y+ A
580. 8 G) c& Q+ l" S# |
581. 
582. #========================package part========================#
583.     cd $DEP_HOME
584. % H4 n6 o$ n5 v' t8 ^$ t, E1 c% i
585. 6 g5 A, O* L, i# ?
586.     cp "$DEPFILE" $DEP_HOME/"$MODULE"-dep
587. * }" x9 a* ?$ n* l/ d
588.     tar xf "$DEPFILE"
589.     rm -f "$DEPFILE"
590.     cd $DEP_HOME
591. , n9 L, s& H, K2 r' V8 H
592. 7 [0 ]% Z0 r8 p8 ~( w
593. & `% I' a9 Y, M; j0 }  w5 U
594.     then
595. ; K' v! y4 h5 s1 f/ M5 z5 ~
596. " v$ m9 @6 p% i$ @6 @& ^, B: C
597. 4 X6 m( V7 B/ J. v7 h$ t4 `5 ]6 b
598. # ^. Q6 p  N0 v2 a& q
599.     fi
600. 
601.     cd "$MODULE"-dep
602. ) S" B9 F. {. n
603. 9 L# ~  W/ i4 e' E4 l$ P5 D$ f+ H! L
604. $ r" X# [! e9 ~
605.             tar uf "$TARNAME" `cat ../diff.err`
606. 1 S# M9 d# V/ U+ p4 n
607.         tar cf "$TARNAME" `cat ../diff.err`
608. + x% Z- u1 I. v0 ]  k3 n
609. + l1 x+ M/ f* C; I0 V2 y" ^
610.                 echo "$TARNAME is not created !"
611.                 exit 1
612.         fi
613. $ S: j% I, [% T2 a$ C
614.     rm -rf $HOME/deploy/*
615.     mv "$TARNAME" $HOME/deploy
616. 4 x) K  T% q+ e# y
617.     cp $HOME/deploy/"$TARNAME" $WWW_HOME
618.     tar xf "$TARNAME"
619. , `) k' W* o2 l9 m$ R
620.     echo "The add tar is created successfully!"
621. # L4 \: {) r8 Y" `1 D
622. elif [ $FLAG = "complete" ]- c, u' e/ @+ ~0 T% g' x
623. then
624. $ h2 U5 y! T" Q: N0 X5 R" B
625. + w* r. l' i0 W1 J8 B5 }; [
626. / E: K' j( Q8 s3 v1 C3 ^
627.     then
628.         ant compile
629.         if [ $? -ne 0 ]
630.         then
631.                 echo "ant compile target have error"
632.                 exit 1
633.         fi
634.     fi
635. / D5 ]& [! f4 O: t9 a
636.   u  b0 L9 b; ]% p
637.     tar cf "$TARNAME" *
638. ; x" {: u& t' K& v2 h
639. , @& {& g; ^: w7 S6 Q% p
640.     cp $DEP_HOME/"$TARNAME" $HOME/deploy
641.   U. v3 f4 M0 M2 P9 g$ s
642. 3 P& _1 L. g, O2 t1 Z& `) F
643. - S2 U# C4 P6 i/ `) n- k
644.     mv "$TARNAME" $MODULE
645. - p, p1 z/ b% Z
646.     tar xf "$TARNAME"
647. , m' q$ ]9 ]% K4 Y: F7 O" g& p: v6 f
648.     echo "The whole tar is created successfully!"
649. 2 t7 G7 M9 d0 z9 r+ h4 G  w
650. elif [ $FLAG = "add" ]2 u! [) s' S7 S: [
651. then) }& c8 O& b  C4 m
652.     export srclib=$WWW_HOME/$SRCLIB
653.     TARNAME="$MODULE"-"$CVSTAG"-add.tar
654. ( M5 C$ W7 F) p  l$ ^
655. 7 _: M% q! j8 y" A
656. ) X. R7 ~5 x  X+ x  }' E
657. * p/ x$ t4 y+ H2 O1 k+ Q; A
658. - k/ S7 Q. U8 T# Y
659. & A/ r& i4 a# l3 ?7 a
660. 4 k7 t2 }6 [* _4 Q  W1 ~
661.         fi
662. ( k; M( Y! Y) g/ a0 X
663.     cd $DST_HOME
664.     tar cf "$TARNAME" *
665.     mv "$TARNAME" "$DEP_HOME"
666. " ?7 c; Y4 f5 w) R6 C6 X; I
667.     rm -rf $HOME/deploy/*
668.     cp "$DEP_HOME"/"$TARNAME" $HOME/deploy
669.     cd "$DEP_HOME"/"$MODULE"
670.     tar xf "$TARNAME"
671.     rm -f "$DEP_HOME"/"$MODULE"/"$TARNAME"
672. * l. E2 K8 S1 R* d7 {4 T0 I" h7 F
673.     ls -ltr $HOME/deploy/"$TARNAME"
674. else
675.     usage;exit 1;
676. fi

其 实这个脚本的核心还是那个build.xml,如果抛却这些shell语句,就是一个java编译的build.xml而已,只是修改一下这个 build.xml掉用的properties配置文件,修改其中的参数就可以实现对不同的java项目的编译,因为java项目的核心就是对java代 码的编译,只要不脱离这个核心其他的都是辅助的,比如你的项目是基于web的项目,他就会把你相应的jsp、xsl、xml以及jpg等文件,按照定义好 的目录结构拷贝到同一目录下打包,毕竟基于java的web项目大都逃离不了WEB-ROOT WEB-INF/classes WEB-INF/lib等这样的目录结构嘛,如果是java应用程序,就会把编译好的class直接复制到例如bin lib这样的目录结构,统一打包,这是我根据我所接触的项目不断总结的,也许还有很多模式我没有接触到没有考虑到。
这个脚本还有一个可以单独独立出来的功能就是cmp_dir函数,这个函数的功能是实现了对两个目录进行比较的功能,最后的输出是3个文件列表,第一个文 件列表是在执行cmp_dir dir1 dir2时,dir1目录比dir2目录多出的文件列表,这个文件里列出的文件名只存在于dir1目录,第二个文件列表是dir2目录比dir1目录多出 的文件列表,这个文件里列出的文件名只存在于dir2目录,第三个文件列表是dir1和dir2目录里都存在但是文件内容不同的文件列表。
这个shell的主要流程是:
1.根据代码版本标签(基线标签)取出代码
2.对取出的代码进行编译和其他处理(其他处理主要是指拷贝、删除源代码、按要求建立目录结构等)
3.对构建结果进行打包封装( Z/ N5 J1 O& g# c6 x+ ?  z- `9 S  r% c
其中的细节设计到了公司的流程(特殊要求),比如进行版本3和版本2(或者版本1)比较的功能,主要是给出最新版本和上一版本的变更文件清单,部署的时候 可以采取全量部署和增量部署两种选择,因为可以根据需要生成全量包或者增量包,增量包里面的文件就是这两个版本变更的文件,顺便可以做一下变更确认达到减 少出错几率的目的,即可以确定我部署上去的文件会整个系统会有什么影响,这个流程并不是适合每个公司每个项目,所以最核心最能共用的部分还是那个 build.xml,把它从脚本里剥离出来,只要稍加更改就可以实现对大多数的java项目进行构建。