• 服务器自动打包脚本。


      1 #!/bin/bash
      2 ###############################################################
      3 ###  通用代码
      4 
      5 ## 显示错误
      6 function error(){
      7     local msg=$1
      8     if [[ ${msg} != '' ]]; then
      9         echo -e "[33[31mERROR33[0m] "$1
     10     fi
     11 }
     12 
     13 ##显示调试信息
     14 function debug(){
     15     local msg=$1
     16     if [[ ${msg} != '' ]]; then
     17         echo -e "[33[34mMESSAGE33[0m] "$1
     18     fi
     19 }
     20 
     21 ##显示成功的信息
     22 function ok() {
     23     local msg=$1
     24     if [[ ${msg} != '' ]]; then
     25         echo -e "[33[32mOK33[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 "[33[31mERROR33[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%%
    " $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%%
    " $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
  • 相关阅读:
    运算
    使用mysql出现错误:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column '??????' in 'field list'
    POI-HSSF and POI-XSSF
    java pio项目使用
    mysql安装及卸载
    pdf转word
    【android studio】android studio使用过程中,搜集的一些问题
    github提交失败并报错java.io.IOException: Authentication failed:
    收集的github的东西
    Material Design
  • 原文地址:https://www.cnblogs.com/czjone/p/10303744.html
Copyright © 2020-2023  润新知