由於工作需要,springboot需要脫離原有部署環境,在沒有自動部署功能的前提下,爲了防止人爲誤操作以及其他的一些原因,需要規範系統部署,但同時帶了人工操作的複雜度,因此需要通過腳本控制來降低人工成本。
目錄
1.前期準備
springboot的前期工作不再贅述,環境搭建不是這裏的重點,因此Java環境等等忽略
2.系統部署規範
既然說要腳本完成啓停,必然需要規範系統部署,規則如下
2.1springboot結構相關
/ --------------根目錄
/apps --------------部署服務目錄
/apps/xxx-sc(項目名稱) --------------日誌文件目錄
/apps/xxx-sc(項目名稱)/logs --------------項目日誌目錄
/apps/xxx-sc(項目名稱)/logs/xxx.年月日 --------------項目日誌目錄 (日誌每日一切割,每50M一切割)
/apps/xxx-sc(項目名稱)/service.sh --------------項目啓停腳本
/apps/xxx-sc(項目名稱)/service/xxx-sc-aaaa(項目名稱-sc-端口號) --------------項目日誌名稱
/apps/xxx-sc(項目名稱)/tmp --------------臨時jar
/apps/xxx-sc(項目名稱)/target --------------target
2.2數據庫相關
/ --------------根目錄
/apps --------------部署服務目錄
/apps/dbconfig --------------數據庫文件目錄
/apps/dbconfig/數據庫名字 --------------數據庫文件目錄
3. 資源利用記錄
由於同一個服務器可能存在多服務情況,爲了防止相互之間端口占用的影響,需要資源備案進行分配
項目名稱 | 域名 | 框架 | 環境 | http端口號 | Shutdown端口 | AJP端口 | 數據庫 |
---|---|---|---|---|---|---|---|
xxx | xxx.aaa.com | springboot | 生產 | 8989 | xxx | ||
xxx-nc | springboot | 內測 | 8988 | xxx-nc | |||
ppp | tomcat | 生產 | 8987 | 8187 | 8287 | ppp | |
ppp-nc | tomcat | 內測 | 8986 | 8186 | 8286 | ppp-nc | |
8985 |
4.服務啓停腳本
目錄名稱 | 目錄說明 | 備註 |
---|---|---|
xxx-sc | 項目所在目錄 |
xxx:項目名稱 sc:生產環境 nc:內測環境 |
xxx-sc-aaaa | 項目名稱 | aaa:端口號 |
service.sh | springboot項目啓停腳本 |
啓動:service.sh start 停止:service.sh stop 重啓:service.sh restart 上線:service.sh push 回滾:service.sh rollback 狀態查詢:service.sh status |
由於shell腳本不是特別熟悉,有什麼更好的方式可以達成目標,歡迎大家指點
#!/bin/sh
## java env
#export JAVA_HOME=/usr/local/jdk/jdk1.8.0_101
#export JRE_HOME=$JAVA_HOME/jre
echo
echo "**********************環境檢測 開始**********************"
`java -version`
echo
service_path=`ls -lt ./service/ | find ./service -name "*.jar"`
echo ">>> 服務路徑地址: $service_path"
service_name=${service_path##*/}
echo ">>> 服務JAR名稱: $service_name"
tmp_path=`ls -lt ./tmp/ | find ./tmp -name "*.jar"`
echo ">>> 臨時文件路徑: "$tmp_path
tmp_name=${tmp_path##*/}
echo ">>> 臨時JAR名稱: "$tmp_name
echo "**********************環境檢測 結束**********************"
echo
echo
API_NAME=$service_path
JAR_NAME=$service_name
#使用說明,用來提示輸入參數
usage() {
echo "Usage: sh 執行腳本.sh [start|stop|restart|status|push|rollback]"
exit 1
}
#檢查程序是否在運行
is_exist(){
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
echo ">>> 服務 $JAR_NAME 未運行"
return 1
else
echo ">>> 服務 $JAR_NAME 運行中"
return 0
fi
}
#啓動方法
start(){
echo "**********************啓動服務 開始**********************"
is_exist
if [ $? -eq "0" ]; then
echo ">>> 服務 ${JAR_NAME} 已經在運行中, PID=${pid} <<<"
else
nohup java -jar $service_path >/dev/null 2>&1 &
getPID
if [ $? -eq "0" ]; then
echo ">>> 服務 $JAR_NAME 啓動失敗 <<<"
else
echo ">>> 服務 $JAR_NAME 啓動成功 PID=$! <<<"
fi
fi
echo "**********************啓動服務 完成**********************"
}
#停止方法
stop(){
echo "**********************關閉服務 開始**********************"
is_exist
if [ $? -eq "1" ]; then
echo ">>> 無服務運行中"
else
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
echo ">>> 服務運行中,PID=$pid . 開始關閉服務."
kill -9 $pid
echo ">>> 服務已停止."
fi
echo "**********************關閉服務 完成**********************"
}
#輸出運行狀態
status(){
echo "**********************查詢服務狀態 開始**********************"
is_exist
if [ $? -eq "0" ]; then
echo ">>> 服務 ${JAR_NAME} is running PID is ${pid} <<<"
else
echo ">>> 服務 ${JAR_NAME} is not running <<<"
fi
echo "**********************查詢服務狀態 完成**********************"
}
#重啓
restart(){
echo "**********************重啓服務 開始**********************"
stop
echo
start
echo "**********************重啓服務 完成**********************"
}
#上線
push(){
echo "**********************上線服務 開始**********************"
stop
echo
rmJar
echo
start
echo "**********************上線服務 完成**********************"
}
#回滾
rollback(){
echo "**********************回滾服務 開始**********************"
stop
echo
rollBackJar
echo
start
echo "**********************回滾服務 完成**********************"
}
rmJar() {
current=`date "+%Y%m%d%H%M%S"`
jar_new_anme=$JAR_NAME-$current
cp $API_NAME ./target/$jar_new_anme
echo ">>> 歷史服務備份完成,備份文件:" $jar_new_anme
rm -rf $API_NAME
echo ">>> 移除運行中文件:" + $API_NAME
cp ./tmp/$tmp_name $API_NAME
echo ">>> 拷貝最新jar包並加載:" + $tmp_name
rm -rf ./tmp/$tmp_name
echo ">>> 移除臨時jar包:" + $tmp_name
}
rollBackJar() {
target_jar=`ls -lt ./target/ | grep $JAR_NAME | head -n 1 |awk '{print $9}'`
echo ">>> 獲取歷史服務備份文件:" $target_jar
cp ./target/$target_jar $API_NAME
echo ">>> 加載歷史服務備份文件 $target_jar 回滾爲 $API_NAME"
}
getPID() {
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
if [ -z "${pid}" ]; then
echo ">>> 服務 $JAR_NAME 未運行"
return 1
else
echo ">>> 服務 $JAR_NAME 運行中"
return ${pid}
fi
}
#根據輸入參數,選擇執行對應方法,不輸入則執行使用說明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
"push")
push
;;
"rollback")
rollback
;;
*)
usage
;;
esac
exit 0