Files
2026-05-19 11:30:21 +08:00

419 lines
12 KiB
Bash

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