rebar3 服务器

This commit is contained in:
lwt
2026-05-19 11:30:21 +08:00
parent aeb18acee0
commit 03fd2da480
5187 changed files with 3670646 additions and 0 deletions
+69
View File
@@ -0,0 +1,69 @@
DB_HOST='172.16.12.220'
DB_USE='ddxqadmin'
DB_PASS='ddxq@44168deabe63'
DB_PORT='3306'
DB_SERVER='ddxq_s900_trunk_login'
DB_LOCAL_HOST='127.0.0.1'
DB_LOCAL_USE='root'
DB_LOCAL_PASS='root'
DB_LOCAL_PORT='3306'
DB_LOCAL_SERVER='local_sql'
LOGIN_SERVER_NODE='login_server_s900@172.16.12.220'
DEF_SERVER_ID='177'
DEF_ALIAS='lwt_game'
DEF_SERVER='game_server'
DEF_COOKIE='node-cookie'
SVN='svn'
PYTHON='python'
ERL='erl'
SQL_GAME_UPDATE='server/server/apps/game_server/sql/game_update.sql'
SQL_GAME_INIT='server/server/apps/game_server/sql/game_init.sql'
if [[ `in_cygwin` == "1" ]] ; then
REBAR='rebar3.cmd'
WERL='werl'
ESCRIPT_EMULATOR='werl'
else
REBAR='rebar3'
fi
## 项目组自定义路径
# ====================================================================================
# 服务器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
+6
View File
@@ -0,0 +1,6 @@
#! /bin/bash
ROOT=`cd $(dirname $0);pwd`
cd ${ROOT}
./game_server remote_console
+227
View File
@@ -0,0 +1,227 @@
#!/usr/bin/env bash
#-------------------------------------------------
# 工具包主脚本
# @author lwt
#-------------------------------------------------
# 检查是否在cygwin中
in_cygwin(){
local os=$(uname)
if [[ "${os:0:3}" == "CYG" ]]; then
echo "1"
else
echo "0"
fi
}
# 检查某个函数是否已经定义
is_fun_exists(){
declare -F "$1" > /dev/null; return $?
}
# 检查某个命令是否存在h
is_command_exists(){
command -v $1 >/dev/null; return $?
}
# 检查screen session是否存在
is_screen_exists(){
[[ $(screen -ls | grep "$1" | wc -l ) -gt 0 ]] ; return $?
}
# 是否整数
is_integer(){
local re='^[0-9]+$'
[[ $1 =~ $re ]]; return $?
}
# 检查数组中是否存在某个元素
# 参数1:数组
# 参数2: 元素
in_array(){
declare -a haystack=("${!1}")
local needle=${2}
for v in ${haystack[@]}; do
if [[ ${v} == ${needle} ]]; then
return 0
fi
done
return 1
}
# 检查当前运行环境中是否存在tty
has_tty(){
[[ -t 1 ]]; return $?
}
# 输出一条普通信息
INFO(){
echo -e "\e[92m=>\e[0;0m ${1}"
}
# 输出一条普通信息
FROMAT(){
echo -e "\e[92m \e[0;0m ${1}"
}
# 输出一条错误信息
ERR(){
>&2 echo -e "\e[91m>> ${1}\e[0;0m"
}
# 打印信息
OPT() {
echo -e "[操作] $(date '+%Y-%m-%d %H:%M:%S') $@"
}
CMD() {
echo -e "[指令] $(date '+%Y-%m-%d %H:%M:%S') $@"
}
# 检查锁
lock_check(){
local task=$1
lock=/tmp/server_lock_${task}.lock
if [ -f $lock ]; then
taskname=$(<$lock)
ERR "正在执行\"$taskname\"任务,需要等待该任务完成..."
ERR "如无任务执行,自行删除${lock}文件"
exit 1
fi
touch $lock # 加锁
echo $task > $lock
}
# 解锁
lock_release(){
local task=$1
lock=/tmp/server_lock_${task}.lock
rm -f $lock
}
# 调用函数
_CALL_FUNCTION(){
resolve_arg $@
if is_fun_exists ${FUN_NAME}; then
check_arg
${FUN_NAME} $ARGS
exit 0
fi
help
}
# 解析参数
resolve_arg(){
FUN_NAME="fun_${1}"
shift
while [ $# -ne 0 ] ; do
PARAM=$1
shift
case $PARAM in
--) break ;;
--server|-s) SERVER_TYPE=$1; shift ;;
--alias|-a) ALIAS=$1; shift ;;
--server_id|-si) SERVER_ID=$1; shift ;;
--db_host|-dbh) DB_HOST=$1; shift;;
*) ARGS="$ARGS $PARAM" ;;
esac
done
}
# 检测参数
check_arg(){
if [ "${ALIAS}" = "" ]; then
ALIAS=${DEF_ALIAS}
fi
if [ "${SERVER_TYPE}" = "" ]; then
SERVER_TYPE=${DEF_SERVER}
fi
if [ "${SERVER_ID}" = "" ]; then
SERVER_ID=${DEF_SERVER_ID}
fi
if [ "${DB_HOST}" = "" ]; then
DB_HOST=${DB_HOST}
fi
}
help(){
INFO "当前路径:${ROOT}"
INFO "用法:"
INFO "指令 [参数]"
INFO "参数:"
INFO " -si, --server_id 服务器id 推送的版本"
INFO " -a, --alias 别名"
INFO " -s, --server game_server|login_server 服务器类型"
action
INFO "未传参数则取默认参数:可以config.sh修改"
INFO "是否查看默认参数(y/n):"
read IS
if [ ${IS} == y ]; then
INFO "默认参数:`cat ./shell/config.sh`"
fi
}
action(){
INFO "指令列表:"
for k in ${!DOC[@]}; do
>&2 echo -e -n "\e[95m${k}\e[0;0m"
eval "printf ' %.0s' {1..$((26 - ${#k}))}"
>&2 echo -e "${DOC[$k]}"
done
}
# 输出命令行不全信息
fun_completion(){
echo $(declare -p DOC)
}
# --- 执行入口 -----------------------------------------------------
declare -A DOC
export ROOT=$(dirname $(dirname "$PWD"))
# 加载配置文件
source ${ROOT}/server/server/shell/config.sh
# 载入子仓库中的工具脚本
scripts=("server/server/shell/gen.sh" "server/server/shell/sql.sh" "server/server/shell/srv.sh" "server/server/shell/svn.sh")
for f in ${scripts[@]}; do
if [ ! -f ${ROOT}/${f} ]; then
continue
fi
source ${ROOT}/${f}
done
# 根据参数调用相应的命令
_CALL_FUNCTION $@
#declare -A DOC
#FilePath=$(dirname $(readlink -f "$0"))
#ROOT=$(dirname "${FilePath}")
#
## 加载配置文件
#source ${ROOT}/shell/config.sh
#
#
## 载入子仓库中的工具脚本
#scripts=("shell/gen.sh" "shell/sql.sh" "shell/srv.sh" "shell/svn.sh")
#for f in ${scripts[@]}; do
# if [ ! -f ${ROOT}/${f} ]; then
# continue
# fi
# source ${ROOT}/${f}
#done
#
## 根据参数调用相应的命令
#_CALL_FUNCTION $@
+77
View File
@@ -0,0 +1,77 @@
#!/usr/bin/env bash
#-------------------------------------------------
# 命令脚本
# @author lwt
#-------------------------------------------------
# 生成启动脚本
DOC[gen_start]="生成启动脚本"
fun_gen_start(){
INFO "执行命令:rebar3 auto_config compile"
INFO "生成\e[92m启动脚本\e[0;0m..."
cd ${ROOT}
${REBAR} auto_config compile
}
# 生成模板
DOC[gen_mod]="生成功能模板,参数:功能名"
fun_gen_mod(){
INFO "执行命令:rebar3 gen_mod compile -m ${1}"
INFO "生成\e[92m${1}\e[0;0m功能模板..."
cd ${ROOT}
${REBAR} gen_mod compile -m $1
}
# 生成数据
DOC[gen_data]="生成数据"
fun_gen_data(){
INFO "执行命令:rebar3 gen_data data -m ${1}"
INFO "生成\e[92m${1}\e[0;0m数据..."
${REBAR} gen_data data -m ${1}
}
# 生成数据
DOC[gen_cfg]="生成数据模板"
fun_gen_cfg(){
INFO "执行命令:rebar3 gen_data cfg -m ${1}"
INFO "生成\e[92m${1}\e[0;0m数据模板..."
${REBAR} gen_data cfg -m ${1}
}
# 生成数据
DOC[gen_tpl]="生成配置表"
fun_gen_tpl(){
INFO "执行命令:rebar3 gen_data tpl -m ${1}"
INFO "生成\e[92m${1}\e[0;0m配置表..."
${REBAR} gen_data tpl -m ${1}
}
# 生成日志文件
DOC[gen_tbllog]="生成日志文件"
fun_gen_tbllog(){
INFO "执行命令:rebar3 tbllog compile"
INFO "生成日志文件..."
${REBAR} tbllog compile
}
# 生成协议文件
DOC[gen_proto]="生成协议相关文件"
fun_gen_proto(){
INFO "执行命令:rebar3 protobuf compile -a ${DEF_SERVER}"
INFO "正在生成协议相关文件..."
${REBAR} protobuf clean -a ${DEF_SERVER}
${REBAR} protobuf compile -a ${DEF_SERVER}
}
# 生成数据文件
DOC[gen_cache]="生成数据文件"
fun_gen_cache(){
INFO "执行命令:rebar3 cache compile"
INFO "生成数据文件..."
${REBAR} cache clean -a ${DEF_SERVER}
${REBAR} cache compile
${REBAR} tbllog clean -a ${DEF_SERVER}
${REBAR} tbllog compile
}
+81
View File
@@ -0,0 +1,81 @@
#!/bin/bash
set -e
useage() {
echo "usage: $0 user passwd sql_path [infix] [host] [port] [login_db]"
echo "user: 数据库用户名"
echo "passwd: 数据库密码"
echo "sql_path: 导入SQL文件路径"
echo "infix: 数据库名中缀 默认:sql_path指定的SQL文件的数据库名"
echo "host: 数据库IP地址 默认:${HOST}"
echo "port: 数据库端口号 默认:${PORT}"
echo "login_db: 登录服数据库 默认:${LOGIN_DB}"
}
# 执行SQL命令
excute() {
CMD="mysql -u ${USER} -p${PASSWD} -h ${HOST} -P ${PORT} -v -e \"$1\""
echo "执行: ${CMD}"
eval "${CMD}"
}
# 重建数据库
rebuild() {
excute "DROP DATABASE IF EXISTS ${GAME_DB};"
excute "DROP DATABASE IF EXISTS ${LOG_DB};"
excute "CREATE DATABASE IF NOT EXISTS ${GAME_DB};"
excute "CREATE DATABASE IF NOT EXISTS ${LOG_DB};"
}
# 导入数据库
import_sql(){
CMD="mysql -u ${USER} -p${PASSWD} -h ${HOST} -P ${PORT} ${GAME_DB} < ${SQL_PATH}"
echo "执行: ${CMD}"
eval "${CMD}"
}
# 插入玩家数据到登录数据库
insert_account(){
SQL="INSERT IGNORE INTO ${LOGIN_DB}.account_info SELECT CONCAT('0_', t.role_id), t.fn_name, '', t.register_time, 1, '#{}' FROM ${GAME_DB}.role t;"
excute "${SQL}"
}
# 修改游戏服角色信息
update_role() {
SQL="UPDATE ${GAME_DB}.role SET server_id=${SERVER_ID}, register_server_id=${SERVER_ID}, fn_platform=0;";
excute "${SQL}"
}
USER=$1
PASSWD=$2
SQL_PATH=$3
if [ -z "${USER}" ] || [ -z "${PASSWD}" ] || [ -z "${SQL_PATH}" ]; then
useage
else
INFIX=${4:-$(basename ${SQL_PATH} | cut -d_ -f3- | cut -d. -f1)}
if [ -n "${INFIX}" ]; then
HOST=${5:-localhost}
PORT=${6:-3306}
LOGIN_DB=${7:-ddxq_s900_trunk_login}
GAME_DB=ddxq_${INFIX}_game
LOG_DB=ddxq_${INFIX}_log
SERVER_ID=$(echo ${INFIX} | grep -o -E '[0-9]+')
echo "导入数据数据库: ${GAME_DB}"
echo "服务器ID: ${SERVER_ID}"
rebuild
import_sql
update_role
insert_account
echo "导入结束!"
else
echo "无法提取数据库中缀名,导入失败!"
fi
fi
+92
View File
@@ -0,0 +1,92 @@
#!/bin/bash
set -e
useage() {
echo "usage: $0 user passwd sql_path [infix] [host] [port] [login_db]"
echo "user: 数据库用户名"
echo "passwd: 数据库密码"
echo "sql_path: 导入SQL文件路径"
echo "infix: 数据库名中缀 默认:sql_path指定的SQL文件的数据库名"
echo "host: 数据库IP地址 默认:${HOST}"
echo "port: 数据库端口号 默认:${PORT}"
echo "login_db: 登录服数据库 默认:${LOGIN_DB}"
}
# 执行SQL命令
excute() {
CMD="mysql -u ${USER} -p${PASSWD} -h ${HOST} -P ${PORT} -v -e \"$1\""
echo "执行: ${CMD}"
eval "${CMD}"
}
# 重建数据库
rebuild() {
if [ "${DB_TYPE}" != "log" ]; then
excute "DROP DATABASE IF EXISTS ${GAME_DB};"
excute "CREATE DATABASE IF NOT EXISTS ${GAME_DB};"
else
excute "DROP DATABASE IF EXISTS ${LOG_DB};"
excute "CREATE DATABASE IF NOT EXISTS ${LOG_DB};"
fi
}
# 导入数据库
import_sql(){
if [ "${DB_TYPE}" != "log" ]; then
ECUTE_DB=${GAME_DB}
else
ECUTE_DB=${LOG_DB}
fi
CMD="mysql -u ${USER} -p${PASSWD} -h ${HOST} -P ${PORT} ${ECUTE_DB} < ${SQL_PATH}"
echo "执行: ${CMD}"
eval "${CMD}"
}
# 插入玩家数据到登录数据库
insert_account(){
SQL="INSERT IGNORE INTO ${LOGIN_DB}.account_info SELECT CONCAT('0_', t.role_id), t.fn_name, '', t.register_time, 1, '#{}' FROM ${GAME_DB}.role t;"
excute "${SQL}"
}
# 修改游戏服角色信息
update_role() {
SQL="UPDATE ${GAME_DB}.role SET server_id=${SERVER_ID}, register_server_id=${SERVER_ID}, fn_platform=0;";
excute "${SQL}"
}
USER=$1
PASSWD=$2
SQL_PATH=$3
DB_TYPE=$4
if [ -z "${USER}" ] || [ -z "${PASSWD}" ] || [ -z "${SQL_PATH}" ]; then
useage
else
INFIX=${5:-$(basename ${SQL_PATH} | cut -d_ -f3- | cut -d. -f1)}
if [ -n "${INFIX}" ]; then
HOST=${6:-localhost}
PORT=${7:-3306}
LOGIN_DB=${8:-ddxq_s900_trunk_login}
GAME_DB=ddxq_${INFIX}_game
LOG_DB=ddxq_${INFIX}_log
SERVER_ID=$(echo ${INFIX} | grep -o -E '[0-9]+')
echo "导入数据数据库: ${GAME_DB}"
echo "服务器ID: ${SERVER_ID}"
rebuild
import_sql
if [ "${DB_TYPE}" != "log" ]; then
insert_account
update_role
fi
echo "导入结束!"
else
echo "无法提取数据库中缀名,导入失败!"
fi
fi
+59
View File
@@ -0,0 +1,59 @@
#! /bin/bash
SERVER_DIR=/data/server/dhmmc
ROOT=`cd $(dirname $0);pwd`
if [ -d ${ROOT} ]; then
cd ${ROOT}
fi
error() {
echo -e "[错误] $(date '+%Y-%m-%d %H:%M:%S') $@"
exit 1
}
# 打印信息
echo2() {
echo -e "[操作] $(date '+%Y-%m-%d %H:%M:%S') $@"
}
cmd() {
echo -e "[指令] $(date '+%Y-%m-%d %H:%M:%S') $@"
}
cmd "========= sh ${SERVER_DIR}/login_server_s900/bin/login_server eval \"login_server_app:clear_server_db($1).\" ========="
sh ${SERVER_DIR}/login_server_s900/bin/login_server eval "login_server_app:clear_server_db($1)."
if [ $? -ne 0 ]; then
error "关服删库失败,请检查"
exit 1
fi
cmd "========= sh ${SERVER_DIR}/login_server_s900/bin/login_server eval \"login_server_app:remove_server_data($1).\" ========="
sh ${SERVER_DIR}/login_server_s900/bin/login_server eval "login_server_app:remove_server_data($1)."
if [ $? -ne 0 ]; then
error "清理登录服数据失败,请检查"
exit 1
fi
case "$1" in
"901")
cmd "========= sh ${SERVER_DIR}/game_server_s901/bin/game_server daemon ========="
sh ${SERVER_DIR}/game_server_s901/bin/game_server daemon
;;
"902")
cmd "========= sh ${SERVER_DIR}/game_server_s902/bin/game_server daemon ========="
sh ${SERVER_DIR}/game_server_s902/bin/game_server daemon
;;
*)
echo2 "清档后请自行启动服务器"
;;
esac
#if [ $1 -eq 901 ]; then
# cmd "========= rm -rf ${SERVER_DIR}/game_server_s901/dets ========="
# rm -rf ${SERVER_DIR}/game_server_s901/dets
# cmd "========= sh ${SERVER_DIR}/game_server_s901/bin/game_server daemon ========="
# sh ${SERVER_DIR}/game_server_s901/bin/game_server daemon
#fi
echo2 "$1服 清档成功......"
+419
View File
@@ -0,0 +1,419 @@
#! /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}"
+348
View File
@@ -0,0 +1,348 @@
#! /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_pub.lock
if [ -f $lock ]; then
error "正在执行其他任务..., 如确认没有其他任务在执行,请删除文件${lock}"
exit 1
fi
touch $lock # 加锁
echo $task > $lock
}
# 解锁
lock_release(){
local task=$1
lock=/tmp/server_shell_pub.lock
rm -f $lock
}
# 使用说明
Usage ()
{
echo "说明:"
echo "当前路径:${ROOT}"
echo "用法:"
echo "动作 [选项]"
echo "动作:"
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
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`
# 复制配置表,修改编译选项
if [ "${VER}" != "dev" ]; then
cmd "========= sed -i \"s/% {d, 'EXTERNAL'}/{d, 'EXTERNAL'}/g\" ${TMP_SOURCE}/rebar.config ========="
sed -i "s/% {d, 'EXTERNAL'}/{d, 'EXTERNAL'}/g" ${TMP_SOURCE}/rebar.config
fi
cmd "========= ${REBAR} as ${SERVER_TYPE} release ========="
${REBAR} as ${SERVER_TYPE} release || exit1
if [ "${VER}" != "dev" ]; then
# 这里拷贝只是为了确认是否修改成功
cmd "========= rm -rf ${TMP_SOURCE}/rebar.config.release ========="
rm -rf ${TMP_SOURCE}/rebar.config.release
cmd "========= cp ${TMP_SOURCE}/rebar.config ${TMP_SOURCE}/rebar.config.release ========="
cp ${TMP_SOURCE}/rebar.config ${TMP_SOURCE}/rebar.config.release
cmd "========= sed -i \"s/{d, 'EXTERNAL'}/% {d, 'EXTERNAL'}/g\" ${TMP_SOURCE}/rebar.config ========="
sed -i "s/{d, 'EXTERNAL'}/% {d, 'EXTERNAL'}/g" ${TMP_SOURCE}/rebar.config
fi
# 删除旧代码
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`
# 复制配置表,修改编译选项
if [ "${VER}" != "dev" ]; then
cmd "========= sed -i \"s/% {d, 'EXTERNAL'}/{d, 'EXTERNAL'}/g\" ${TMP_SOURCE}/rebar.config ========="
sed -i "s/% {d, 'EXTERNAL'}/{d, 'EXTERNAL'}/g" ${TMP_SOURCE}/rebar.config
fi
cmd "========= ${REBAR} as ${SERVER_TYPE} release ========="
${REBAR} as ${SERVER_TYPE} release || exit1
if [ "${VER}" != "dev" ]; then
# 这里拷贝只是为了确认是否修改成功
cmd "========= rm -rf ${TMP_SOURCE}/rebar.config.release ========="
rm -rf ${TMP_SOURCE}/rebar.config.release
cmd "========= cp ${TMP_SOURCE}/rebar.config ${TMP_SOURCE}/rebar.config.release ========="
cp ${TMP_SOURCE}/rebar.config ${TMP_SOURCE}/rebar.config.release
cmd "========= sed -i \"s/{d, 'EXTERNAL'}/% {d, 'EXTERNAL'}/g\" ${TMP_SOURCE}/rebar.config ========="
sed -i "s/{d, 'EXTERNAL'}/% {d, 'EXTERNAL'}/g" ${TMP_SOURCE}/rebar.config
fi
# 同步热更的代码和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}
}
IsRun(){
RUN_PROC_CNT=`ps -ef | grep server_pub.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
'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}"
+517
View File
@@ -0,0 +1,517 @@
#! /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
+305
View File
@@ -0,0 +1,305 @@
#!/usr/bin/env bash
#-------------------------------------------------
# 命令脚本
# @author lwt
#-------------------------------------------------
# 连接数据库
DOC[sql_start]="连接数据库 参数:数据库名称"
fun_sql_start(){
is_exists_server_id
DB=`show_game_db ${SERVER_ID}`
INFO "连接\e[92m${DB}\e[0;0m数据库"
start ${DB}
}
# 查看数据库
DOC[sql_all_data]="查看数据库"
fun_sql_all_data(){
INFO "查看ip:\e[92m${DB_HOST}\e[0;0m所有数据库..."
show_databases ${DB_HOST}
}
# 远程执行sql脚本
DOC[sql_update_sql]="远程执行sql脚本"
fun_sql_update_sql(){
is_exists_server_id
DB=`show_game_db ${SERVER_ID}`
FILE=${ROOT}/${SQL_GAME_UPDATE}
INFO "数据库::\e[92m${DB}\e[0;0m 执行sql脚本...${FILE}"
update_sql ${DB} ${FILE}
# cat /dev/null > ${FILE}
}
# 生成本地sql数据库
DOC[sql_local]="生成本地sql数据库"
fun_sql_local(){
FILE=${ROOT}/${SQL_GAME_INIT}
mysql -A -h ${DB_LOCAL_HOST} -u${DB_LOCAL_USE} -p${DB_LOCAL_PASS} -P${DB_LOCAL_PORT} -e "DROP DATABASE if exists ${DB_LOCAL_SERVER}; create database if not exists ${DB_LOCAL_SERVER};"
INFO "数据库::\e[92m${DB_LOCAL_HOST}\e[0;0m 生成本地sql数据库...${FILE}"
mysql -A -h ${DB_LOCAL_HOST} -u${DB_LOCAL_USE} -p${DB_LOCAL_PASS} -P${DB_LOCAL_PORT} -D ${DB_LOCAL_SERVER} < ${FILE}
}
# 查看服务器列表
DOC[sql_server]="查看服务器列表"
fun_sql_server(){
INFO "查看ip:\e[92m${DB_HOST}\e[0;0m所有服务器列表..."
show_server ${DB_HOST}
}
# 查看所有表
DOC[sql_all_table]="查看所有数据表"
fun_sql_all_table(){
is_exists_server_id
DB=`show_game_db ${SERVER_ID}`
INFO "查看所有\e[92m${DB}\e[0;0m数据表..."
TABLES=`show_tables ${DB}`
for TABLE in ${TABLES[*]}; do
NUM=`table_count ${DB} ${TABLE}`
FROMAT "\e[92m${TABLE}\e[0;0m count in \e[92m${NUM}\e[0;0m"
done
}
# 查看所有账号
DOC[sql_all_account]="查看所有账号 参数:服务器id"
fun_sql_all_account(){
is_exists_server_id
DB=`show_game_db ${SERVER_ID}`
is_exists_data ${DB}
INFO "查看所有\e[92m${DB}\e[0;0m中的所有账号..."
show_account ${DB}
}
# 清表结构
DOC[sql_del_table]="删除数据表 参数:表名 服务器id"
fun_sql_del_table(){
if [ "${1}" = "" ]; then
ERR "请选中要删除的表格"
exit 0
else
TABLE=$1
fi
is_exists_server_id
DB=`show_game_db ${SERVER_ID}`
is_exists_table ${DB} ${TABLE}
INFO "删除\e[92m${DB}\e[0;0m数据库的\e[92m${TABLE}\e[0;0m表格"
INFO "确定要删除(y/n):"
read IS
if [ ${IS} == y ]; then
drop_table ${DB} ${TABLE}
if [ $? -ne 0 ]; then
ERR "删除失败,请检查"
fi
INFO "删除完成"
else
INFO "取消删除"
fi
}
# 清档
DOC[sql_clear_db]="停服清档 参数:服务器id"
fun_sql_clear_db(){
is_exists_server_id
GAME_DB=`show_game_db ${SERVER_ID}`
LOG_DB=`show_log_db ${SERVER_ID}`
INFO "正在删除数据表\e[92m${GAME_DB}\e[0;0m"
INFO "正在删除日志表\e[92m${LOG_DB}\e[0;0m"
INFO "确定要清档(y/n):"
read IS
if [ "${IS}" == "y" ] || [ "${IS}" == "Y" ]; then
#关服
SERVER_NODE=`show_server_node ${SERVER_ID}`
fun_srv_stop ${SERVER_ID}
drop_login ${SERVER_ID}
drop_database ${GAME_DB}
drop_database ${LOG_DB}
rm -rf ${ROOT}/server/server/dets
INFO "清档完成"
else
INFO "取消清档"
fi
}
# 执行sql命令
DOC[sql_command]="执行sql命令 参数:服务器id sql命令"
fun_sql_command(){
if [ "$*" = "" ]; then
ERR "请输入命令"
exit 1
else
COMMAND=$*
fi
is_exists_server_id
DB_NAME=`show_game_db ${SERVER_ID}`
INFO "数据库\e[92m${DB_NAME}\e[0;0m执行\e[92m${COMMAND}\e[0;0m的命令"
command ${COMMAND}
}
# 查询表结构
DOC[sql_desc]="查询表结构 参数:表名 server_id"
fun_sql_desc(){
if [ "${1}" = "" ]; then
ERR "请输入要查询的表格"
exit 0
else
TABLE=$1
fi
is_exists_server_id
DB=`show_game_db ${SERVER_ID}`
INFO "查看\e[92m${DB}\e[0;0m数据库的\e[92m${TABLE}\e[0;0m表格结构"
is_exists_table ${DB} ${TABLE}
NUM=`table_count ${DB} ${TABLE}`
INFO "表格行数${NUM}"
desc ${DB} ${TABLE}
exit 0
}
# 判断表是否存在
is_exists_table(){
DB=$1
TABLE=$2
TABLES=`show_tables ${DB}`
if is_exist ${TABLE} ${TABLES}; then
return 0
else
ERR "要删除的${TABLE}表不存在"
INFO "是否查看所有表(y/n)"
read ALL
if [ "${ALL}" == "y" ] || [ "${ALL}" == "Y" ]; then
fun_sql_all_table
fi
exit 1
fi
}
# 判断数据表是否存在
is_exists_data(){
DB=$1
TABLES=`show_databases ${DB_HOST}`
if is_exist ${DB} ${TABLES}; then
return 0
else
ERR "查询的${DB}数据库不存在"
INFO "是否查看所有数据库(y/n)"
read ALL
if [ "${ALL}" == "y" ] || [ "${ALL}" == "Y" ]; then
fun_sql_all_data
fi
exit 1
fi
}
# 判断服务器是否存在
is_exists_server_id(){
TABLES=`show_server_id`
if is_exist ${SERVER_ID} ${TABLES}; then
return 0
else
ERR "要操作的(server_id = ${SERVER_ID})服务器不存在"
INFO "是否查看所服务器(y/n)"
read ALL
if [ "${ALL}" == "y" ] || [ "${ALL}" == "Y" ]; then
fun_sql_server
fi
exit 1
fi
}
#判断是否存在
is_exist(){
TYPE=$1
shift
# 将输入的参数转换为列表
TYPES=$@
for K in ${TYPES[*]}; do
if [[ "${TYPE}" == "${K}" ]]; then
return 0
fi
done
return 1
}
# 启动服务器
start(){
mysql -A -h ${DB_HOST} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -D ${1}
}
# 获取数据库
show_server(){
mysql -A -h ${1} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -D ${DB_SERVER} -e "select server_id,game_db,server_node,role_cnt from server_info;"
}
# 获取数据库
show_server_node(){
mysql -A -h ${DB_HOST} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -D ${DB_SERVER} -BNe "select server_node from server_info where server_id = ${1};"
}
# 获取数据库
show_server_id(){
mysql -A -h ${DB_HOST} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -D ${DB_SERVER} -BNe "select server_id from server_info;"
}
# 获取数据库
show_game_db(){
mysql -A -h ${DB_HOST} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -D ${DB_SERVER} -BNe "select game_db from server_info where server_id = ${1};"
}
# 获取数据库
show_log_db(){
mysql -A -h ${DB_HOST} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -D ${DB_SERVER} -BNe "select log_db from server_info where server_id = ${1};"
}
# 获取数据库
show_databases(){
mysql -A -h ${1} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -e "show databases"
}
# 获取所有表
show_tables(){
mysql -A -h ${DB_HOST} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -D ${1} -BNe "show tables"
}
# 获取所有账号
show_account(){
mysql -A -h ${DB_HOST} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -D ${1} -e "select role_id,role_name,fn_uid,level from role"
}
# 获取表数量
table_count(){
mysql -A -h ${DB_HOST} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -D ${1} -NBe "select count(1) from ${2}"
}
# 查看表结构
desc(){
mysql -A -h ${DB_HOST} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -D ${1} -e "desc ${2}"
}
# 执行命令
command(){
mysql -A -h ${DB_HOST} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -D ${DB_NAME} -e "$*"
}
# 清除数据库
drop_database(){
mysql -A -h${DB_HOST} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -e "DROP DATABASE ${1}"
}
# 清除表
drop_table(){
mysql -A -h ${DB_HOST} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -D ${1} -e "drop table ${2}"
}
# 清除登录信息
drop_login(){
WERL_NUM=`ps_num ${WERL}`
${ERL} -noshell -name eval_server${WERL_NUM}@127.0.0.1 -setcookie ${DEF_COOKIE} -eval "rpc:call('${LOGIN_SERVER_NODE}', login_server_app, remove_server_data, [${1}])" -s c q
}
# 执行sql更新
update_sql(){
mysql -A -h ${DB_HOST} -u${DB_USE} -p${DB_PASS} -P${DB_PORT} -D ${1} < ${2}
}
+386
View File
@@ -0,0 +1,386 @@
#!/usr/bin/env bash
#-------------------------------------------------
# 命令脚本
# @author lwt
#-------------------------------------------------
# 启动游戏节点
DOC[srv_start]="启动游戏服务器,参数:别名 服务器类型 "
fun_srv_start(){
cd ${ROOT}/server/server
lock_check srv_start_${ALIAS}
INFO "执行命令:rebar3 as ${SERVER_TYPE} ${ALIAS}"
INFO "启动\e[92m${SERVER_TYPE} ${ALIAS}\e[0;0m游戏服务器..."
${REBAR} as ${SERVER_TYPE} ${ALIAS}
lock_release srv_start_${ALIAS}
}
# 关闭游戏节点
DOC[srv_stop]="关闭游戏节点,参数: 服务器id "
fun_srv_stop(){
is_exists_server_id
#关服
SERVER_NODE=`show_server_node ${SERVER_ID}`
INFO "关闭\e[92m${SERVER_NODE}\e[0;0m游戏节点..."
erl_call -c ${DEF_COOKIE} -n ${SERVER_NODE} -a "init stop" &
}
# 关闭游戏节点
DOC[srv_stop_client]="远程节点:参数:服务器id"
fun_srv_stop_client(){
SERVER_NODE="client_server@172.18.160.${SERVER_ID}"
INFO "关闭\e[92m${SERVER_NODE}\e[0;0m游戏节点..."
WERL_NUM=`ps_num ${WERL}`
${ERL} -noshell -name stop_server${WERL_NUM}@127.0.0.1 -setcookie ${DEF_COOKIE} -eval "rpc:call('${SERVER_NODE}', init, stop, [])" -s c q
}
# 远程节点
DOC[srv_remsh]="远程节点:参数:服务器id"
fun_srv_remsh(){
is_exists_server_id ${SERVER_ID}
#关服
SERVER_NODE=`show_server_node ${SERVER_ID}`
INFO "连接ip\e[92m${SERVER_NODE}\e[0;0m的游戏节点"
WERL_NUM=`ps_num ${WERL}`
${WERL} -name server${WERL_NUM}@127.0.0.1 -setcookie ${DEF_COOKIE} -remsh ${SERVER_NODE} &
}
# 远程节点
DOC[srv_remsh_client]="远程节点:参数:服务器id"
fun_srv_remsh_client(){
SERVER_NODE="client_server@172.18.160.${SERVER_ID}"
INFO "连接ip\e[92m${SERVER_NODE}\e[0;0m的游戏节点"
WERL_NUM=`ps_num ${WERL}`
${WERL} -name server${WERL_NUM}@127.0.0.1 -setcookie ${DEF_COOKIE} -remsh ${SERVER_NODE} &
}
# 编译
DOC[srv_make]="编译游戏服务器 参数:服务器id"
fun_srv_make(){
lock_check srv_make
cd ${ROOT}/server/server
SERVER_NODE=`show_server_node ${SERVER_ID}`
INFO "编译热更游戏服务器:\e[92m${SERVER_NODE}\e[0;0m "
${REBAR} as ${DEF_SERVER} compile
lock_release srv_make
}
# 热更
DOC[srv_up_make]="编译游戏服务器 参数:服务器id"
fun_srv_up_make(){
cd ${ROOT}/server/server
SERVER_NODE=`show_server_node ${SERVER_ID}`
INFO "编译热更游戏服务器:\e[92m${SERVER_NODE}\e[0;0m "
erl_call -c node-cookie -n ${SERVER_NODE} -a "r3 compile" &
}
# 分析
DOC[srv_fprof]="生成分析文件: 分析时间"
fun_srv_fprof(){
INFO "生成分析文件..."
if [ "${1}" = "" ]; then
TIME=1
else
TIME=$1
fi
# 生成分享文件
fun_srv_eval ${DEF_SERVER_ID} ms_tool fprof_all [${TIME}]
# 分析文件目录
LOGPATH=d:/work/trunk/server/server/log
# 分析工具安装目录
FENXIPATH=d:/app/erlang_fenxi
# 生成分析文件名称
FILENAME=callgrind.fprof-`server_time`
escript.exe ${FENXIPATH}/erlgrind ${LOGPATH}/fprof.trace ${FILENAME}
mv ${FILENAME} ${FENXIPATH}/log
cd ${FENXIPATH}/qcachegrind074-x86
INFO "生成文件:${FILENAME}"
./qcachegrind.exe ${FENXIPATH}/log/${FILENAME}
}
# 编译
DOC[srv_eval]="指定服务器执行命令: 服务器id M F A "
fun_srv_eval(){
if [ "$2" = "" ]; then
ERR "请输入命令"
exit 1
else
M=$2
fi
if [ "$3" = "" ]; then
ERR "请输入命令"
exit 1
else
F=$3
fi
if [ "$4" = "" ]; then
ERR "请输入命令"
exit 1
else
A=$4
fi
SERVER_NODE=`show_server_node ${SERVER_ID}`
WERL_NUM=`ps_num ${WERL}`
INFO "rpc:call('${SERVER_NODE}', ${M}, ${F}, ${A})"
${WERL} -name eval_server${WERL_NUM}@127.0.0.1 -setcookie ${DEF_COOKIE} -eval "rpc:call('${SERVER_NODE}', ${M}, ${F}, ${A})" -s c q
}
## 生成全量包
DOC[srv_release]="生成全量包"
fun_srv_release()
{
if [ ! -d ${PUB_ROOT} ]; then
mkdir -p ${PUB_ROOT}
fi
LAST_VERSION=`svn_version`
if [ "${REL_VERSION}" = "" ] || [ "${REL_VERSION}" = "0" ]; then
REL_VERSION=${LAST_VERSION}
fi
OPT "========= LAST_VERSION=${LAST_VERSION}, REL_VERSION=${REL_VERSION} ========="
PRJ=`project_pwd`
REL_PACKET=${PRJ}/${SERVER_TYPE}-${REL_VERSION}.tar.gz
if [ -f ${REL_PACKET} ]; then
OPT "========= Release package for version ${REL_VERSION} already exists ========="
else
# 删除旧的rebar3执行脚本,一个版本一个脚本可能是为了启动不同版本设置,但我们用不上先删了
CMD "========= remove old packet: rm -rf ${PRJ}/bin/game_server-* ========="
rm -rf ${PRJ}/bin/${SERVER_TYPE}-*
cd ${TMP_SOURCE} || exit 1
OPT "========= Generating release package for version ${REL_VERSION} ========="
CMD "========= ${REBAR} as ${SERVER_TYPE} release ========="
${REBAR} as ${SERVER_TYPE} release || exit 1
CMD "========= ${REBAR} as ${SERVER_TYPE} tar ========="
${REBAR} as ${SERVER_TYPE} tar || exit 1
# 删除旧发版包内容
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} || exit 1
# 删除bin下多余的文件,暂时先用手动删除,后面再研究能否用命令来删除
CMD "========= rm -rf ${PUB_ROOT}/bin/${SERVER_TYPE}-* ========="
rm -rf ${PUB_ROOT}/bin/${SERVER_TYPE}-*
cd ${ROOT}
}
## 更新版本包
DOC[srv_update]="更新版本包"
fun_srv_update()
{
if [ ! -d ${PUB_ROOT} ]; then
OPT "${PUB_ROOT} Not exists"
exit 1
fi
PRJ=`project_pwd`
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_version`
# 没有新版本可以升级
if [ ${PREV_REL_REV} = ${REL_VERSION} ]; then
OPT "Is latest version, do not need upgrade ..."
exit 1
fi
if [ -z ${PREV_REL_REV} ]; then
OPT "No previous release ${PREV_REL_REV}, skip update package generation...."
exit 1
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 || exit 1
fi
CMD "========= ${REBAR} as ${SERVER_TYPE} release ========="
${REBAR} as ${SERVER_TYPE} release || exit 1
CMD "========= ${REBAR} as ${SERVER_TYPE} appup generate --previous_version=${PREV_REL_REV} ========="
${REBAR} as ${SERVER_TYPE} appup generate --previous_version=${PREV_REL_REV} || exit 1
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} || exit 1
CMD "========= ${REBAR} as ${SERVER_TYPE} tar ========="
${REBAR} as ${SERVER_TYPE} tar || exit 1
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/
cd ${ROOT}
}
# 发版全量包
DOC[srv_pub]="发版全量包 参数:update or release"
fun_srv_pub()
{
OPT "推送${VER}版本${SERVER_TYPE}升级包到外网"
fun_svn_update
if [ "${1}" = "update" ]; then
fun_srv_update
else
fun_srv_release
fi
if [ $? -ne 0 ]; then
error "生成升级压缩包失败,请检查"
exit 1
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
}
## 重新部署,重启内网测试服
DOC[srv_reboot]="重新部署,重启内网测试服"
fun_srv_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
exit 1
fi
fun_svn_update
CMD "========= 停服:srv_stop ========="
fun_srv_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
fun_srv_release
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 "========= 重启:srv_start ========="
fun_srv_start
cd ${ROOT}
}
# 热更内网测试服
DOC[srv_reload]="热更内网测试服"
fun_srv_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
exit 1
fi
fun_svn_update
PREV_REL_REV=`ls ${PUB_ROOT}/releases | grep -v RELEASES | grep -v "start_erl.data" | sort -rg | head -1`
REL_VERSION=`svn_version`
if [ ${PREV_REL_REV} = ${REL_VERSION} ]; then
OPT "运行的代码已经是最新版本,无需热更...."
exit 0
fi
fun_srv_update
if [ $? -ne 0 ]; then
error "生成升级压缩包失败,请检查"
exit 1
fi
sh ${BIN_DIR}/${SERVER_TYPE} upgrade ${REL_VERSION}
OPT "热更服务器成功......"
}
# 获取进程数量
ps_num(){
ps -ef | grep ${1} | wc -l
}
# 获取svn版本
svn_version(){
svn info ${TMP_SOURCE} | grep 'Last Changed Rev: ' | cut -d' ' -f4
}
# 获取时间
server_time(){
date +%Y-%m-%d-%H-%M-%S
}
# 获取路径
project_pwd(){
${TMP_SOURCE}/_build/${SERVER_TYPE}/rel/${SERVER_TYPE}
}
+39
View File
@@ -0,0 +1,39 @@
#!/usr/bin/env bash
#-------------------------------------------------
# 命令脚本
# @author lwt
#-------------------------------------------------
# 更新代码仓库
DOC[svn_pull]="更新代码仓库,参数:要拉取的目录"
fun_svn_pull(){
INFO "执行命令:svn update ${1}"
if [ "${1}" = "" ]; then
DIRLIST=${ROOT}/*
else
DIRLIST=${ROOT}/${1}
fi
for K in ${DIRLIST}; do
echo ---------------------------------------------
INFO "正在更新\e[92m${K}文件\e[0;0m"
echo ---------------------------------------------
cd ${K} && ${SVN} update
done
}
## 从svn下载对应的代码,并设置当前版本号
DOC[svn_update]="从svn下载对应的代码,并设置当前版本号"
fun_svn_update(){
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}
}