# 當前需要發布的應用名稱,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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/340690.html
標籤:其他
下一篇:前端專案部署流程
