背景(偷懶)
在小小的公司里面,挖呀挖呀挖??焱诓粍恿耍患轮貜?fù)個(gè)5次,還在人肉手工,身體和心理就開始不舒服了,并且違背了個(gè)人的座右銘:“偷懶”是人類進(jìn)步的第一推動力。
每次想要去測試環(huán)境驗(yàn)證個(gè)新功能,又或者被測試無情的催促著部署新版本后;都需要本地打那個(gè)200多M的jar包;以龜速般的每秒幾十KB網(wǎng)絡(luò),通過ftp上傳到服務(wù)器;用爛熟透的jps命令查找到進(jìn)程,kill后,重啟服務(wù)。
是的,我想偷懶,想從已陷入到手工部署的沼澤地里走出來。如何救贖?
自我救贖之路
我的訴求很簡單,想要一款“一鍵CI/CD的工具”,然后可以繼續(xù)偷懶。為了省事,我做了以下工作
找了一款停止服務(wù)的腳本,并做了小小的優(yōu)化
首推 陳皮大哥的停服腳本(我在里面加了個(gè)sleep 5);腳本見下文。只需要修改 APP_MAINCLASS的變量“XXX-1.0.0.jar”替換為自己jar的名字即可,其它不用動。
該腳本主要是通過jps + jar的名字獲得進(jìn)程號,進(jìn)行kill。( 腳本很簡單,注釋也很詳細(xì),就不展開了,感興趣可以閱讀下,不到5分鐘,寫過代碼的你能看懂的)
把以下腳本保存為stop.sh
#!/bin/bash # 主類 APP_MAINCLASS="XXX-1.0.0.jar" # 進(jìn)程ID psid=0 # 記錄嘗試次數(shù) num=0 # 獲取進(jìn)程ID,如果進(jìn)程不存在則返回0, # 當(dāng)然你也可以在啟動進(jìn)程的時(shí)候?qū)⑦M(jìn)程ID寫到一個(gè)文件中, # 然后使用的使用讀取這個(gè)文件即可獲取到進(jìn)程ID getpid() { javaps=`jps -l | grep $APP_MAINCLASS` if [ -n "$javaps" ]; then psid=`echo $javaps | awk '{print $1}'` else psid=0 fi } stop() { getpid num=`expr $num + 1` if [ $psid -ne 0 ]; then # 重試次數(shù)小于3次則繼續(xù)嘗試停止服務(wù) if [ "$num" -le 3 ];then echo "attempt to kill... num:$num" kill $psid sleep 5 else # 重試次數(shù)大于3次,則強(qiáng)制停止 echo "force kill..." kill -9 $psid fi # 檢查上述命令執(zhí)行是否成功 if [ $? -eq 0 ]; then echo "Shutdown success..." else echo "Shutdown failed..." fi # 重新獲取進(jìn)程ID,如果還存在則重試停止 getpid if [ $psid -ne 0 ]; then echo "getpid... num:$psid" stop fi else echo "App is not running" fi } stop
編寫2行的shell 啟動腳本
修改腳本中的XXX-1.0.0.jar為你自己的jar名稱即可。保存腳本內(nèi)容為start.sh。jvm參數(shù)可自行修改
basepath=$(cd `dirname $0`; pwd) nohup java -server -Xmx2g -Xms2g -Xmn1024m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:-UseAdaptiveSizePolicy -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -Xloggc:logs/gc.log -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:HeapDumpPath=logs/dump.hprof -XX:ParallelGCThreads=4 -jar $basepath/XXX-1.0.0.jar &>nohup.log &
復(fù)用之前jenkins,自己寫部署腳本
腳本一定要放到 Post Steps里
這9行腳本,主要干了幾件事:
備份正在運(yùn)行的jar包;(萬一有啥情況,還可以快速回滾)
把jenkins上打好的包,復(fù)制到目標(biāo)服務(wù)上
執(zhí)行停服腳本
執(zhí)行啟動服務(wù)腳本
腳本見下文:
ssh -Tq $IP << EOF source /etc/profile #進(jìn)入應(yīng)用部署目錄 cd /data/app/test # DATE=`date +%Y-%m-%d_%H-%M-%S` #刪除備份jar包 rm -rf /data/app/test/xxx-1.0.0.jar.bak* #備份歷史jar包 mv /data/app/test/xxx-1.0.0.jar /data/app/test/xxx-1.0.0.jar.bak$DATE #從jenkins上拉取最新jar包 scp root@$jenkisIP:/data/jenkins/workspace/test/target/XXX-1.0.0.jar /data/app/test # 執(zhí)行停止應(yīng)用腳本 sh /data/app/test/stop.sh #執(zhí)行重啟腳本 sh /data/app/test/start.sh exit EOF
注:
$IP是部署服務(wù)器ip,$jenkisIP是jenkins所在的服務(wù)器ip。在部署前請?jiān)O(shè)置jenkins服務(wù)器和部署服務(wù)器之間ssh免密登錄
/data/app/test 是部署jar包存放路徑
stop.sh 是上文的停止腳本
start.sh 是上文的啟動腳本
總結(jié)
如果不想把時(shí)間浪費(fèi)在本地打包,忍受不了上傳jar包的龜速網(wǎng)絡(luò),人肉停服和啟動服務(wù)。請嘗試下這款自動部署化腳本。小小的投入,帶來大大的回報(bào)。
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
8849瀏覽量
84950 -
代碼
+關(guān)注
關(guān)注
30文章
4697瀏覽量
68083 -
腳本
+關(guān)注
關(guān)注
1文章
384瀏覽量
14793
原文標(biāo)題:適合小公司的自動化部署腳本
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論