#! /bin/bash export PATH=$PATH:/usr/local/bin #export LANG=zh_CN.UTF-8 #英文utf8编码格式 export LANG=en_US.UTF-8 ROOT=`cd $(dirname $0);pwd` if [ -d ${ROOT} ]; then cd ${ROOT} fi ARGS="" ## 项目组自定义路径 # ==================================================================================== # 服务器svn根目录 SVN_BASE_URL=http://yfzx.4399svn.com/svn/dhmmc # 发版根目录 运维的目录规范 /data/xxx/server PUB_ROOT=/data/dhmmc/server # 发版脚本 运维的规范 xxxpub PUB_CMD=dhmmcpub # svn账号密码 USER=client_publisher PASSWORD=`cat /home/admin/svn_pub_pass` # 代码checkout的临时目录,编译用 TMP_SOURCE=/data/tmp_server/dhmmc # 内网部署路径 SERVER_DIR=/data/server/dhmmc # 内网主干登录服目录(内网重启和热更时指定的登录服) LOGIN_SERVER=login_server # 内网主干游戏服目录(内网重启和热更时指定的游戏服) GAME_SERVER=game_server # 内网发版指定的机器人压测脚本 CLIENT_SERVER=client_server # ==================================================================================== # 分支版本号,默认是用主干的代码 TAG=trunk VER=dev PLAT=android_cn PUSH_LANG=CN REBAR=rebar3 error() { echo -e "[错误] $(date '+%Y-%m-%d %H:%M:%S') $@" } # 打印警告 warn() { echo -e "[警告] $(date '+%Y-%m-%d %H:%M:%S') $@" } # 打印信息 opt() { echo -e "[操作] $(date '+%Y-%m-%d %H:%M:%S') $@" } cmd() { echo -e "[指令] $(date '+%Y-%m-%d %H:%M:%S') $@" } exit1() { lock_release exit 1 } # 检查锁 lock_check(){ local task=$1 lock=/tmp/server_shell.lock if [ -f $lock ]; then error "正在执行其他任务..., 如确认没有其他任务在执行,请删除文件${lock}" exit 1 fi touch $lock # 加锁 echo $task > $lock } # 解锁 lock_release(){ local task=$1 lock=/tmp/server_shell.lock rm -f $lock } # 使用说明 Usage () { echo "说明:" echo "当前路径:${ROOT}" echo "用法:" echo "动作 [选项]" echo "动作:" echo " reboot 重新部署,重启内网测试服" echo " reload 热更内网测试服" echo " pub_rel 发布全量包" echo " pub_up 发布升级包" echo "" echo "选项:" echo " -h, --help 显示本信息" echo " -v, --ver dev|beta|stable 推送的版本" echo " -t, --tag 游戏分支版本号" echo " -p, --plat android_cn|ios_cn|mix_cn 推送的平台" echo " -l, --lang CN | TW 推送的语言" echo " -s, --server game_server|login_server 推送的服务器类型" echo " -si, --server_id 重启/更新 的内网服务器id" echo " -m, --modules 热更的模块列表,不传或传空表示热更所有变更的模块" echo "" } ##从svn下载对应的代码,并设置当前版本号 SvnUpdate () { # 使用中文utf8编码,避免中文名文件等导致admin执行命令终止 export LANG=zh_CN.UTF-8 if [ -d ${TMP_SOURCE} ]; then opt "${TMP_SOURCE} 目录已存在,svn update" cmd "========= svn up --non-interactive --force --accept tc ${TMP_SOURCE} --username ${USER} =========" svn up --non-interactive --force --accept tc ${TMP_SOURCE} --username ${USER} --password ${PASSWORD} else opt "${TMP_SOURCE} 目录不存在,创建并svn checkout" cmd "========= svn co --non-interactive ${SVN_BASE_URL} ${TMP_SOURCE} --username ${USER} =========" mkdir -p ${TMP_SOURCE} svn co --non-interactive ${SVN_BASE_URL} ${TMP_SOURCE} --username ${USER} --password ${PASSWORD} fi # svn更新后使用英文utf8编码, # svn info取Last Changed Rev需要用到英文编码 / rebar3插件rebar3_vsn_plugin改每个app的版本也是用svn info取Last Changed Rev # 如果用中文utf8编码需要改这些用到svn取值的地方 export LANG=en_US.UTF-8 # 删除.dag文件,dag文件过大导致编译极慢 # cmd "========= find ${TMP_SOURCE}/ -name \"*.dag\" | xargs rm -f =========" # find ${TMP_SOURCE}/ -name "*.dag" | xargs rm -f cd ${ROOT} } ## 生成全量包 Release () { # if [ ! -d ${PUB_ROOT} ]; then # mkdir -p ${PUB_ROOT} # fi cd ${TMP_SOURCE} || exit1 REL_VERSION=`svn info ${TMP_SOURCE} | grep 'Last Changed Rev: ' | cut -d' ' -f4` cmd "========= ${REBAR} as ${SERVER_TYPE} release =========" ${REBAR} as ${SERVER_TYPE} release || exit1 # 删除旧代码 cmd "========= rm -rf ${PUB_ROOT} =========" rm -rf ${PUB_ROOT} PRJ=${TMP_SOURCE}/_build/${SERVER_TYPE}/rel/${SERVER_TYPE} # 记录svn版本号 cmd "========= echo ${REL_VERSION} > ${PRJ}/releases/svn_version =========" echo ${REL_VERSION} > ${PRJ}/releases/svn_version # 记录游戏服的版本 cmd "========= echo ${TAG} > ${PRJ}/version.txt =========" echo ${TAG} > ${PRJ}/version.txt # 拷贝console.sh脚本到bin目录 cmd "========= cp shell/console.sh ${PRJ}/bin/console.sh =========" cp shell/console.sh ${PRJ}/bin/console.sh sed -i "s/game_server/${SERVER_TYPE}/g" "${PRJ}/bin/console.sh" if [ "${SERVER_TYPE}" = "${CLIENT_SERVER}" ]; then sed -i "s/remote_console/console/g" "${PRJ}/bin/console.sh" fi # 拷贝新代码到发版目录 cmd "========= rsync --exclude=".svn" --delete-before -a -H -v ${PRJ}/ ${PUB_ROOT}/ =========" rsync --exclude=".svn" --delete-before -a -H -v ${PRJ}/ ${PUB_ROOT}/ || exit1 cd ${ROOT} } ## 生成热更包 Update () { # if [ ! -d ${PUB_ROOT} ]; then # mkdir -p ${PUB_ROOT} # fi cd ${TMP_SOURCE} || exit1 REL_VERSION=`svn info ${TMP_SOURCE} | grep 'Last Changed Rev: ' | cut -d' ' -f4` cmd "========= ${REBAR} as ${SERVER_TYPE} release =========" ${REBAR} as ${SERVER_TYPE} release || exit1 # 同步热更的代码和sql语句 PRJ=${TMP_SOURCE}/_build/${SERVER_TYPE}/rel/${SERVER_TYPE} cmd "========= rsync --exclude=".svn" --delete-before -a -H -v ${PRJ}/lib/ ${PUB_ROOT}/lib/ =========" rsync --exclude=".svn" --delete-before -a -H -v ${PRJ}/lib/ ${PUB_ROOT}/lib/ || exit1 if [ -d ${PRJ}/sql ]; then cmd "========= rsync --exclude=".svn" --delete-before -a -H -v ${PRJ}/sql/ ${PUB_ROOT}/sql/ =========" rsync --exclude=".svn" --delete-before -a -H -v ${PRJ}/sql/ ${PUB_ROOT}/sql/ || exit1 fi # 记录svn版本号 cmd "========= echo ${REL_VERSION} > ${PRJ}/releases/svn_version =========" echo ${REL_VERSION} > ${PRJ}/releases/svn_version cd ${ROOT} } PubUpdate () { SvnUpdate Update cmd "========= sh ${PUB_CMD} server ${PUSH_LANG} ${VER} ${PLAT} =========" sh ${PUB_CMD} server ${PUSH_LANG} ${VER} ${PLAT} cd ${ROOT} } # 发布代码 PubRelease() { opt "推送${VER}版本${SERVER_TYPE}全量包到外网" SvnUpdate cd ${TMP_SOURCE} || exit1 # 删除beam文件重新编译 cmd "========= ${REBAR} as ${SERVER_TYPE} clean =========" ${REBAR} as ${SERVER_TYPE} clean || exit1 cd ${ROOT} Release cmd "========= sh ${PUB_CMD} server ${PUSH_LANG} ${VER} ${PLAT} =========" sh ${PUB_CMD} server ${PUSH_LANG} ${VER} ${PLAT} cd ${ROOT} } Reboot(){ opt "更新重启${VER}版本${SERVER_TYPE}" if [ "${SERVER_ID}" = "" ]; then Usage error "需要指定服务器Id -si 参数" exit1 fi BIN_DIR=${SERVER_DIR}/${SERVER_TYPE}_s${SERVER_ID}/bin PUB_ROOT=${SERVER_DIR}/${SERVER_TYPE}_s${SERVER_ID} CONFIG_DIR=${SERVER_DIR}/config/${SERVER_TYPE}_s${SERVER_ID} SvnUpdate # 停服 cmd "========= sh ${BIN_DIR}/${SERVER_TYPE} stop =========" sh ${BIN_DIR}/${SERVER_TYPE} stop # 备份 cmd "========= rm -rf ${PUB_ROOT}_old =========" rm -rf ${PUB_ROOT}_old cmd "========= rm -rf ${PUB_ROOT}/*.dump =========" rm -rf ${PUB_ROOT}/*.dump cmd "========= mv ${PUB_ROOT} ${PUB_ROOT}_old =========" mv ${PUB_ROOT} ${PUB_ROOT}_old Release # 替换配置 cmd "========= cp ${CONFIG_DIR}/sys.config ${PUB_ROOT}/sys.config =========" cp ${CONFIG_DIR}/sys.config ${PUB_ROOT}/sys.config cmd "========= cp ${CONFIG_DIR}/vm.args ${PUB_ROOT}/vm.args =========" cp ${CONFIG_DIR}/vm.args ${PUB_ROOT}/vm.args # 把备份的日志拷贝回来,防止历史日志删除后查找不到问题 cmd "========= cp -r ${PUB_ROOT}_old/log ${PUB_ROOT}/log =========" cp -r ${PUB_ROOT}_old/log ${PUB_ROOT}/log # 启动服务器 cmd "========= sh ${BIN_DIR}/${SERVER_TYPE} daemon =========" # sh ${BIN_DIR}/${SERVER_TYPE} daemon CODE_LOADING_MODE=interactive sh ${BIN_DIR}/${SERVER_TYPE} daemon if [ $? -ne 0 ]; then error "启动服务器失败,请检查" exit1 fi opt "重启服务器成功......" cd ${ROOT} } Reload(){ opt "热更${VER}版本${SERVER_TYPE}" if [ "${SERVER_ID}" = "" ]; then Usage error "需要指定服务器Id -si 参数" exit1 fi BIN_DIR=${SERVER_DIR}/${SERVER_TYPE}_s${SERVER_ID}/bin PUB_ROOT=${SERVER_DIR}/${SERVER_TYPE}_s${SERVER_ID} CONFIG_DIR=${SERVER_DIR}/config/${SERVER_TYPE}_s${SERVER_ID} SvnUpdate Update if [ "${MODULES}" = "" ]; then cmd "========= sh ${BIN_DIR}/${SERVER_TYPE} eval \"reloader:reload_modules().\" =========" RET=`sh ${BIN_DIR}/${SERVER_TYPE} eval "reloader:reload_modules()."` # 全量更新修改svn版本号 cmd "========= cp -rf ${PRJ}/releases/svn_version ${SERVER_DIR}/${SERVER_TYPE}_s${SERVER_ID}/releases/svn_version =========" cp -rf ${PRJ}/releases/svn_version ${SERVER_DIR}/${SERVER_TYPE}_s${SERVER_ID}/releases/svn_version else cmd "========= sh ${BIN_DIR}/${SERVER_TYPE} eval \"reloader:reload_modules([${MODULES}]).\" =========" RET=`sh ${BIN_DIR}/${SERVER_TYPE} eval "reloader:reload_modules([${MODULES}])."` fi # if [ $? -ne 0 ]; then if [ "${RET}" != "ok" ]; then error "热更服务器失败,请检查" exit1 fi opt "热更服务器成功......" cd ${ROOT} } IsRun(){ RUN_PROC_CNT=`ps -ef | grep server.sh | grep -v grep | grep -v vi | wc -l` if [ ${RUN_PROC_CNT} -gt 2 ]; then opt "run proc cnt = ${RUN_PROC_CNT}" error "其他人正在运行中" exit1 fi } START_TIME=$(date '+%Y-%m-%d %H:%M:%S') lock_check # parse command line parameters while [ $# -ne 0 ] ; do PARAM=$1 shift case $PARAM in --) break ;; --help|-h) Usage; exit 0 ;; --server|-s) SERVER_TYPE=$1; shift ;; --ver|-v) VER=$1; shift ;; --plat|-p) PLAT=$1; shift ;; --lang|-l) PUSH_LANG=$1; shift ;; --tag|-t) TAG=$1; shift ;; --server_id|-si) SERVER_ID=$1; shift ;; --modules|-m) MODULES=$1; shift ;; *) ARGS="$ARGS $PARAM" ;; esac done if [ "${SERVER_TYPE}" = "" ]; then Usage error "需要指定服务器类型 -s 参数" exit1 fi #if [ ${TAG} != 'trunk' ]; then # TAG=branches/${TAG} #fi # svn目录 SVN_BASE_URL=${SVN_BASE_URL}/${TAG}/server # 发布目录 PUB_ROOT=${PUB_ROOT}/${PUSH_LANG}/${VER}/${PLAT}/${SERVER_TYPE} # 代码临时编译目录 TMP_SOURCE=${TMP_SOURCE}/${PUSH_LANG}/${TAG} #先确定更新的服务器类型 #确定最终发布路径 opt "ver=${VER} server=${SERVER_TYPE} root =${PUB_ROOT} tmp_source=${TMP_SOURCE}" set -- $ARGS ACTION=$1 shift case ${ACTION} in 'reboot') Reboot ;; 'reload') Reload ;; 'pub_rel') PubRelease ;; 'pub_up') PubUpdate ;; *) Usage ; exit1;; esac lock_release END_TIME=$(date '+%Y-%m-%d %H:%M:%S') echo -e "start_time = ${START_TIME}, end_time = ${END_TIME}"