之乎者也2011

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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. # Must set the class files path relative to $DST_HOME4 j" V, ~$ v& b& o! m3 L* u4 q9 B
  13. classdir=WEB-INF/classes
  14. 6 h  p7 ?' d3 v5 _$ q
  15. # Must set the jars path relative to \$SRC_PATH3 ?. m* P& h0 H1 [7 X
  16. srclib=WEB-INF/lib
  17. - m3 J* |) O) S
  18. # The absolute common lib path
  19. svrlib=/userhome/soft/tomcat/common/lib
  20. 以下内容为脚本内容,此内容包含整个构建打包过程以及一个build.xml的模板
  21. ####################################################
  22. #prog:depweb.sh                                                                                                   #  C6 u$ X+ `" N+ ~& ~6 e
  23. #func:Web Application build create and tar package                                              #+ v7 @1 n( ?" G5 _, v- T- @
  24. #vern:1.6                                                                                                                #
  25. #auth:liurs                                                                                                              #
  26. #comp:FORLINK                                                                                                      #1 p* `6 k3 O9 r% r) x
  27. ####################################################+ V! n9 t2 K, |9 o/ y2 \
  28. #!/bin/sh
  29. 2 g# K4 V1 a% z1 N+ H
  30. usage()
  31. {* P" S3 \3 u$ K6 V
  32.         clear5 s1 _0 t' z& j5 y- y5 ?& a
  33.         echo        "USAGE: $PROG [-a|--add] [-h|--help] [-i|--initial] [-c|--complete]"
  34.         echo        5 `" O4 }7 O, e( d7 q0 j
  35.         echo         "WHERE: -h --help         = Display help infomation"
  36.         echo         "Usage: $PROG -h|--help" & W4 ~& k' V' n: e% t
  37.         echo
  38.         echo         "        -i --initial        = 设置配置文件,初始化构建环境"
  39.         echo         "Usage: $PROG -i <模块名>"
  40.         echo; ^7 ^1 r: `6 F" r) x4 T* I; }: f
  41.         echo         "       -a --add         = 直接增量部署,用如下格式:"
  42.         echo         "Usage: $PROG -a <增量标签> <模块名>"
  43.         echo
  44.         echo         "       -c --complete        = 初始全量部署,用如下格式:"5 [. G  A) u3 Y% L
  45.         echo        "Usage: $PROG -c <全量标签> <模块名>"
  46.         echo: l% Z4 b. S8 Y; _1 V+ C& H
  47.         echo         "正常全量部署,用如下格式:") B2 f8 d5 r& F9 s& O0 u( B+ T. t  P) h
  48.         echo         "Usage: $PROG <全量标签> <模块名>"; e8 ?" r+ |. s2 W
  49.         echo( \. H. a. T: N, ?, [
  50.         return 0
  51. }
  52. 0 b9 Y. o3 X. l
  53. setsample()+ [7 W: N8 E0 Y# ~
  54. {
  55.         clear- ^7 M# K, V+ Z7 w4 C" S
  56.         echo         "PREREQUISITES:"7 K/ |9 `0 W# u- L% ]! [- y- k! `" w0 l
  57.         echo6 k) I8 m5 j9 u: W8 J3 z$ k% M8 T. R
  58.         echo         "* The $HOME/build/\$MODULE-build.properties must be set", s, a3 a! ^" |1 I- b
  59.         echo         "* such as: "
  60.         echo
  61.         echo         "# Must set the "CVSROOT" environment variable"3 s* M; P  M+ X0 ~7 j
  62.         echo         "CVSROOT=:pserver:user:passwd@cvs-server:/cvs/repository/root"7 f. m  ?: Q+ Q; X! J% c5 I
  63.         echo
  64.         echo        "# Must set the module name of project in CVS Repository"
  65.         echo         "MODULE_NAME=projectsample", P# {* ?; y3 Q; H$ j/ e5 ~! i
  66.         echo% o4 {, i! M! g( n2 B( g# s, P/ J
  67.         echo    "# Must set the "$module" source code path relative to \$CVSROOT"! q9 z9 l+ l  r5 _6 a3 X
  68.         echo         "SRC_PATH=projectsample/codepath/"
  69.         echo
  70.         echo        "# Must set the java files path relative to $SRC_HOME"
  71.         echo        "javadir=src"
  72.         echo
  73.         echo        "# Must set the class files path relative to $DST_HOME"
  74.         echo        "classdir=WEB-INF/classes"$ a: P. O' m! @/ d" S3 A
  75.         echo4 J5 K0 A3 b4 Y/ n
  76.         echo        "# Must set the jars path relative to \$SRC_PATH"! \, w8 m5 I. R
  77.         echo         "srclib=WEB-INF/lib"6 g7 d4 M$ P6 g4 R4 {& Z. g
  78.         echo2 ?" w4 }# p: x. O6 P6 I* J
  79.         echo        "# The absolute common lib path"
  80.         echo        "svrlib=/userhome/soft/tomcat/common/lib"
  81.         echo8 I" \9 Q$ Z% `$ ]: M' @- K
  82.         return 0 5 C% R' J0 ?; t
  83. }
  84. 8 _: \9 \9 w* k' q
  85. echoxml()
  86. {" [' i* C, j3 E( D
  87. echo '<?xml version="1.0" encoding="GB2312"?>
  88. <project name="proname" default="all" basedir=".">; n, ?/ }# x! y4 f
  89.     <property environment="sysenv"/>
  90.     <property file="${sysenv.MODULE}-build.properties"/>* G5 L6 c9 C$ D
  91.     <property name="proname"            value="${sysenv.MODULE}"/>
  92.     <property name="srcdir"             value="${sysenv.SRC_HOME}"/>3 c4 G! G+ F7 w
  93.     <property name="dstdir"             value="${sysenv.DST_HOME}"/>
  94.     <property name="depdir"             value="${sysenv.DEP_HOME}"/>
  95.     <property name="wwwdir"             value="${sysenv.WWW_HOME}"/>
  96.     <property name="date"               value="${sysenv.DATE}"/>" T# ~: U% `; b! A+ c8 G
  97.     <property name="cvshome"            value="${sysenv.CVSROOT}"/>
  98.     <property name="tagname"            value="${sysenv.CVSTAG}"/>/ p% E) B& n0 x% E( U6 j& g
  99.     <property name="buidir"             value="${srcdir}"/>
  100.     <property name="buidir.java"        value="${buidir}/${javadir}"/>
  101.     <property name="dstdir.java"        value="${dstdir}/${javadir}"/>
  102.     <property name="appdir"             value="${dstdir}/${classdir}"/>/ {% w" [* w' D  s
  103.     <property name="comlib"             value="${svrlib}"/>
  104.     <property name="devlib"             value="${sysenv.srclib}"/>$ O' [% G% N- q2 H! E* Q; |
  105.     <path id="compile.classpath">' g/ g' n6 Z. z) W, n
  106.         <fileset dir="${devlib}">
  107.             <include name="*.jar"/>
  108.         </fileset>' M' r/ N" b( g. ?4 T# }; S+ d; `
  109.         <fileset dir="${comlib}">
  110.             <include name="*.jar"/>4 _5 J9 p  E3 F) ]& s
  111.         </fileset>
  112.         <pathelement path="${wwwdir}/${classdir}"/>: i5 ^! y8 n3 X! u5 r
  113.     </path>- L* _9 e) J! v0 h7 q' G
  114. 8 a0 a3 E" J4 e( c
  115.     <target name="all"  depends="clean,init,copy,compile,deploy"/>
  116. : ?/ c7 H' R0 n* u
  117.     <target name="init" depends="">' e* E# P7 h" {  _1 Z* w
  118.         <mkdir dir="${dstdir}"/>
  119.         <mkdir dir="${depdir}"/>
  120.         <mkdir dir="${appdir}"/>, o5 X4 h8 O/ D+ e* G
  121.     </target>6 T6 R6 g1 z$ R0 F6 E2 a, H
  122.     <target name="compile" depends="init" description="Compile main source tree java files">! t6 Y9 [- C" t5 q* a3 u/ i
  123.         <javac srcdir="${buidir.java}" destdir="${appdir}" debug="true" deprecation="false" optimize="false" failonerror="true" encoding="gb2312">
  124.             <classpath refid="compile.classpath"/>: v  n: Q3 O) S. q
  125.         </javac>1 }% t2 }: I( U
  126.     </target>/ z- ^) }& D7 z3 S% `0 N4 T% F
  127. + K7 V7 N) d, ^: K# q4 Z1 M0 V7 J
  128.     <target name="clean" depends="clndst,clndep" description="Clean output directories"/>
  129.     <target name="clnclass" depends="" description="Clean out class files">6 J0 A3 O( U) P$ ^
  130.         <delete>
  131.                 <fileset dir="${srcdir}">
  132.                         <include name="**/*.class"/>
  133.                 </fileset>* n2 [1 d+ h- n7 N
  134.         </delete>0 T+ n6 G5 e: d- B# [5 q* @$ F
  135.     </target>
  136. 8 G* G( E* z+ a3 F9 R
  137.     <target name="clnjava" depends="" description="Clean out source code file">
  138.         <delete>9 h& i3 L" P! S. [- n% Y) ~$ N
  139.                 <fileset dir="${dstdir}/${javadir}">/ H4 W* K  Y8 L! P4 E# ]2 I. [
  140.                         <include name="**/*.java"/>. @, n4 Z6 V2 p: n/ e: ~
  141.                 </fileset>
  142.         </delete>
  143.     </target>
  144.     <target name="clndst" depends="" description="Clean out dest directorie">
  145.         <delete dir="${dstdir}"/>2 ]" R5 I$ ^9 y* C% i) X
  146.     </target>
  147. 6 o. `. i8 `' h0 }- p* ~
  148.     <target name="clndep" depends="" description="Clean out deploy directories">7 H9 K5 A/ o/ w5 z) c, ?
  149.         <delete>! a) f( L( r- Z
  150.         <fileset dir="${depdir}">) c1 ^& B: h& d- z, j. {. i9 F! K4 e
  151.                 <include name="*.tar"/>
  152.         </fileset>
  153.         </delete>: Q6 v( k" j; g- E0 x, X
  154.     </target>3 r9 F3 f. w4 }' q. \) c( G3 O4 ^
  155.   S+ S1 E. M  O5 l6 E; ^, B
  156.     <target name="copy" depends="init" description="Copy web files">% D% ~. V1 r1 `+ ]3 z. F
  157.         <copydir src="${buidir}" dest="${dstdir}"/>
  158.         <copy todir="${appdir}">7 L* u3 V+ G* N! `- J
  159.                     <fileset dir="${buidir.java}">
  160.                         <include name="**/*.xml"/>  F' r8 S& ?, o8 Q/ E
  161.                         <include name="**/*.properties"/>9 n. T$ x+ d4 U
  162.                 </fileset>
  163.           </copy>' E  p7 y+ o/ S  X  |
  164.         <!--delete dir="${dstdir.java}"/-->
  165.     </target>2 |. S  L# u) t6 x  _: b  w
  166.     <target name="deploy" depends="init" description="Create web tar file">
  167.         <tar destfile="${depdir}/${proname}-${tagname}.tar" basedir="${dstdir}"/>! I2 a2 I! B) W
  168.     </target>! Q3 ]0 ^, a7 t7 |: I' r, V# w. B
  169.     <target name="cvsexp" depends="" description="cvs export scode from CVS lib to srcdir">  Y5 ?0 R* H+ ~- c- f+ O& c* Z# \
  170.         <mkdir dir="${srcdir}"/>: }2 S$ p+ P' n  ]3 ^+ ~
  171.         <!--<cvspass cvsroot="${svshome}"/>-->
  172.         <cvs command="export" tag="${tagname}" failOnError="true" cvsroot="${cvshome}" package="web/impl" dest="${srcdir}"/>
  173.     </target>
  174. </project>'
  175. return 0
  176. }
  177. : C5 Y, w" v$ z( k9 v# l6 E6 F
  178. echocfg()4 m+ w' O) S5 C; Z0 d  C7 W
  179. {! C8 I) x" L5 d) j9 x4 \, I
  180. echo '#The config file of depweb.sh and build.xml
  181. ) [* s# _% Z; _6 f( I' u1 I! _
  182. # Must set the value of "CVSROOT" environment variable
  183. CVSROOT=
  184. # Must set the module name of project in CVS Repository
  185. MODULE_NAME=  n, Y1 U. |7 @9 c
  186. - D" s; G5 d% N
  187. # Must set the "$module" source code path relative to \$CVSROOT3 o" q, h4 G1 v' A: b
  188. SRC_PATH=
  189. 7 y- z) w( m+ V( S* U" q; k5 z
  190. # Must set the java files path relative to \$SRC_HOME
  191. javadir=7 ]/ s6 j1 p$ R5 t
  192. # Must set the class files path relative to \$DST_HOME( s1 o. d, C# t7 B& T7 W; Q: t9 ]
  193. classdir=
  194. # Must set the jars path relative to \$SRC_PATH: W# I; P* N9 |; q) w5 i  h# J
  195. srclib=) b* v# J: K0 t" Q/ m
  196. # Set the absolute common lib path* i0 n5 _$ d7 r  `
  197. svrlib=
  198. '6 I/ B  o' \" K4 o0 x. z
  199. return 0/ v1 }% X6 y  a" h# F6 P
  200. }( d" Z* d7 P6 k) x
  201. cmpdir()
  202. {
  203. echo '. a* `1 N- v; P: C
  204. #!/bin/sh( M* m5 [0 {' o
  205. cmp_dir()3 n0 d% l* `: K% k: A7 v
  206. {
  207. RET=0
  208. cd $HOME_DIR
  209. DIFF_NAME=$HOME_DIR/diff.err# b: O( _- \# x: M1 e3 ~
  210. EXIST_NAME=$HOME_DIR/$3.exist.err* m7 R6 t/ S4 ^0 I
  211. >$EXIST_NAME
  212. >$DIFF_NAME/ V7 c' \3 A7 \9 ^1 Y+ c( b" w
  213. if [ ! -d $1 ]
  214. then, V7 n5 A* m& y9 K
  215.         echo directory $1 does not exit!
  216.         exit 1% {* h% B, L6 |2 M! Z, F
  217. fi8 w' M2 Q2 H( N/ C/ E
  218. if [ ! -d $2 ]
  219. then
  220.         echo directory $2 does not exit!
  221.         exit 2
  222. fi4 m: `# }6 ^9 @- ]
  223. cd $1
  224. for i in `find . -type f ! -path "*\ *"`( \& I8 U% W6 w4 V4 M
  225. do
  226.         if [ -f $2/$i ]& H* C! [& s1 Q# u
  227.         then
  228.                 cmp $1/$i $2/$i >/dev/null 2>/dev/null5 @/ `: }6 p+ U3 q
  229.                 if [ $? -ne 0 ]
  230.                 then8 J- Y4 v( o# S: B
  231.                         #echo $1/$i9 y' H% {4 n/ F
  232.                         RET=15 P3 I+ f8 C+ c; e
  233.                         echo $i >>$DIFF_NAME
  234.                 fi
  235.         else3 Z; M/ v6 @* v4 H5 W6 t+ B
  236.                 #echo $HOME_DIR/$2/$i >>$EXIST_NAME0 m# ?+ ?. [' c  Z, C1 u9 W
  237.                 #echo $i
  238.                 RET=1
  239.                 echo $i >>$EXIST_NAME) g1 I9 z+ t: V/ X( \5 f5 O
  240.         fi4 q. \& R/ C% o& ]" v0 w
  241. done
  242. cd $HOME_DIR' g) T4 G; |, k/ |9 I) A
  243. return $RET
  244. }* d2 I+ p, K, d7 u
  245. 3 {/ T8 U" h8 I. `  i
  246. HOME_DIR=`pwd`
  247. if [ $# -ne 2 ]4 C! T& c) I9 r8 S2 N
  248. then
  249.         echo "Usage: `basename $0` 目录1 目录2"
  250.         exit -1% l( o+ \2 e4 C7 |! ~, D
  251. fi) i0 I3 E% F( r' C
  252. : u0 C# H4 q, M) P6 b, z! U, T
  253. DIR_1=$1
  254. DIR_2=$2
  255. 2 |8 w0 b- i% Q# I0 `
  256. if [ `expr substr $1 1 1` != "/" ]- v: {0 R: X; T
  257. then7 n; K$ O; M5 E# X
  258.         DIR_1="$HOME_DIR""/""$1"
  259. fi
  260. if [ `expr substr $2 1 1` != "/" ]. q' ]0 M0 j/ x, V% |( m
  261. then+ g# n3 _' D+ g. h
  262.         DIR_2="$HOME_DIR""/""$2"
  263. fi
  264. 7 M7 Z$ d: f8 y- N
  265. #echo 第一个目录
  266. cmp_dir $DIR_1 $DIR_2 1
  267. RET1=$?; N# g7 c" r  [0 g1 w1 O# i
  268. #echo 第二个目录
  269. cmp_dir $DIR_2 $DIR_1 2" v! Q% T3 }- Q& x* R. W
  270. RET2=$?
  271. RET=0! F9 C! w! L0 s3 B, i
  272. cd $HOME_DIR) h7 G. J0 i6 o! V
  273. if [ $RET1 -ne 0 -o $RET2 -ne 0 ]
  274. then, D) N2 ?+ I! k6 r
  275.         echo "不同"$ i1 f; c( i- C0 S9 Y1 K+ Z7 T
  276.         ls -l 1.exist.err 2.exist.err diff.err: L1 J! Z9 ]% M" R+ f
  277.         RET=15 H( B9 U6 [3 u
  278. fi; o1 ^4 M: i2 H. Y
  279. exit $RET'2 \  f. @/ V2 ^6 p$ U" _
  280. return 0& r; P+ \+ C: U
  281. }3 q7 ~3 |/ A' t6 ^/ e
  282. ! G. c0 c* E  @0 G; R
  283. #check environment
  284. if [ -z $JAVA_HOME ]
  285. then/ S: H3 @# `" q$ C1 W% S
  286.     echo "Environment is wrong,please check the environment!"
  287.     exit 1: M( g* f8 u2 k7 k9 z. J/ m
  288. fi6 N' q, o4 T- X8 W6 ~6 T% i
  289. & k9 D- Z' q4 r( ?0 J
  290. if [ -z $CVSROOT ]- f( C* H/ t* _$ B- d  G/ W" O
  291. then
  292.     echo "The CVSROOT environment variable isn't setted"
  293.     #exit 1
  294. fi" h4 K9 X' d; Q% [) y9 B
  295. + J: H, B( V9 q' E% o# L" L& X% E# p
  296. if [ ! `which cvs` ]
  297. then
  298.     echo "The cvs command is not setted in \$PATH or cvs isn't installed!"
  299.     echo "Please check the environment or installed"
  300.     exit 1
  301. fi) `" G1 {# w2 q$ ?( X7 D* x9 M
  302. 3 g" h1 {9 c6 C. i9 `8 F+ Z
  303. if [ ! `which ant` ]
  304. then
  305.     echo "The ant isn't installed"
  306.     echo "Please install the ant"
  307.     exit 1
  308. fi
  309. if [ ! `which cmp_dir` ]
  310. then
  311.         if [ ! -d $HOME/bin ]/ I, W3 d: F2 i; u5 R, S
  312.         then9 F0 U# y3 Q3 ~7 N& n3 w3 x) C
  313.                 mkdir -p $HOME/bin
  314.         fi
  315.         cmpdir >$HOME/bin/cmp_dir
  316.         chmod +x $HOME/bin/cmp_dir
  317.         export PATH=$HOME/bin:.:$PATH6 P' v" h* H8 g! r% r0 q+ }
  318. fi& b& `" F8 ]' {5 ^$ h; F3 n- v
  319. PROG=`basename $0`, T& W# b- g1 v3 o5 G, b
  320. ARGV="$@"
  321. ARGC="$#"
  322. export DATE=`date +%Y%m%d`
  323. if [ `uname` = Linux ]' r$ k/ w) K! a8 m/ M
  324. then
  325.         export LANG=zh_CN.GB23121 {% o7 f7 G  R: _  l
  326. elif [ `uname` = HP-UX ]
  327. then
  328.         export LANG=zh_CN.hp15CN
  329. else/ g! E, F. _3 U8 H
  330.         LANG=`echo $LANG`" x! s* H+ G$ I3 t
  331. fi
  332. if [ $ARGC -lt 1 -o $ARGC -gt 3 ]
  333. then
  334.         usage;exit 1;
  335. fi/ `& N( i, W- h5 o
  336. if [ `uname` = Linux ]
  337. then8 D# a7 ]/ [: ?; @2 C9 b; T
  338.         OPTS=`getopt -n 'depweb.sh' -o haic -l help,add,initial,complete -- "$@"`& `9 Z3 f, N9 F
  339. else  \. h# j$ @: v% i
  340.         OPTS=`getopt haic: $*`
  341. fi6 U! R, y: P+ F0 Q: j6 g
  342.        
  343. if [ $? -ne 0 ]; h9 _% T* [/ K0 p& H, [8 V( m+ N
  344. then
  345.         echo "Please use $PROG -h"
  346.         exit 1
  347. fi
  348. #eval set -- "$OPTS"% [3 j, ?- p8 e4 q! |) e% l' A- g; T
  349. for args in $OPTS
  350. do
  351.           case "$args" in0 _. y+ b. X4 U+ b% m: G' H( X
  352.                    -h|--help)                . ~/ i% _/ v3 N6 q! e
  353.                         if [ $ARGC -ne 1 ]8 P7 ~4 i" m! g' k/ y: r
  354.                         then
  355.                                 usage "HELP";exit 1; # Help requested3 O" j# C4 d* w# Y5 g- b
  356.                         fi
  357.                         usage;exit 0;;  G& ?, Y" O. e6 R8 P" R+ N
  358.                    -a|--add)               
  359.                         if [ $ARGC -ne 3 ]( ]: ?6 d. F+ S' @! _
  360.                         then
  361.                                 usage;exit 1;
  362.                         fi/ ^% T, a% W' C5 v/ ~( S
  363.                         export CVSTAG=$23 O' o4 p  F1 B2 [5 V" O( w' G
  364.                         export MODULE=$3
  365.                         BUD_CFG="$HOME/build/"$MODULE"-build.properties"   7 Y% f( O; L2 J" U$ d9 q
  366.                         if [ ! -f "$BUD_CFG" ]                             
  367.                         then                                               1 H- Q2 K" ?# [
  368.                                 echo "Please initial the $MODULE"          6 k4 p0 o+ u# ~" I
  369.                                 echo "Please use: "depweb.sh -i <$MODULE>""
  370.                                 exit 1                                    
  371.                         fi                                                 2 w  r2 T$ d- V: }8 V
  372.                         FLAG="add";; v) |+ y. u, v! y5 _
  373.                         break;;
  374.                         #shift;;        #add files deploy* {9 ]' g( y& t+ Z5 w
  375.                    -i|--initial)       
  376.                         if [ $ARGC -ne 2 ]
  377.                         then
  378.                                 usage;exit 1; * |% W2 T8 Y! D. z2 @6 @5 E
  379.                         fi9 Q. v, h* D- U" G. N1 {- h7 f
  380.                         if [ ! `which vi` ]; P0 f$ O/ V1 C( U7 V2 F% D
  381.                         then * G5 c, q  R, H0 E6 R- \0 Q
  382.                                 echo "Not install vim"
  383.                                 exit 13 X$ |# O* U* G( W
  384.                         fi. c2 w5 z0 a+ L2 H# \8 v" |
  385.                         export MODULE="$2"
  386.                         BUD_CFG="$HOME/build/"$MODULE"-build.properties"
  387.                         if [ ! -f "$BUD_CFG" ]
  388.                         then
  389.                                 if [ ! -d $HOME/build ]! b. k2 o! D( c) F
  390.                                 then1 @: V. q5 W/ w) h& E/ Y6 k" ]
  391.                                         mkdir -p $HOME/build
  392.                                 fi" s) `; y! e+ G6 {1 o
  393.                                 echocfg>"$BUD_CFG"
  394.                         fi- W( |9 |; {( I% G& J
  395.                         setsample;
  396.                         echo "********************************************"8 P0 i& H! z! N- z% p. g
  397.                         echo "Please set the properties file"9 C" N+ c5 A& J1 J7 H
  398.                         sleep 3) n' r) T4 v( l; R
  399.                         vi "$BUD_CFG"3 f) ~8 a, l/ v. K) [
  400.                         exit 0 ;;
  401.                         #break;;
  402.                         #shift;;         #increase files deploy
  403.                    -c|--complete)        
  404.                         if [ $ARGC -ne 3 ] 8 Z% o+ o; q' G' n7 @, N
  405.                         then1 s; U& z: F; i9 A  r/ a  |
  406.                                 usage;exit 1;
  407.                         fi
  408.                         export CVSTAG=$2
  409.                         export MODULE=$35 X" Q0 {) T" @7 w, D$ ~# |
  410.                         BUD_CFG="$HOME/build/"$MODULE"-build.properties"     
  411.                           if [ ! -f "$BUD_CFG" ]                             
  412.                           then                                               
  413.                                   echo "Please initial the $MODULE"          ' [: K6 v# h! c7 m; g' z: U8 G# b
  414.                                   echo "Please use: "depweb.sh -i <$MODULE>"": E, ^: w# O2 F3 t
  415.                                   exit 1                                     : C5 L: B7 [  n) n2 y4 L
  416.                           fi                                                
  417.                         FLAG="complete";' d' s4 V4 U- W$ f" m0 R1 d+ X
  418.                         break;;' F1 n- W0 H! I( K. f" B0 Q
  419.                         #shift;;         # complete files deploy
  420.                    --)                         2 K6 d0 e* G$ G! ?8 \
  421.                         if [ $ARGC -ne 2 ]
  422.                         then
  423.                                 usage3 B+ l0 m- S/ O3 N
  424.                                 exit 17 q. P  V% L3 J& f! L/ {
  425.                         fi
  426.                         export CVSTAG=$12 ?  @! \5 {. q* u4 T4 _( X
  427.                         export MODULE=$2
  428.                         FLAG="cmpold"
  429.                         break;;
  430.                         #shift; break;; % |8 m4 b" b  b5 \
  431.                    *)                  9 F+ x7 C/ i8 m( a
  432.                         usage; exit 1 ;;8 L8 R! ~! F  U  ]9 }
  433.           esac4 y% ^7 \5 ~4 w: Y3 z6 V+ e# V7 [
  434. done1 B+ s! S& t* Z$ n0 H& C( E
  435. #init part/ f; \, z" `% i7 R
  436. ' J% h$ L5 O8 W
  437. rm -rf $HOME/build/src! h* @7 y1 ^# T8 \' [% f, u: F
  438. if [ ! -d $HOME/bin/tmpdir ]
  439. then$ t% u) {  d. h. P0 u+ y
  440.     mkdir -p $HOME/bin/tmpdir& H! @" _, V% F+ N0 B
  441. fi
  442. if [ ! -d $HOME/build ]
  443. then . L7 U  `& U0 U6 V
  444.     mkdir -p $HOME/build
  445. fi
  446. if [ ! -d $HOME/build/src ]
  447. then  ]2 h% H9 H2 u% ~. D
  448.     mkdir -p $HOME/build/src+ t! [. s) s9 _6 H( r8 o  a# Y
  449. fi) P7 g, l: }( B. N, r1 V# ~  n
  450. if [ ! -d $HOME/build/dest ]
  451. then3 Q9 D# ?; D0 Z" |
  452.     mkdir -p $HOME/build/dest
  453. fi
  454. if [ ! -d $HOME/build/deploy ]
  455. then" F0 ^  A2 `- f) `/ U
  456.     mkdir -p $HOME/build/deploy, T8 D0 @# `, ?- Y; N# N
  457. fi
  458. if [ ! -d $HOME/deploy ]
  459. then0 ~  r3 A; q2 T0 l8 O
  460.     mkdir -p $HOME/deploy
  461. fi
  462. export SRC_HOME=$HOME/build/src1 j' A( \2 u  D2 ^8 Y4 |/ ^
  463. export DST_HOME=$HOME/build/dest; `3 @& I: q# J8 O* Q; @
  464. export DEP_HOME=$HOME/build/deploy
  465. export WWW_HOME=$HOME/build/deploy/$MODULE4 `& D  f4 E' o
  466. ; O5 H9 j# J( \; G( ]
  467. BUD_XML="$HOME/build/build.xml"
  468. . g% S5 t( R' d3 F, h# ^9 [
  469. if [ ! -f "$BUD_XML" ]
  470. then
  471.         touch $BUD_XML5 l  Z5 l/ \6 M) K5 e
  472.         echoxml >$BUD_XML* U9 W! I5 d1 E6 \1 x# M
  473. fi
  474. BUD_CFG="$HOME/build/"$MODULE"-build.properties"
  475. * a- I& D' |% K! ^: @& X4 C
  476. if [ ! -f "$BUD_CFG" ]. ]  B) D8 F4 b; {2 p
  477. then/ W* W/ i0 l  N/ N
  478.         echo "The $MODULE has not been initialed!"
  479.         echo "Please use: "depweb.sh -i \<$MODULE\>" to initial the \<$MODULE\> module"
  480.         exit 1
  481. fi; Q- K1 H: V3 J+ h
  482. " R1 A% K; [' J
  483. export CVSROOT=`grep "CVSROOT=" "$BUD_CFG"|awk -F = '{print $2}'`' T6 ^1 _4 N, k1 `* ]# i' ^
  484. SRCPATH=`grep "SRC_PATH=" "$BUD_CFG"|awk -F = '{print $2}'`4 O9 r. k; q  I' f7 _
  485. if [ ! "$SRCPATH" ]# n! [2 R# a- O% T/ v
  486. then
  487.             echo "Not appoint the path of source code in the $DEP_CFG"/ T) M3 p8 A- G/ u/ f. Y
  488.         setsample! m0 w2 @* |# p+ j) I
  489.             exit 1
  490. fi
  491. ( b$ C$ V8 G( }6 |1 Q7 T
  492. CONFLST=`cat $HOME/build/config.lst`
  493. DEPFILE=""$MODULE"-"$CVSTAG".tar"
  494. JAVADIR=`grep -w javadir "$BUD_CFG"|awk -F = '{print $2}'`
  495. SRCLIB=`grep -w srclib "$BUD_CFG"|awk -F = '{print $2}'`
  496. #========================build part========================#
  497. echo "cvs login"1 W. F; [5 O/ }+ Q
  498. cvs login
  499. echo "cd $HOME/build"8 m! p. ~: o. f' m- c4 q! _
  500. cd $HOME/build
  501. echo "cvs -q export -r "$CVSTAG" -d src "$SRCPATH""/ V; U* }! `: |
  502. cvs -q export -r "$CVSTAG" -d src "$SRCPATH"
  503. if [ $? -ne 0 ]/ t* I- E! u" m
  504. then
  505.     echo "cvs export scode failed!"* B* T% l5 V# q, R
  506.     exit 18 M. \. e! G6 r+ \0 p
  507. fi
  508. ant clean
  509. if [ $? -ne 0 ]
  510. then 9 K; n# |( D! V: ]  y4 m! ~
  511.     echo "ant clean target have error!"
  512.     exit 1
  513. fi
  514. 2 |: _& _# e& f% R
  515. ant clnclass. I# L. B$ `0 L* Y1 {# Q
  516. ant copy
  517. if [ $? -ne 0 ]
  518. then
  519.     echo "ant copy target have error!"
  520.     exit 1. u4 I/ Z( j& E3 w: |& i
  521. fi* \; R* e7 q0 v3 L7 J4 ?9 _
  522. ant clnjava' |6 q) l4 B& K5 ]6 H" ]3 m9 l
  523.   x' B* e7 F  t- p
  524. if [ $FLAG = "cmpold" ]6 K- P% b: H8 q
  525. then4 G" Y3 F: c5 {$ T% k, X' i1 `4 G
  526.     export srclib=$SRC_HOME/$SRCLIB
  527.     TARNAME="$MODULE"-"$CVSTAG"-add.tar
  528.     if [ -d $SRC_HOME/$JAVADIR ]
  529.     then- W  [( @2 ^0 Z2 r$ s$ b% e- S8 o
  530.         ant compile
  531.         if [ $? -ne 0 ]
  532.         then# q, d7 f/ ~( n3 H# M  D. U
  533.                 echo "ant compile target have error"( C* c3 J( c4 _  r1 i- u
  534.                 exit 1- U- ~* N  e: M' c+ q
  535.         fi: j, s* i+ I0 F* O  C8 _( ^
  536.     fi
  537.    
  538.     cd $DST_HOME
  539. $ y( u* y( I6 d# R' E
  540.     for i in $CONFLST. {/ [+ J; n6 j7 L$ }
  541.     do
  542.       find . -type f -name "$i" -exec rm -f {} \;$ ?) Y/ r: }  k  T2 q8 s
  543.     done  @) l; A6 h( {" r: G9 p% x. I
  544.    
  545.     tar cf "$DEPFILE" * ( a( `9 {9 ^% j' f: L8 Y9 Y+ A
  546.     mv "$DEPFILE" "$DEP_HOME"8 G) c& Q+ l" S# |
  547. #========================package part========================#
  548.     cd $DEP_HOME
  549.     rm -rf "$MODULE"-dep% H4 n6 o$ n5 v' t8 ^$ t, E1 c% i
  550.     mkdir -p "$MODULE"-dep6 g5 A, O* L, i# ?
  551.     cp "$DEPFILE" $DEP_HOME/"$MODULE"-dep
  552.     cd "$MODULE"-dep* }" x9 a* ?$ n* l/ d
  553.     tar xf "$DEPFILE"
  554.     rm -f "$DEPFILE"
  555.     cd $DEP_HOME
  556. , n9 L, s& H, K2 r' V8 H
  557.     cmp_dir "$MODULE" "$MODULE"-dep7 [0 ]% Z0 r8 p8 ~( w
  558.     if [ $? -ne 1 ]& `% I' a9 Y, M; j0 }  w5 U
  559.     then
  560.         echo "#########################################"; K' v! y4 h5 s1 f/ M5 z5 ~
  561.         echo "This version tag is the same to last tag!"" v$ m9 @6 p% i$ @6 @& ^, B: C
  562.         echo "Please check whether this tag is the same to the last one!"4 X6 m( V7 B/ J. v7 h$ t4 `5 ]6 b
  563.         exit 1# ^. Q6 p  N0 v2 a& q
  564.     fi
  565.     cd "$MODULE"-dep
  566.     tar cf "$TARNAME" `cat ../2.exist.err`) S" B9 F. {. n
  567.     if [ -s $TARNAME ] 9 L# ~  W/ i4 e' E4 l$ P5 D$ f+ H! L
  568.     then$ r" X# [! e9 ~
  569.             tar uf "$TARNAME" `cat ../diff.err`
  570.     else1 S# M9 d# V/ U+ p4 n
  571.         tar cf "$TARNAME" `cat ../diff.err`
  572.         if [ $? -ne 0 ]+ x% Z- u1 I. v0 ]  k3 n
  573.         then+ l1 x+ M/ f* C; I0 V2 y" ^
  574.                 echo "$TARNAME is not created !"
  575.                 exit 1
  576.         fi
  577.     fi$ S: j% I, [% T2 a$ C
  578.     rm -rf $HOME/deploy/*
  579.     mv "$TARNAME" $HOME/deploy
  580.     cd $WWW_HOME4 x) K  T% q+ e# y
  581.     cp $HOME/deploy/"$TARNAME" $WWW_HOME
  582.     tar xf "$TARNAME"
  583.     rm -f "$TARNAME", `) k' W* o2 l9 m$ R
  584.     echo "The add tar is created successfully!"
  585.     ls -ltr $HOME/deploy/"$TARNAME"# L4 \: {) r8 Y" `1 D
  586. elif [ $FLAG = "complete" ]- c, u' e/ @+ ~0 T% g' x
  587. then
  588.     export srclib=$SRC_HOME/$SRCLIB$ h2 U5 y! T" Q: N0 X5 R" B
  589.     TARNAME="$MODULE"-"$CVSTAG".tar+ w* r. l' i0 W1 J8 B5 }; [
  590.     if [ -d $SRC_HOME/$JAVADIR ]/ E: K' j( Q8 s3 v1 C3 ^
  591.     then
  592.         ant compile
  593.         if [ $? -ne 0 ]
  594.         then
  595.                 echo "ant compile target have error"
  596.                 exit 1
  597.         fi
  598.     fi
  599. / D5 ]& [! f4 O: t9 a
  600.     cd $DST_HOME  u  b0 L9 b; ]% p
  601.     tar cf "$TARNAME" *
  602.     mv "$TARNAME" "$DEP_HOME"; x" {: u& t' K& v2 h
  603.     rm -rf $HOME/deploy/*, @& {& g; ^: w7 S6 Q% p
  604.     cp $DEP_HOME/"$TARNAME" $HOME/deploy
  605.     cd $HOME/build/deploy  U. v3 f4 M0 M2 P9 g$ s
  606.     rm -rf $MODULE3 P& _1 L. g, O2 t1 Z& `) F
  607.     mkdir -p $MODULE- S2 U# C4 P6 i/ `) n- k
  608.     mv "$TARNAME" $MODULE
  609.     cd $MODULE- p, p1 z/ b% Z
  610.     tar xf "$TARNAME"
  611.     rm -f "$TARNAME", m' q$ ]9 ]% K4 Y: F7 O" g& p: v6 f
  612.     echo "The whole tar is created successfully!"
  613.     ls -ltr $HOME/deploy/"$TARNAME"2 t7 G7 M9 d0 z9 r+ h4 G  w
  614. elif [ $FLAG = "add" ]2 u! [) s' S7 S: [
  615. then) }& c8 O& b  C4 m
  616.     export srclib=$WWW_HOME/$SRCLIB
  617.     TARNAME="$MODULE"-"$CVSTAG"-add.tar
  618.     if [ -d $SRC_HOME/$JAVADIR ] ( M5 C$ W7 F) p  l$ ^
  619.     then7 _: M% q! j8 y" A
  620.             ant compile) X. R7 ~5 x  X+ x  }' E
  621.         if [ $? -ne 0 ]* p/ x$ t4 y+ H2 O1 k+ Q; A
  622.         then- k/ S7 Q. U8 T# Y
  623.                 echo "ant compile target have error"& A/ r& i4 a# l3 ?7 a
  624.                 exit 14 k7 t2 }6 [* _4 Q  W1 ~
  625.         fi
  626.     fi( k; M( Y! Y) g/ a0 X
  627.     cd $DST_HOME
  628.     tar cf "$TARNAME" *
  629.     mv "$TARNAME" "$DEP_HOME"
  630.     cp "$DEP_HOME"/"$TARNAME" "$DEP_HOME"/"$MODULE"" ?7 c; Y4 f5 w) R6 C6 X; I
  631.     rm -rf $HOME/deploy/*
  632.     cp "$DEP_HOME"/"$TARNAME" $HOME/deploy
  633.     cd "$DEP_HOME"/"$MODULE"
  634.     tar xf "$TARNAME"
  635.     rm -f "$DEP_HOME"/"$MODULE"/"$TARNAME"
  636.     echo "The add tar is created successfully!"* l. E2 K8 S1 R* d7 {4 T0 I" h7 F
  637.     ls -ltr $HOME/deploy/"$TARNAME"
  638. else
  639.     usage;exit 1;
  640. 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项目进行构建。

posted on 2011-09-08 06:02  之乎者也2011  阅读(746)  评论(0编辑  收藏  举报