說明
在使用jenkins持續集成時,需要實現自動發布包到tomcat。該腳本實現了在jenkins將包發送到linux服務器上后的自動關閉、發布、啟動、測試啟動是否成功的過程
思路
該思路以tomcat的啟動端口為8080,關閉端口為8005為例。tomcat自帶了啟動腳本startup.sh和停止腳本shutdown.sh,tomcat要在啟動后,並且監聽了shutdown端口后才能使用shutdown.sh腳本進行關閉。要實現該腳本需要以下步驟:
- 查看tomcat是否監聽了啟動端口。
- 如果tomcat的啟動端口8080正在被監聽則需要關閉tomcat。
- 關閉tomcat需要在這個時間里啟動端口8080還是處於被監聽狀態,這時需要查看關閉端口8005是否可用,如若可用那說明沒有進行過關閉,如果不可用說明已經執行了shutdown.sh腳本。
- tomcat關閉完成后,刪除原有包、刪除原有日志(視情況而定)、發布包、啟動腳本
- 執行完啟動腳本后就需要判斷是否啟動成功了,因本機設置了代理,所以需要臨時取消代理。
- 利用curl訪問測試的網頁,獲取返回的請求碼http_code。
- 如果請求碼http_code為000則說明tomcat還在啟動。
- 如果請求碼http_code為200則說明請求成功(視情況302也是請求成功的)。
- 在判斷過程中要加入tomcat啟動端口的判斷,如果啟動端口8080不可用,那說明tomcat啟動失敗了。
腳本
腳本內容如下:
#!/bin/sh
#set -o errexit
#默認tomcat文件夾名稱
tomcat_name=apache-tomcat-9.0.16
#默認檢查頁面
check_page=login.jsp
#默認檢查頁面
base_path=$(dirname $0)
#默認嘗試10次
max_try=10
while getopts ":u:d:p:t:m:b:" opt
do
case $opt in
#tomcat的啟動端口
u)
startup_port=$OPTARG
echo "啟動端口的值:$OPTARG"
;;
#tomcat的關閉端口
d)
shutdown_port=$OPTARG
echo "關閉端口的值:$OPTARG"
;;
#測試的訪問頁面
p)
check_page=$OPTARG
echo "測試的頁面為:$OPTARG"
;;
#tomcat名稱
t)
tomcat_name=$OPTARG
echo "tomcat名稱為:$OPTARG"
;;
m)
max_try=$OPTARG
echo "base_path為:$OPTARG"
;;
b)
base_path=$OPTARG
echo "base_path為:$OPTARG"
;;
?)
echo "未知參數"
;;
esac
done
if [[ "$startup_port" -eq "" ]] || [[ "$shutdown_port" -eq "" ]] ; then
echo "必須要有u:$startup_port 啟動端口,d:$shutdown_port 關閉端口參數"
exit 1
#statements
fi
#檢查端口狀態
check_port_status (){
if [[ $1 ]]; then
echo "**********$(date):查看的端口:$1*********"
return $(expr length "$(netstat -lnp|grep $1)")
else
echo "端口不能為空"
exit 1
fi
}
#查看url的返回碼
check_url_code () {
if [[ $1 ]]; then
echo "***********$(date):訪問的url:$1**********"
return $(curl -I -m 10 -o /dev/null -s -w %{http_code} $1)
else
echo "url不能為空"
exit 1
fi
}
check_port_status $startup_port
startup_status=$?
while [[ startup_status -ne 0 ]]
do
echo "*****************$(date):等待tomcat關閉*******************"
sleep 5
#檢測tomcat是否關閉
check_port_status $startup_port
startup_status=$?
check_port_status $shutdown_port
shutdown_status=$?
if [[ shutdown_status -ne 0 ]]; then
echo “***************$(date)關閉tomcat****************”
$base_path/$tomcat_name/bin/shutdown.sh
fi
done
echo "********************$(date):tomcat已是關閉狀態***************"
echo "***************刪除原有包********************"
rm -rf $base_path/$tomcat_name/webapps/*
echo "***************刪除以前的日志********************"
rm -rf $base_path/$tomcat_name/logs/*
#移動現有包
echo "***************將包發布在tomcat********************"
cp $base_path/ROOT.war $base_path/$tomcat_name/webapps/
#啟動命令
echo "***************啟動tomcat********************"
$base_path/$tomcat_name/bin/startup.sh
echo "*************臨時取消代理***************"
unset http_proxy
unset https_proxy
#判斷是否啟動成功
echo "*************等待啟動完成***************"
code=000
trys=0
#先睡5秒不然tomcat還沒有監聽端口
sleep 5
check_port_status $startup_port
startup_status=$?
while [[ code -eq 000 ]] && [[ trys -lt max_try ]] && [[ startup_status -ne 0 ]]
do
sleep 10s
check_url_code http://localhost:$startup_port/$check_page
code=$?
trys=`expr $trys + 1`
check_port_status $startup_port
startup_status=$?
echo "*************$(date):第 $trys 次訪問 $check_page,返回碼為:$code***************"
done
if [[ startup_status -ne 0 ]] ;then
if [[ code -eq 200 ]]; then
echo "***************$(date):tomcat啟動成功,$check_page 訪問成功,訪問次數:$trys************"
exit 0
else
echo "***************$(date):tomcat啟動成功,$check_page 訪問失敗,訪問次數:$trys************"
exit 500
fi
else
echo "***************$(date):tomcat啟動失敗,請查看啟動日志************"
exit 500
fi
使用
腳本參數已經在注釋中說明,默認情況下該腳本需要和tomcat位於同一級目錄,tomcat文件夾的名稱為apache-tomcat-9.0.16。下面是示例
$ ./startup.sh -u 8080 -d 8005