服务器自动打包脚本。
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