# 当前需要发布的应用名称,jar包应该放在当前脚本的同级目录,并且命名为 $app_name.jar
app_name="demo"
# 本地机器的ip
app_host_ip="192.169.75.129"
# 端口信息 当前jar 启动几个端口
app_port_str="8081,8082"
# 调试端口
app_debug_port_str="7081,7082"
# java options
app_options=""
# 测试程序启动成功的url 运行的时候会自动拼上 http://app_host_ip:app_port/app_test_url
app_test_url="/demo/doc.html"
# 多久检查一次app是否启动成功,单位秒
app_check_time=10
# 最多检查几次,如果在最多检查次数内还没有成功启动 那么就直接结束脚本并输出错误日志
app_max_check=30
# nginx 的配置文件
# nginx 的根目录
nginx_home=/usr/local/nginx
# nginx 的配置文件位置
nginx_conf_name=$nginx_home/conf/nginx.conf
# nginx 执行文件的位置
nginx_sbin=$nginx_home/sbin/nginx
# nginx 执行reload 命令之后等待多少秒再继续往下执行
nginx_reload_wait_time=10
# 脚本日志级别 1 log_info 级别 5 debug
log_level_debug=5
log_level_info=1
log_level_error=0
log_level=$log_level_info
deploy_log="deploy"
# 主函数
function main() {
# 先检查环境
check_environment
# 启动
start
# 备份
backup
}
# 检查环境是否已经准备好了
function check_environment() {
# 修改之前发布日志的名字
mv -f $deploy_log.log $deploy_log.log.bak
mkdir_if_not_exist $app_name
app_port_arr=(${app_port_str//,/ })
# 循环所有的文件夹
for ((i = 0; i < ${#app_port_arr[@]}; ++i)); do
# 创建每个端口的文件夹
mkdir_if_not_exist $app_name/${app_port_arr[i]}
# 创建日志文件夹
mkdir_if_not_exist $app_name/${app_port_arr[i]}"/logs"
done
# 检查文件夹
dirs=("back" "deploy_logs")
# 循环所有的文件夹
for ((i = 0; i < ${#dirs[@]}; ++i)); do
mkdir_if_not_exist $app_name/${dirs[i]}
done
}
# 创建文件夹当不存在的时候
function mkdir_if_not_exist() {
dir=$1
if [ ! -d "$dir" ]; then
$(mkdir $dir)
log_debug "创建文件夹:"$dir
else
log_debug "文件夹已存在:"$dir
fi
}
# 启动
function start() {
# 切割端口
app_port_arr=(${app_port_str//,/ })
app_debug_port_arr=(${app_debug_port_str//,/ })
# 获取数组的长度
len=${#app_port_arr[@]}
log_debug "数组长度"$len
# 循环执行 一个一个的启动
for ((i = 0; i < len; ++i)); do
# 当前启动的端口
cur_port=${app_port_arr[i]}
cur_debug_port=${app_debug_port_arr[i]}
log_debug "发布服务:"$cur_port
if test $i -eq 0; then
log_debug "第一个端口直接关掉"
disable_nginx_server $app_host_ip:$cur_port
# 重新加载配置文件
reload_nginx_server
# 休眠5秒钟再进行下一个动作
sleep $nginx_reload_wait_time
else
pre_idx=$i-1
# 下一个启动的端口
pre_port=${app_port_arr[pre_idx]}
# 取消当前端口 运行上一个端口被访问
replace_nginx_server $cur_port $pre_port
fi
# 发布当前端口
start_app $cur_port $cur_debug_port
done
# 开启所有的nginx server
enable_all_nginx_server
}
# 启动服务
function start_app() {
# 启动端口
app_port=$1
# 调试端口
debug_port=$2
# 关闭服务
stop_app $app_port $debug_port
# 日志文件名
log_file="$app_name/$app_port/logs/catalina.log"
# 拷贝当前的jar到目录中
cur_app_name=$app_name/$app_port/$app_name.jar
cp $app_name.jar $cur_app_name
# 创建日志文件
touch $log_file
log_info "开始启动![appName:"$app_name","$app_host_ip:$app_port",日志文件:"$log_file"]"
sleep $app_check_time
# 拷贝一个启动包到
# 启动命令
nohup java -Xdebug -Xrunjdwp:transport=dt_socket,address=$debug_port,server=y,suspend=n,$app_options -jar ${cur_app_name} --server.port=$app_port >$log_file 2>&1 &
sleep $app_check_time
command="curl -I -m 10 -o /dev/null -s -w %{http_code} http://"$app_host_ip":"$app_port"/"$app_test_url
#计数器
count=0
while :; do
if test $count -eq $app_max_check; then
# 如果当前检查次数已经超过了最大值 那么直接退出shell
log_error "服务启动异常,请检查启动日志![appName:"$app_name","$app_host_ip:$app_port",日志文件:"$log_file"]"
exit
fi
status=$($command)
if [ $status == 200 ]; then
log_info "[$app_name]$app_host_ip:$app_port启动完成..."
break
else
let count++
log_info "[$count][$app_name]$app_host_ip:$app_port启动中..."
fi
sleep $app_check_time
done
}
# 停用服务
function stop_app() {
# 启动端口
app_port=$1
# 调试端口
debug_port=$2
command=$(ps -ef | grep $app_name | grep $app_port)
# 关闭服务
if [ "$command" ]; then
log_info "关闭服务![appName:"$app_name",端口:"$app_port"]"
ps -ef | grep $app_name | grep $app_port | grep -v 'grep' | awk '{print $2}' | xargs kill -9
else
log_info "服务未启动![appName:"$app_name",端口:"$app_port"]"
fi
}
# 备份程序
function backup() {
back_name=$app_name/back/$(date +%Y%m%d_%H%M%S).jar
cp $app_name.jar $back_name
log_info "程序已备份:"${back_name}
# 备份发布日志
cp $deploy_log.log $app_name/deploy_logs/$(date +%Y%m%d_%H%M%S).log
}
# 逐个切换Nginx
function replace_nginx_server() {
# 停用一个端口
disable_nginx_server $app_host_ip:$1
# 启用一个
enable_nginx_server $app_host_ip:$2
# 重新加载配置文件
reload_nginx_server
# 休眠5秒钟再进行下一个动作
sleep $nginx_reload_wait_time
}
# 开启所有配置了的nginx服务
function enable_all_nginx_server() {
app_port_arr=(${app_port_str//,/ })
# 循环执行 一个一个的启动
for ((i = 0; i < ${#app_port_arr[@]}; ++i)); do
# 当前启动的端口
cur_port=${app_port_arr[i]}
enable_nginx_server $app_host_ip:$cur_port
done
# 重新加载配置文件
reload_nginx_server
log_info '已经打开所有的nginx配置'
}
# 停用nginx 中配置的server
function disable_nginx_server() {
server=$1
check_is_disabled=$(awk "/#server $server/{print NR}" $nginx_conf_name)
if [ ! "$check_is_disabled" ]; then
log_debug "准备停用nginx配置"$server
# 修改配置文件
sed -i "s/server $server/#server $server/g" $nginx_conf_name
fi
log_info "已停用"$server
}
# 启用nginx 中配置的server
function enable_nginx_server() {
server=$1
check_is_enabled=$(awk "/#server $server/{print NR}" $nginx_conf_name)
if [ "$check_is_enabled" ]; then
log_debug "准备启用nginx配置"$server
# 修改配置文件
sed -i "s/#server $server/server $server/g" $nginx_conf_name
fi
log_info "已启用"$server
}
# 重新加载nginx
function reload_nginx_server() {
# 重新加载nginx
$nginx_sbin -s reload
log_info '重新加载nginx'
}
# 打印日志
function log_info() {
log $1 $log_level_info
}
# 打印调试日志
function log_debug() {
log $1 $log_level_debug
}
# 打印错误日志
function log_error() {
log $1 $log_level_error
}
# 打印日志
function log() {
level=$2
if test $level -le $log_level; then
level_name=$(get_level_name $level)
msg="[$level_name][$(date +%Y-%m-%d" "%H:%M:%S)]"$1
# 输出日志到日志文件
echo $msg >>$deploy_log.log
# 输出日志到界面
echo $msg
fi
}
# 获取日志级别的名称
function get_level_name() {
if test $1 -eq $log_level_info; then
echo "info"
elif test $1 -eq $log_level_debug; then
echo "debug"
elif test $1 -eq $log_level_error; then
echo "error"
else
echo ""
fi
}
# 执行main函数.
main
|