服務器自動打包腳本。

  1 #!/bin/bash
  2 ###############################################################
  3 ###  通用代碼
  4 
  5 ## 顯示錯誤
  6 function error(){
  7     local msg=$1
  8     if [[ ${msg} != '' ]]; then
  9         echo -e "[\033[31mERROR\033[0m] "$1
 10     fi
 11 }
 12 
 13 ##顯示調試信息
 14 function debug(){
 15     local msg=$1
 16     if [[ ${msg} != '' ]]; then
 17         echo -e "[\033[34mMESSAGE\033[0m] "$1
 18     fi
 19 }
 20 
 21 ##顯示成功的信息
 22 function ok() {
 23     local msg=$1
 24     if [[ ${msg} != '' ]]; then
 25         echo -e "[\033[32mOK\033[0m] "$1
 26     fi
 27 }
 28 
 29 ## 檢查上一條命令的執行結果
 30 function checkResult(){
 31     local ret=$1
 32     local successMsg=$2
 33     local errormsg=$3
 34     if [[ ${ret} != 0 ]]; then
 35         error ${errormsg}
 36         return ${ret}
 37     else
 38         ok ${successMsg}
 39         return 0
 40     fi
 41 }
 42 
 43 ## 檢查上一條命令的反選結果。若是檢查到有失敗的消息就中止執行後面的任務
 44 function checkResultAndEchoFailMsgAndExit(){
 45     local ret=$1
 46     if [[ ${ret} != 0 ]]; then 
 47         echo -e "[\033[31mERROR\033[0m] "$2 #用通用函數會致使數據顯示的數據不完整。我也不知道是爲何。
 48         exit ${ret}
 49     fi
 50 }
 51 
 52 ## 根據時間生成文件名
 53 function getTimerFolderName(){
 54     local ret=$(date "+%y-%m-%d[%H%M%S]")
 55     echo ${ret}
 56 }
 57 
 58 ## 檢查目錄是否存在,不存在會建立 一個目錄
 59 function checkFolder(){
 60     local dirName=$1
 61     if [ -d "${dirName}" ]; then
 62         return 0
 63     else
 64         debug "mkdir ${dirName}"
 65         mkdir -p ${dirName}
 66         if [ ! -d "${dirName}" ]; then
 67             error "make dir error.dirname:${dirName}"
 68             return 1
 69         fi
 70     fi
 71     return 0
 72 }
 73 
 74 ## 備份目錄
 75 function backup() {
 76     local src=$1
 77     local dic=$2
 78     cp -rf ${src} ${dic}
 79     if [[ $? == 0 ]]; then
 80         ok "backup [${src}] to [${dic}] success."
 81         return 0
 82     else
 83         error "backup [${src}] to [${dic}] fail."
 84         return 1
 85     fi
 86 }
 87 
 88 ##檢查cmd命令是否存在
 89 function isExistCmd(){
 90     local cmd=$1
 91     which ${cmd}
 92     return $?
 93 }
 94 
 95 ##檢查命令是否存在,若是否存在中止執行後面的任務
 96 function notHasCommandExit() {
 97     local cmd=$1
 98     isExistCmd ${cmd}
 99     checkResultAndEchoFailMsgAndExit $? "not found command:"${cmd} " . linux: try to use yum install ${cmd}"
100 }
101 
102 ##使用mvn編譯java
103 function buildJavaMvn(){
104     local src=$1
105     local pomXml=$2
106     local jarName=$3
107     if [[ ${src} == '' ]]; then
108         error "used mvn to build,target java project src is null."
109         return 1
110     fi
111 
112     local currentWorkDir=$(pwd)
113     debug "maven compile ${src} worl dir $(pwd)"
114     cd ${src}
115     if [[ $? != 0 ]]; then
116         error "get project is not exists to build with maven."
117     fi
118     
119     notHasCommandExit 'mvn' #yum install maven
120     mvn clean
121     if [[ $pomXml == '' ]]; then
122         mvn package -DskipTests -f pom.xml -X
123     else
124         mvn package -DskipTests -f pomPackage.xml -X
125     fi
126 
127     cd ${currentWorkDir}
128     echo $(pwd)    
129     if [[ -f "${src}/target/${jarName}" ]]; then
130         ok "build ${src} with ${pomXml} success!"    
131     else
132         echo "${src}/target/${jarName}"
133         checkResultAndEchoFailMsgAndExit 1 "build ${src} fail."
134     fi
135 
136     
137     return 0
138 }
139 
140 ## 編譯golang 項目
141 function buildGOlang(){
142     local projDir=$1
143     local projName=$2
144     local outDir=$3
145     
146     if [[ ${projDir} == '' ]]; then
147         error "build golang project fail, projDir is null"
148         return 1
149     fi
150 
151     if [[ ${projName} == '' ]]; then
152         error "build golang project fail, projName is null"
153         return 1
154     fi
155 
156     notHasCommandExit 'go'
157     checkResultAndEchoFailMsgAndExit $? "not found golang command."
158     export GOPATH=$(pwd)/${projDir}
159     go install ${projName}
160     checkResultAndEchoFailMsgAndExit $? "build golang project fail, project: ${projDir} ,project name:${projName}"
161     ok "build golang project success, project: ${projDir} ,project name:${projName}"
162     if [[ ${outDir} != '' ]]; then
163         cp -rf ${projDir}/bin/${projName} ${outDir}
164         checkResultAndEchoFailMsgAndExit $? "copy (${projDir}/bin/${projName}) to (${outDir}) fail"
165     fi 
166     return 0
167 }
168 
169 ## 使用cmake 編譯C++項目,編譯成動態庫
170 function buildCMakeShareLib(){
171     local cmakeDir=$1
172     local cmakeRetName=$2
173     local buildTo=$3
174 
175     if [[ ${cmakeDir} == '' ]]; then
176         checkResultAndEchoFailMsgAndExit 1 "cmake folder is null"
177     fi
178 
179     if [[ ${cmakeRetName} == '' ]]; then
180         checkResultAndEchoFailMsgAndExit 1 "cmakeRetName is null"
181     fi
182 
183     if [[ ${buildTo} == '' ]]; then
184         checkResultAndEchoFailMsgAndExit 1 "buildTo is null"
185     fi
186 
187     notHasCommandExit "cmake"
188 
189     local workdir=$(pwd)
190     checkFolder ${cmakeDir}"buildTemp"
191     cd ${cmakeDir}"buildTemp"
192     ok "switch to cmake word dir:${cmakeDir}buildTemp"
193     cmake ../
194     checkResultAndEchoFailMsgAndExit $? "run cmake fail. projectName:"${cmakeRetName}
195     make
196     checkResultAndEchoFailMsgAndExit $? "run make fail. projectName:"${cmakeRetName}
197     checkFolder ${buildTo}
198     cp -p "lib"${cmakeRetName}".so" ${buildTo}/"lib"${cmakeRetName}".so"
199     local ret=$?
200     if [[ $ret != 0 ]]; then
201         error "compile "${cmakeRetName}" (c/c++) fail."
202     else
203         ok "compile "${cmakeRetName}" (c/c++)success."
204     fi
205     cd ${workdir}
206     return ${ret}
207 }
208 
209 # 使用make 編譯c++項目
210 function buildMake(){
211     local makeDir=$1
212     local makeRetName=$2
213     local buildTo=$3
214 
215     if [[ ${makeDir} == '' ]]; then
216         checkResultAndEchoFailMsgAndExit 1 "make folder is null"
217     fi
218 
219     if [[ ${makeRetName} == '' ]]; then
220         checkResultAndEchoFailMsgAndExit 1 "makeRetName is null"
221     fi
222 
223     if [[ ${buildTo} == '' ]]; then
224         checkResultAndEchoFailMsgAndExit 1 "buildTo is null"
225     fi
226 
227     notHasCommandExit 'make'
228     local workdir=$(pwd)
229     cd ${makeDir}
230     ok "make compiler workspace:"$(pwd)
231     make
232     checkResultAndEchoFailMsgAndExit $? "run make fail."${makeRetName}
233     checkFolder ${buildTo}
234     debug "copy "${makeRetName} ${buildTo}/${makeRetName}
235     cp -p ${makeRetName} ${buildTo}/${makeRetName}
236     local ret=$?
237     if [[ $ret != 0 ]]; then
238         error "compile "${makeRetName}" (c/c++) fail."
239     else
240         ok "compile "${makeRetName}" (c/c++)success."
241     fi
242     cd ${workdir}
243     return ${ret}
244 }
245 
246 #使用make編譯c++項目爲動態庫:目前只支持linux版本
247 function buildMakeSharLib(){
248     local makeDir=$1
249     local makeRetName=$2
250     local buildTo=$3
251 
252     if [[ ${makeDir} == '' ]]; then
253         checkResultAndEchoFailMsgAndExit 1 "make folder is null"
254     fi
255 
256     if [[ ${makeRetName} == '' ]]; then
257         checkResultAndEchoFailMsgAndExit 1 "makeRetName is null"
258     fi
259 
260     if [[ ${buildTo} == '' ]]; then
261         checkResultAndEchoFailMsgAndExit 1 "buildTo is null"
262     fi
263 
264     notHasCommandExit 'make'
265     local workdir=$(pwd)
266     cd ${makeDir}
267     ok "make compiler workspace:"$(pwd)
268     checkResultAndEchoFailMsgAndExit $? "run cmake fail."${makeRetName}
269     make
270     checkResultAndEchoFailMsgAndExit $? "run make fail."${makeRetName}
271     checkFolder ${buildTo}
272     echo "copy lib"${makeRetName}".so" ${buildTo}/"lib"${makeRetName}".so"
273     cp -p "lib"${makeRetName}".so" ${buildTo}/"lib"${makeRetName}".so"
274     local ret=$?
275     if [[ $ret != 0 ]]; then
276         error "compile "${makeRetName}" (c/c++) fail."
277     else
278         ok "compile "${makeRetName}" (c/c++) success."
279     fi
280     cd ${workdir}
281     return ${ret}
282 }
283 #使用make編譯c++項目爲動態庫:目前只支持linux版本
284 function buildMakeSharLib2(){
285     local makeDir=$1
286     if [[ ${makeDir} == '' ]]; then
287         checkResultAndEchoFailMsgAndExit 1 "make folder is null"
288     fi
289 
290     notHasCommandExit 'make'
291     local workdir=$(pwd)
292     cd ${makeDir}
293     ok "make compiler workspace:"$(pwd)
294     checkResultAndEchoFailMsgAndExit $? "run cmake fail."${makeRetName}
295     make
296     checkResultAndEchoFailMsgAndExit $? "run make fail."${makeRetName}
297     cd ${workdir}
298     return 0
299 }
300 
301 #使用cmake編譯安裝庫
302 function buildMakeInstall(){
303     local makeDir=$1
304     if [[ ${makeDir} == '' ]]; then
305         checkResultAndEchoFailMsgAndExit 1 "make project folder is null"
306     fi
307     notHasCommandExit 'make'
308     local workdir=$(pwd)
309     cd ${makeDir}
310     ok "make compile & make install:"${pwd}
311     make
312     # make install
313     checkResultAndEchoFailMsgAndExit $? "make&make install makeDir fail. projName:"${cmakeRetName}
314     cd ${workdir}
315 }
316 
317 ##更新SVN到本地,若是沒有更新過會先checkout最新的版本
318 function updateSVN(){
319     local svndir=$1
320     local url=$2
321     export LC_CTYPE=zh_CN.UTF-8 #設置編碼
322     debug "update from svn:"${url}
323     if [ ! -d "${svndir}" ]; then
324         svn co ${url}
325     else 
326         svn up ${svndir}
327     fi
328     if [[ $? == 0 ]]; then
329         ok "update from svn success, url:"${url}
330     else
331         ok "update from svn fail, url:"${url}
332     fi
333 }
334 
335 ## 進度條
336 function processBar(){
337     b='' 
338     for ((i=0;$i<=100;i+=2))  
339     do  
340         printf "progress:[%-50s]%d%%\r" $b $i  
341         sleep 0.1  
342         b=#$b  
343     done  
344     echo 
345 }
346 
347 ##顯示進度條
348 b='' 
349 function showProgress(){
350     local val=$1 #0~100
351     if [[ ${val} > 0 || ${val} <=100 ]]; then
352         printf "progress:[%-50s]%d%%\r" $b ${val}  
353         b=#$b
354     else
355         error "process value verify fail. value:"$val
356     fi
357 
358     #完成後換行
359     if [[ ${val} == 100 ]] ; then
360         echo 
361     fi
362 }
363 
364 
365 
366 # ret=$(getTimerFolderName)
367 # echo ${ret}
368 
369 ####################################################################################
370 ###  下面的全爲業務代碼
371 VERSION=0.0.1                        #當前版本
372 BACKUP_DIR="backup"                 #備份目錄
373 PUBLIC_DIR="public/"${VERSION}        #發佈目錄
374 PUBLIC_TARGET_PLATFORM="linux"         #當前版本爲linux版本
375 ENABLE_BACK=false                     #編譯前是否備份
376 
377 function checkEvn(){
378 
379     checkFolder ${PUBLIC_DIR}
380     checkResultAndEchoFailMsgAndExit $? "檢查發佈版本目錄失敗!"
381     
382     checkFolder ${BACKUP_DIR}
383     checkResultAndEchoFailMsgAndExit $? "檢查備份目錄失敗!"
384     
385     return 0
386 }
387 
388 function checkBackupVersion(){
389     local max_backup_days=$1 #保留版本的天數
390     ##TODO 刪除太舊的版本,只保留規定時間內的版本
391 }
392 
393 function main(){
394     debug ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
395     debug "檢查編譯環境"
396     checkEvn
397 
398     debug "開始編譯"
399     #備份game server
400     if [[ ${ENABLE_BACK} == true ]]; then
401         if [[ -d 'sg_svr' ]]; then
402             local backup_dir=${BACKUP_DIR}/$(date "+%Y-%m-%d%H%M%S")
403             debug '備份目錄:'${backup_dir}
404             mkdir -p ${backup_dir}
405             backup 'sg_svr' "${backup_dir}/sg_svr"
406             checkResultAndEchoFailMsgAndExit $? "備份sg_svr敗!"
407         else
408             debug "本地沒有版本,無須備份!"
409         fi
410     fi
411 
412     local GAMEBLL_PROJ='https://192.168.10.234:8443/svn/kdyg/kd_project/SourceCode/server/sg_svr'
413 
414     #更新golang 項目
415     updateSVN 'sg_svr' $GAMEBLL_PROJ
416     checkResultAndEchoFailMsgAndExit $? "從svn更新sg_svr失敗!"
417 
418     # #編譯golang依賴的一些本地庫,不管是否有新版本都會檢查一下並編譯,若是爲新版本,編譯時間可能很長。
419     debug ">>>>> current workdir $(pwd)"
420     # buildMakeInstall "sg_svr/c_battle/src/luajit-2.1"
421     buildMakeSharLib2 "sg_svr/c_battle/src/luajit-2.1"
422     checkResultAndEchoFailMsgAndExit $? "編譯luajit-2.1失敗!"
423     debug ">>>>> current workdir $(pwd)"
424     cp -rf "sg_svr/c_battle/src/luajit-2.1/src/libluajit.so" "sg_svr/bin/${PUBLIC_TARGET_PLATFORM}/libluajit-5.1.so.2"
425     checkResultAndEchoFailMsgAndExit $? "copy luajit-2.1失敗!"
426     buildMakeSharLib "sg_svr/c_battle/linux/" "c_battle" $(pwd)"/sg_svr/bin/"${PUBLIC_TARGET_PLATFORM}
427     checkResultAndEchoFailMsgAndExit $? "編譯c_battle失敗!"
428     debug ">>>>> current workdir $(pwd)"
429     buildCMakeShareLib "sg_svr/c_lua51/src/" "lua51" $(pwd)"/sg_svr/bin/"${PUBLIC_TARGET_PLATFORM}
430     checkResultAndEchoFailMsgAndExit $? "編譯lua51失敗!"
431     #編譯golang 登錄網關服
432     debug ">>>>> current workdir $(pwd)"
433     buildGOlang "sg_svr" "sg_loginsvr" $(pwd)"/sg_svr/bin/"${PUBLIC_TARGET_PLATFORM}
434     checkResultAndEchoFailMsgAndExit $? "編譯sg_logsvr失敗!"
435     #編譯golang 遊戲服
436     debug ">>>>> current workdir $(pwd)"
437     buildGOlang "sg_svr" "sg_gamesvr" $(pwd)"/sg_svr/bin/"${PUBLIC_TARGET_PLATFORM}       
438     checkResultAndEchoFailMsgAndExit $? "編譯sg_gamesvr失敗!"
439 
440     #備份gmserver
441     if [[ ${ENABLE_BACK} == true ]]; then
442         if [[ -d "server" ]]; then
443             backup 'server' "${backup_dir}/server"
444             checkResultAndEchoFailMsgAndExit $? "備份server失敗!"
445         else
446             debug "本地無版本,無須備份."
447         fi
448     fi
449 
450     updateSVN 'server' 'https://192.168.10.234:8443/svn/kdyg/HYSDK/server'
451     checkResultAndEchoFailMsgAndExit $? "從svn更新server失敗!"
452     debug ">>>>> current workdir $(pwd)"
453     buildJavaMvn 'server/gm-tools' 'pomPackage.xml' "gametool-${VERSION}-SNAPSHOT.jar"
454     checkResultAndEchoFailMsgAndExit $? "編譯gm-tools失敗!"
455     buildJavaMvn 'server/sdkservices' 'pomPackage.xml' "sdkservices-${VERSION}-SNAPSHOT.jar"
456     checkResultAndEchoFailMsgAndExit $? "編譯sdkservices失敗!"
457     #copy 編譯版本到發佈目錄
458     ok "編譯完成"
459     
460     debug "發佈版本"
461     # local currentDir=$(pwd)
462     if [[ -d ${PUBLIC_DIR}/${PUBLIC_TARGET_PLATFORM} ]]; then
463     read -r -p "目錄已存在,是否刪除舊的版本? [Y/n] " input
464         case $input in
465             [yY][eE][sS]|[yY])
466                 #echo "Yes"
467                 rm -rf ${PUBLIC_DIR}/${PUBLIC_TARGET_PLATFORM}
468                 ;;
469 
470             [nN][oO]|[nN])
471                 #echo "No"
472                 exit 0;
473                        ;;
474 
475             *)
476             echo "Invalid input..."
477             ;;
478         esac
479     fi
480 
481     cp -rf "sg_svr/bin/${PUBLIC_TARGET_PLATFORM}/" "${PUBLIC_DIR}/${PUBLIC_TARGET_PLATFORM}"
482     checkResultAndEchoFailMsgAndExit $? "發佈sg_svr失敗!"
483     cp -rf "server/gm-tools/target/gametool-${VERSION}-SNAPSHOT.jar" "${PUBLIC_DIR}/${PUBLIC_TARGET_PLATFORM}/gametool-${VERSION}-SNAPSHOT.jar"
484     checkResultAndEchoFailMsgAndExit $? "發佈gm-tools失敗!"
485     cp -rf "server/sdkservices/target/sdkservices-${VERSION}-SNAPSHOT.jar" "${PUBLIC_DIR}/${PUBLIC_TARGET_PLATFORM}/sdkservices-${VERSION}-SNAPSHOT.jar"
486     checkResultAndEchoFailMsgAndExit $? "發佈sdkservices失敗!"
487 
488     #檢查備份處理的狀況,若是大陳舊就刪除
489     checkBackupVersion
490 
491     ok "發佈成功,當前版本爲:${VERSION}"
492 } 
493 main
相關文章
相關標籤/搜索