Files
rebar_server/game_server/shell/server.sh
T
2026-05-19 11:30:21 +08:00

518 lines
16 KiB
Bash

#! /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