Jenkins自動部署Shell腳本

注意:本腳本用於Shell腳本分享,因環境不同,不可直接用於其它環境部署用。

#!/bin/bash
#時間:2019年7月29日
#作者:肖山
#微信:helpxiaoshan
#用途:用於XXXX UAT環境ATG商城項目Jenkins自動部署使用。

############ 使用注意事項:#################################################################################

注意1:需修改目標主機/etc/ssh/sshd_config,MaxSessions 50(建議值),重新加載sshd服務配置。

注意2:腳本後必須跟參數,參數爲 項目名,例如: sh deploy.sh store

注意3:50行,sleep 15 秒,20後臺進程 x 15 秒=300s,檢測時間共300秒,當有項目的tomcat啓動時間超過300秒,則增大該數值。

############################################################################################################

starttime=date +'%Y-%m-%d %H:%M:%S'
project_name=$1 #第一個參數爲項目名

[ $1 ] || echo "ERROR: No project_name!" #判斷$1爲空,則退出腳本呢!
[ $1 ] || exit 1

if [ $project_name = "store" ];then
#第一步,停掉目標項目進程。
ip=192.168.220.34
echo "INFO: project_name is store"
echo -e "\n"
echo "INFO: Begain stop store..."
ssh -n -l oracle $ip "pgrep -f -l store | grep -v 'tail -f' | grep -v grep | cut -d' ' -f1 | xargs kill -9" >>/dev/null 2>&1
stat=$?
#echo $stat
[ $stat -eq 0 ] && echo "INFO: store is been killed"
[ $stat -ne 0 ] && echo "INFO: store is not started"

#第二步,刪除舊代碼並清除緩存。
echo -e "\n"
echo "INFO: Begain delete old file and cache..."
ssh -n -l oracle $ip "rm -rf /home/oracle/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/prod_lockserver/stage/prod_lockserver.ear/prod_lockserver.ear"
ssh -n -l oracle $ip "rm -rf /home/oracle/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/prod_lockserver/tmp"
ssh -n -l oracle $ip "rm -rf /home/oracle/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/prod_lockserver/cache"
echo "INFO: already delete old file and cache"

#第三步,拷貝最新代碼到項目路徑下。
echo -e "\n"
echo "INFO: Begain copy code to project host..."
scp -qrp /file/uat_ears/prod_lockserver.ear oracle@$ip:/home/oracle/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/prod_lockserver/stage/prod_lockserver.ear
[ $stat -eq 0 ] && echo "INFO: copy Success"
[ $stat -ne 0 ] && echo "ERROR: copy failed!!!" && exit 1

#第四步,啓動項目進程
echo -e "\n"
echo "INFO: Begain start store Weblogic"
ssh -n -l oracle $ip "nohup /home/oracle/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/bin/startManagedWebLogic.sh prod_lockserver http://192.168.220.35:7001 -Djava.rmi.server.hostname=192.168.220.34 -Dguangda.merchant.parameter.file.path=/file/cebbank/ceb_merchant.properties -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8466,server=y,suspend=n -Djava.compiler=NONE -Datg.dynamo.server.name=prod_lockserver -Xms6G -Xmx6G -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=1000 -XX:InitiatingHeapOccupancyPercent=45 -XX:ConcGCThreads=4 -XX:G1ReservePercent=15 -XX:+DisableExplicitGC -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+PrintGCCause -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -Xloggc:/home/oracle/store_gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/oracle/store_heap.bin -Dcom.sun.management.jmxremote.port=12345 -Djava.rmi.server.hostname=192.168.220.34 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djavax.management.builder.initial=weblogic.management.jmx.mbeanserver.WLSMBeanServerBuilder -Datg.dynamo.data-dir=/home/oracle/ATG-Data/ > /home/oracle/output/logs/prod_lockserver.log &"
echo "INFO: Weblogic starting..."

#第五步,啓動精確檢測weblogic啓動完畢的後臺進程
echo -e "\n"
>${project_name}_${ip}_status.log  #清空檢測Weblogic是否啓動的日誌文件內容
for i in `seq 20`    #啓動10個檢測Weblogic啓動日誌後臺進程,當後臺進程被殺掉後,日誌纔會被寫入log文件
do
    ssh -n -l oracle $ip "tail -fn 0 /home/oracle/output/logs/prod_lockserver.log" | grep "The server started in RUNNING mode" >>${project_name}_${ip}_status.log &
done

#檢測Weblogic啓動狀態的變量stats1,檢測機制爲檢測目標服務器上的項目日誌文件,是否新打印出"The server started in RUNNING mode";
t=0
stats1=0
while [ $stats1 -eq 0 ]
do
    sleep 15   # 10個後臺進程,20x15=300s,檢測時間共300秒,當有項目的tomcat啓動時間超過100秒,則增大該數值。
    let t+=15  #t=`expr $t + 10`
    echo "檢測 $project_name Weblogic 是否啓動完畢,已用時 $t 秒..."
    echo -e "\n"
    ssh -n -l oracle $ip "pgrep -f 'tail -fn' | head -n 1 | xargs kill -9"  # kill掉一個後臺進程
    [ $? -eq 0 ] && echo "INFO: 成功殺掉 tail -fn 後臺進程。"
    stats1=`cat ${project_name}_${ip}_status.log | wc -l `   # 每kill一個後臺進程,狀態文件就更新一次
    #[ $stats1 -eq 0 ] && echo "INFO:未檢測到 started in RUNNING mode 關鍵詞。"
    #[ $stats1 -ge 1 ] && echo "INFO:成功檢測到 started in RUNNING mode 關鍵詞。"
done

ssh -n -l oracle $ip "pgrep -f 'tail -fn' | xargs kill -9" # kill掉剩餘無用後臺進程。
echo -e "\n"
echo "INFO:檢測到啓動關鍵詞:"
head -n 1 ${project_name}_${ip}_status.log  #  輸出抓取的 started in RUNNING mode 日誌。
echo -e "\n"
echo "打印最後864行日誌"
ssh -n -l oracle $ip "tail -n 864 /home/oracle/output/logs/prod_lockserver.log"

fi

#計算腳本運行總時間
endtime=date +'%Y-%m-%d %H:%M:%S'
start_seconds=$(date --date="$starttime" +%s);
end_seconds=$(date --date="$endtime" +%s);
echo "本次更新用時: "$((end_seconds-start_seconds))"s"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章