#! /bin/bash ROOT=`cd $(dirname $0);pwd` if [ -d ${ROOT} ]; then cd ${ROOT} fi ARGS="" ## 项目组自定义路径 # ==================================================================================== # 服务器svn根目录 SVN_BASE_URL=http://gwsj.4399svn.com/svn/ddt/project4 # 发版根目录 运维的目录规范 /data/xxx/server PUB_ROOT=/data/ddxq/server # 发版脚本 运维的规范 xxxpub PUB_CMD=ddxqpub # DEV BETA STABLE 这三个目录的代码对应运维给的三个发版目录 # 假设DEV对应主干的代码目录 比如主干代码是 ${SVN_BASE_URL}/trunk, 这里就填DEV=trunk DEV=trunk BETA=branches/cn/stage1 STABLE=stable BANSHU=branches/banshu # svn账号密码 USER=shouyouyizu PASSWORD=39420981 # 代码checkout的临时目录,编译用 TMP_SOURCE=/data/tmp_server/ddxq # 内网部署路径 SERVER_DIR=/data/server/ddxq # 内网主干登录服目录(内网重启和热更时指定的登录服) LOGIN_SERVER=login_server_s900 # 内网主干游戏服目录(内网重启和热更时指定的游戏服) GAME_SERVER=game_server_s901 # 内网版署登录服目录(内网重启和热更时指定的登录服) BS_LOGIN_SERVER=login_server_s700 # 内网版署游戏服目录(内网重启和热更时指定的游戏服) BS_GAME_SERVER=game_server_s701 # ==================================================================================== PLAT=android_cn PUSH_LANG=CN REBAR=rebar3 error() { NOW_TIME= 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 " -p, --plat android_cn|ios_cn|mix_cn 推送的平台" echo " -l, --lang CN 推送的语言" echo " -s, --server game_server|login_server|detour_server|cross_server|center_server 推送的服务器类型" echo "" } ##从svn下载对应的代码,并设置当前版本号 SvnUpdate () { if [ -d ${TMP_SOURCE} ]; then opt "${TMP_SOURCE} 目录已存在,svn update" cmd "========= svn up --force --accept tc ${TMP_SOURCE} --username ${USER} --password ${PASSWORD} =========" svn up --force --accept tc ${TMP_SOURCE} --username ${USER} --password ${PASSWORD} else opt "${TMP_SOURCE} 目录不存在,创建并svn checkout" cmd "========= svn co ${SVN_BASE_URL} ${TMP_SOURCE} --username ${USER} --password ${PASSWORD} =========" mkdir -p ${TMP_SOURCE} svn co ${SVN_BASE_URL} ${TMP_SOURCE} --username ${USER} --password ${PASSWORD} fi cd ${ROOT} } ## 生成全量包 Release () { if [ ! -d ${PUB_ROOT} ]; then mkdir -p ${PUB_ROOT} fi LAST_VERSION=`svn info ${TMP_SOURCE} | grep 'Last Changed Rev: ' | cut -d' ' -f4` if [ "${REL_VERSION}" = "" ] || [ "${REL_VERSION}" = "0" ]; then REL_VERSION=${LAST_VERSION} fi opt "========= LAST_VERSION=${LAST_VERSION}, REL_VERSION=${REL_VERSION} =========" PRJ=${TMP_SOURCE}/_build/${SERVER_TYPE}/rel/${SERVER_TYPE} REL_PACKET=${PRJ}/${SERVER_TYPE}-${REL_VERSION}.tar.gz if [ -f ${REL_PACKET} ]; then opt "========= Release package for version ${REL_VERSION} already exists =========" else # # 删除旧包,因为如果是升级包,里面没有自带erts # cmd "========= remove old packet: rm -rf ${REL_PACKET} =========" # rm -rf ${REL_PACKET} # # 删除旧的rebar3执行脚本,一个版本一个脚本可能是为了启动不同版本设置,但我们用不上先删了 cmd "========= remove old packet: rm -rf ${PRJ}/bin/game_server-* =========" rm -rf ${PRJ}/bin/${SERVER_TYPE}-* cd ${TMP_SOURCE} || exit1 opt "========= Generating release package for version ${REL_VERSION} =========" cmd "========= ${REBAR} as ${SERVER_TYPE} release =========" ${REBAR} as ${SERVER_TYPE} release || exit1 cmd "========= ${REBAR} as ${SERVER_TYPE} tar =========" ${REBAR} as ${SERVER_TYPE} tar || exit1 #保留最后10个(即第11个开始删除),太多的话会影响打升级包,占用大量内存和打包时间 # cmd "========= ls ${PRJ}/releases | grep -v RELEASES | grep -v "start_erl.data" | sort -rg | tail -n +11 | xargs rm -rf =========" # ls ${PRJ}/releases | grep -v RELEASES | grep -v "start_erl.data" | sort -rg | tail -n +11 | xargs rm -rf #保留最后10个包,太多的话会影响打升级包,占用大量内存和打包时间 # cmd "========= ls ${PRJ} | grep game_server- | sort -rg | tail -n +11 | xargs rm -rf =========" # ls ${PRJ} | grep game_server- | sort -rg | tail -n +11 | xargs rm -rf # 删除旧发版包内容 cmd "========= rm -rf ${PUB_ROOT}/* =========" rm -rf ${PUB_ROOT}/* fi cmd "========= tar -zxf ${REL_PACKET} -C ${PUB_ROOT} =========" tar -zxf ${REL_PACKET} -C ${PUB_ROOT} || exit1 # 删除bin下多余的文件,暂时先用手动删除,后面再研究能否用命令来删除 cmd "========= rm -rf ${PUB_ROOT}/bin/${SERVER_TYPE}-* =========" rm -rf ${PUB_ROOT}/bin/${SERVER_TYPE}-* cd ${ROOT} } Update () { if [ ! -d ${PUB_ROOT} ]; then opt "${PUB_ROOT} Not exists" exit1 fi PRJ=${TMP_SOURCE}/_build/${SERVER_TYPE}/rel/${SERVER_TYPE} # LAST_VERSION=`ls ${PRJ}/releases | grep -v RELEASES | grep -v "start_erl.data" | sort -rg | head -1` LAST_VERSION=`ls ${PRJ} | grep "game_server-" | sort -rg | head -1 | tr -cd "[0-9]"` if [ "${PREV_REL_REV}" = "" ] || [ "${PREV_REL_REV}" = "0" ]; then PREV_REL_REV=${LAST_VERSION} fi opt "========= LAST_VERSION=${LAST_VERSION}, PREV_REL_REV=${PREV_REL_REV} =========" REL_VERSION=`svn info ${TMP_SOURCE} | grep 'Last Changed Rev: ' | cut -d' ' -f4` # 没有新版本可以升级 if [ ${PREV_REL_REV} = ${REL_VERSION} ]; then opt "Is latest version, do not need upgrade ..." exit1 fi if [ -z ${PREV_REL_REV} ]; then opt "No previous release ${PREV_REL_REV}, skip update package generation...." exit1 else # 删除旧包,有可能是其他版本升级到该版本的包 cmd "========= remove old packet: rm -rf ${PRJ}/${SERVER_TYPE}-${REL_VERSION}.tar.gz =========" rm -rf ${PRJ}/${SERVER_TYPE}-${REL_VERSION}.tar.gz # 删除旧的rebar3执行脚本,一个版本一个脚本可能是为了启动不同版本设置,但我们用不上先删了 cmd "========= remove old packet: rm -rf ${PRJ}/bin/${SERVER_TYPE}-* =========" rm -rf ${PRJ}/bin/${SERVER_TYPE}-* cmd "========= cd ${TMP_SOURCE} =========" cd ${TMP_SOURCE} || exit1 opt "========= Generating update package for previous version ${PREV_REL_REV} =========" # 如果版本已经存在,则可能两次升级包基于的版本不同,需要先清理上次版本升级的信息 if [ ${LAST_VERSION} = ${REL_VERSION} ]; then cmd "========= ${REBAR} as ${SERVER_TYPE} appup clean =========" ${REBAR} as ${SERVER_TYPE} appup clean || exit1 fi cmd "========= ${REBAR} as ${SERVER_TYPE} release =========" ${REBAR} as ${SERVER_TYPE} release || exit1 cmd "========= ${REBAR} as ${SERVER_TYPE} appup generate --previous_version=${PREV_REL_REV} =========" ${REBAR} as ${SERVER_TYPE} appup generate --previous_version=${PREV_REL_REV} || exit1 cmd "========= ${REBAR} as ${SERVER_TYPE} relup --upfrom=${PREV_REL_REV} --relname=${SERVER_TYPE} --relvsn=${REL_VERSION} =========" ${REBAR} as ${SERVER_TYPE} relup --upfrom=${PREV_REL_REV} --relname=${SERVER_TYPE} --relvsn=${REL_VERSION} || exit1 cmd "========= ${REBAR} as ${SERVER_TYPE} tar =========" ${REBAR} as ${SERVER_TYPE} tar || exit1 fi cmd "========= cp -f ${PRJ}/${SERVER_TYPE}-${REL_VERSION}.tar.gz ${PUB_ROOT}/releases/ =========" cp -f ${PRJ}/${SERVER_TYPE}-${REL_VERSION}.tar.gz ${PUB_ROOT}/releases/ #保留最后10个包信息,太多的话会影响打升级包,占用大量内存和打包时间 # cmd "========= ls ${PRJ}/releases | grep -v RELEASES | grep -v "start_erl.data" | sort -rg | tail -n +11 | xargs rm -rf =========" # ls ${PRJ}/releases | grep -v RELEASES | grep -v "start_erl.data" | sort -rg | tail -n +11 | xargs rm -rf #保留最后10个包,太多的话会影响打升级包,占用大量内存和打包时间 # cmd "========= ls ${PRJ} | grep game_server- | sort -rg | tail -n +11 | xargs rm -rf =========" # ls ${PRJ} | grep game_server- | sort -rg | tail -n +11 | xargs rm -rf cd ${ROOT} } # 发版全量包 PubRelease() { opt "推送${VER}版本${SERVER_TYPE}全量包到外网" SvnUpdate Release if [ $? -ne 0 ]; then error "生成全量压缩包失败,请检查" exit1 fi cd ${ROOT} opt "更新完成,立刻发版${PUBNOW}" #版署服也放在beta版本中 if [ ${VER} = 'banshu' ]; then cmd "========= sh ${PUB_CMD} server ${PUSH_LANG} beta ${PLAT} =========" sh ${PUB_CMD} server ${PUSH_LANG} beta ${PLAT} else cmd "========= sh ${PUB_CMD} server ${PUSH_LANG} ${VER} ${PLAT} =========" sh ${PUB_CMD} server ${PUSH_LANG} ${VER} ${PLAT} fi } # 发版全量包 PubUpdate() { opt "推送${VER}版本${SERVER_TYPE}升级包到外网" SvnUpdate Update if [ $? -ne 0 ]; then error "生成升级压缩包失败,请检查" exit1 fi cd ${ROOT} opt "更新完成,立刻发版${PUBNOW}" #版署服也放在beta版本中 if [ ${VER} = 'banshu' ]; then cmd "========= sh ${PUB_CMD} server ${PUSH_LANG} beta ${PLAT} =========" sh ${PUB_CMD} server ${PUSH_LANG} beta ${PLAT} else cmd "========= sh ${PUB_CMD} server ${PUSH_LANG} ${VER} ${PLAT} =========" sh ${PUB_CMD} server ${PUSH_LANG} ${VER} ${PLAT} fi } Reboot(){ opt "更新重启${VER}版本${SERVER_TYPE}" if [ ${SERVER_TYPE} = 'login_server' ]; then BIN_DIR=${SERVER_DIR}/${LOGIN_SERVER}/bin PUB_ROOT=${SERVER_DIR}/${LOGIN_SERVER} CONFIG_DIR=${SERVER_DIR}/config/${LOGIN_SERVER} elif [ ${SERVER_TYPE} = 'game_server' ]; then BIN_DIR=${SERVER_DIR}/${GAME_SERVER}/bin PUB_ROOT=${SERVER_DIR}/${GAME_SERVER} CONFIG_DIR=${SERVER_DIR}/config/${GAME_SERVER} else Usage error "${SERVER_TYPE}不是有效的服务器类型" exit1 fi SvnUpdate cmd "========= sh ${BIN_DIR}/${SERVER_TYPE} stop =========" sh ${BIN_DIR}/${SERVER_TYPE} stop #要先检查是否运行中 # if [ $? -ne 0 ]; then # error "关闭服务器失败,请检查" # exit1 # fi 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 if [ $? -ne 0 ]; then error "指定版本服代码编译失败,请检查" exit1 fi cmd "========= rm -rf ${PUB_ROOT}/sys.config =========" rm -rf ${PUB_ROOT}/sys.config cmd "========= cp ${CONFIG_DIR}/sys.config ${PUB_ROOT}/sys.config =========" cp ${CONFIG_DIR}/sys.config ${PUB_ROOT}/sys.config cmd "========= rm -rf ${PUB_ROOT}/vm.args =========" rm -rf ${PUB_ROOT}/vm.args cmd "========= cp ${CONFIG_DIR}/vm.args ${PUB_ROOT}/vm.args =========" cp ${CONFIG_DIR}/vm.args ${PUB_ROOT}/vm.args cmd "========= sh ${BIN_DIR}/${SERVER_TYPE} daemon =========" sh ${BIN_DIR}/${SERVER_TYPE} daemon if [ $? -ne 0 ]; then error "启动服务器失败,请检查" exit1 fi opt "重启服务器成功......" cd ${ROOT} } Reload(){ opt "热更${VER}版本${SERVER_TYPE}" if [ ${SERVER_TYPE} = 'login_server' ]; then BIN_DIR=${SERVER_DIR}/${LOGIN_SERVER}/bin PUB_ROOT=${SERVER_DIR}/${LOGIN_SERVER} elif [ ${SERVER_TYPE} = 'game_server' ]; then BIN_DIR=${SERVER_DIR}/${GAME_SERVER}/bin PUB_ROOT=${SERVER_DIR}/${GAME_SERVER} else Usage error "${SERVER_TYPE}不是有效的服务器类型" exit1 fi SvnUpdate PREV_REL_REV=`ls ${PUB_ROOT}/releases | grep -v RELEASES | grep -v "start_erl.data" | sort -rg | head -1` REL_VERSION=`svn info ${TMP_SOURCE} | grep 'Last Changed Rev: ' | cut -d' ' -f4` if [ ${PREV_REL_REV} = ${REL_VERSION} ]; then opt "运行的代码已经是最新版本,无需热更...." exit 0 fi Update if [ $? -ne 0 ]; then error "生成升级压缩包失败,请检查" exit1 fi sh ${BIN_DIR}/${SERVER_TYPE} upgrade ${REL_VERSION} if [ $? -ne 0 ]; then error "热更服务器失败,请检查" exit1 fi opt "热更服务器成功......" } 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 } #RUN_PROC_CNT=`ps -ef | grep -v grep | grep server.sh | wc -l` #opt "run proc cnt = ${RUN_PROC_CNT}" #if [ ${RUN_PROC_CNT} -gt 2 ]; then # error "其他人正在运行中" # exit1 #fi 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 ;; --pre_version|-pv) PREV_REL_REV=$1; shift ;; --release_version|-rv) REL_VERSION=$1; shift ;; *) ARGS="$ARGS $PARAM" ;; esac done if [ "${SERVER_TYPE}" = "" ]; then Usage error "需要指定-s 参数" exit1 fi #先确定更新的服务器类型 if [ ${VER} = 'dev' ]; then SVN_BASE_URL=${SVN_BASE_URL}/${DEV}/server/server PUB_ROOT=${PUB_ROOT}/${PUSH_LANG}/${VER}/${PLAT}/${SERVER_TYPE} elif [ ${VER} = 'banshu' ]; then SVN_BASE_URL=${SVN_BASE_URL}/${BANSHU}/server/server PUB_ROOT=${PUB_ROOT}/${PUSH_LANG}/beta/${PLAT}/${SERVER_TYPE} LOGIN_SERVER = ${BS_LOGIN_SERVER} GAME_SERVER = ${BS_GAME_SERVER} elif [ ${VER} = 'beta' ]; then SVN_BASE_URL=${SVN_BASE_URL}/${BETA}/server/server PUB_ROOT=${PUB_ROOT}/${PUSH_LANG}/${VER}/${PLAT}/${SERVER_TYPE} elif [ ${VER} = 'stable' ]; then SVN_BASE_URL=${SVN_BASE_URL}/${STABLE}/server/server PUB_ROOT=${PUB_ROOT}/${PUSH_LANG}/${VER}/${PLAT}/${SERVER_TYPE} else Usage error "${VER}不是有效的服务器版本: [dev | beta | stable]" exit1 fi # PUB_ROOT=${PUB_ROOT}/${PUSH_LANG}/${VER}/${PLAT}/${SERVER_TYPE} #PUB_ROOT=${PUB_ROOT}/${PUSH_LANG}/${VER}/${PLAT}/${SERVER_TYPE} # 代码临时编译目录 TMP_SOURCE=${TMP_SOURCE}/${PUSH_LANG}/${VER}/${PLAT} #先确定更新的服务器类型 #确定最终发布路径 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