因公司業務的發展,後臺架構的變動,致使測試環境(Linux)部署與管理困難成倍增加,duang的一下,增長N倍。進入正題說問題:web
問題1. 測試環境包含普通用戶環境、開發者用戶環境,原來只需2個Wildfly,現須要15*2,30個容器,啓動、中止、部署工做量巨大。shell
1 app
2 appInterface
3 battle
4 friend
5 gexin
6 msg
7 online
8 passport
9 pay
10 push
11 support
12 union
13 upload
14 webInterface
15 webView注:因公司以及其餘緣由,本文中的模塊名、環境、數量都進行了適當的修改,此處只舉例說明。bash
問題2. 後續模塊擴展與容器增減維護工做 架構
問題3. 部署包SVN的自動獲取,自動部署app問題4. 部署完畢郵件通知
1. 現狀
a. SVN源碼無權限,有固定目錄取轉測模塊WAR包,但須要根據轉測svn版本號取(最新的不必定是部署時轉測的模塊)svn
b. 轉測模塊不定,也許15個,也許二、3個測試
c. 15個模塊(即15個WAR包),兩環境(普通用戶、開發者用戶),須要30個容器優化
d. 根據轉測模塊,只須要中止對應模塊所在容器,無須全部模塊中止與啓動ui
2. 分析與方案肯定
1) 棄用Jenkins
a.無須自動構建:公司其餘緣由,測試沒法得到SVN源碼權限進行自動構建,Jenkins的自動化部署。spa
b.不夠靈活:WAR的自動化部署,Jenkins雖可部署,但須要15個Job+,總體轉測時用1Job統一部署,如模塊轉測試則須要按每一個模塊(每一個Job)一一點擊
c.工做量未減小:研發轉測發佈固定目錄是以svn版本號發佈,在部署時已經可能最新的版本號是另外一個轉測模塊,所以須要取對應的版本號,每次改太麻煩,基本沒有減小工做量。
2) 選用Shell腳本
a.腳本實現快速,隨時修改
b.容器的操做都是Linux(shell)命令
c.自動化部署也採用shell分發與檢測部署
d.郵件發送採用mail命令
1.wildfly統一命名規則
普通用戶環境:Formal-wildfly-模塊名
開發者環境:DEV-wildfly-模塊名
Formal-wildfly-app
Formal-wildfly-appInterface
Formal-wildfly-battle
Formal-wildfly-friend
Formal-wildfly-gexin
...
DEV-wildfly-app
DEV-wildfly-appInterface
DEV-wildfly-battle
DEV-wildfly-friend
DEV-wildfly-gexin
...
2.模塊名稱列表: wildfly.list
app|app
appInterface|ae
battle|b
friend|f
gexin|g
msg|m
online|o
passport|pt
pay|pay
push|ph
support|st
union|un
upload|ud
webInterface|we
webView|ww注意:
a.第一列爲模塊名,用於檢測wildfly容器,故須要嚴格注意大小寫
b.第二列爲啓動、中止、檢查腳本使用的參數縮寫
c.後續擴展增長模塊,只須要增長對應的容器,而後修改此文件加入模塊名便可,此處解決第2個問題
3.啓動Wildfly腳本(run_wildfly.sh)
# !/bin/bash
# Author:findyou
# Email:1968089885@qq.com
cDate=`date +%Y-%m-%d`
cTime=`date +%H:%M`
shellDIR= " /root/ shell/ "
wildfly_rootDir= " /data/ "
conf_file= " wildfly.list "
echo_tips= " "
checkBoolean=0
# 檢測wildfly.list文件是否存在,不存在-則退出腳本執行
if [ ! -f ${shellDIR}${conf_file} ]; then
echo " Not Found : ${shellDIR}${conf_file} "
exit 1
fi
# 讀wildfly.list文件
count_n=0
while read line;
do
count_n=`expr ${count_n} + 1` # 統計模塊個數
wildfly[$count_n]=`echo $line|cut -d ' | ' -f 1` # 獲到模塊名稱
wildfly_quick[$count_n]=`echo $line|cut -d ' | ' -f 2` # 得到快捷命令
done < ${shellDIR}${conf_file}
# 腳本幫助提示,並退出腳本
help_tips(){
echo " eg: $0 [wildflyName|a] "
echo ""
echo " wildflyName: "
for ((i=1; i<=${count_n}; i++));
do
echo " ${echo_tips}${wildfly[$i]}|${wildfly_quick[$i]} "
done
echo ""
exit 1
}
# 若是檢測到沒有傳入參數,則執行help_tips方法,
if [ ! -n " $1 " ] ; then
help_tips
fi
# 將傳入的 模塊名稱 參數賦值給para_cmd
para_cmd=$1
# 休眠方法,用於啓動間隔
sleep_2(){
# echo "${echo_tips}${echo_tips}Sleep 2 second!"
sleep 2
}
# 循環啓動Wildfly方法
run_wildfly(){
echo " Time : ${cDate} ${cTime} "
# 循環wildfly.list文件中的全部模塊,根據傳入參數,判斷執行相應的啓動
for ((i=1; i<=${count_n}; i++));
do
# 根據腳本傳入的參數,啓動對應的容器,傳爲a則啓動全部容器。
if [ " ${para_cmd} " == " a " -o " ${para_cmd} " == " ${wildfly[$i]} " -o " ${para_cmd} " == " ${wildfly_quick[$i]} " ];then
echo " Start: ${wildfly[$i]} "
# 檢查 普通用戶 對應容器的進程
formal_pc=`ps -ef|grep " Formal-wildfly-${wildfly[$i]}/ "|grep -v grep|wc -l`
# 容器進程數,若是不爲0,則說明已啓動。反之則進行容器啓動
if [ $formal_pc -ne 0 ] ; then
echo " ${echo_tips}${echo_tips}Failure: UAT is already running! "
else
echo " ${echo_tips}UAT Start.... "
# 進入對應的容器,啓動容器
cd ${wildfly_rootDir}Formal-wildfly-${wildfly[$i]}/bin
nohup sh standalone.sh >/dev/null 2>&1 &
echo " ${echo_tips}Please Check file: ${wildfly_rootDir}Formal-wildfly-${wildfly[$i]}/standalone/log/server.log "
sleep_2
fi
# 檢查 開發者用戶 對應容器的進程
dev_pc=`ps -ef|grep " Dev-wildfly-${wildfly[$i]}/ "|grep -v grep|wc -l`
if [ $dev_pc -ne 0 ] ; then
echo " ${echo_tips}${echo_tips}Failure: UAT-DEV is already running! "
else
echo " ${echo_tips}UAT-DEV Start.... "
cd ${wildfly_rootDir}Dev-wildfly-${wildfly[$i]}/bin
nohup sh standalone.sh >/dev/null 2>&1 &
echo " ${echo_tips}Please Check file: ${wildfly_rootDir}Dev-wildfly-${wildfly[$i]}/standalone/log/server.log "
sleep_2
fi
# 記錄啓動模塊數
checkBoolean=`expr ${checkBoolean} + 1`
fi
done
}
# 執行run_wildfly方法
run_wildfly
# 傳入了參數,可是沒有找到應的模塊進行啓動,調help_tips
if [ ${checkBoolean} -eq 0 ];then
help_tips
fi說明:
1.wildfly.list需要與run_wildfly.sh放在同一目錄,腳本沒有采用相對路徑,故run_wildfly.sh腳本中須要調整對應的目錄參數shellDIR
2.命令使用,如啓動app容器: ./run_wildfly.sh app
3.啓動全部app容器:./run_wildfly.sh a
4.檢查Wildfly是否運行腳本(check_wildfly.sh)
腳本邏輯與啓動腳本一致,直接替換掉run_wildfly方法便可,但記得調用修改後的方法
check_wildfly(){echo "Time : ${cDate} ${cTime}"
# 循環wildfly.list文件中的全部模塊,根據傳入參數,判斷執行相應的啓動
for ((i=1; i<=${count_n}; i++));
do
# 根據腳本傳入的參數,啓動對應的容器,傳爲a則啓動全部容器。
if [ "${para_cmd}" == "a" -o "${para_cmd}" == "${wildfly[$i]}" -o "${para_cmd}" == "${wildfly_quick[$i]}" ];then
echo "Check: ${wildfly[$i]}"
#檢查 普通用戶 對應容器的進程
formal_pc=`ps -ef|grep "Formal-wildfly-${wildfly[$i]}/"|grep -v grep|wc -l`
#容器進程數,若是不爲0,則說明已啓動。反之則進行容器啓動
if [ $formal_pc -eq 0 ] ; then
echo "${echo_tips}${echo_tips}UAT not Found!"
else
echo "${echo_tips}UAT is running!"
fi
#檢查 開發者用戶 對應容器的進程
dev_pc=`ps -ef|grep "Dev-wildfly-${wildfly[$i]}/"|grep -v grep|wc -l`
if [ $dev_pc -eq 0 ] ; then
echo "${echo_tips}${echo_tips}UAT-DEV not Found!"
else
echo "${echo_tips}UAT-DEV is running!"
fi
# 記錄啓動模塊數
checkBoolean=`expr ${checkBoolean} + 1`
fi
done
}說明:
1.檢查全部app容器運行狀態:./check_wildfly.sh a
5.中止Wildfly腳本(stop_wildfly.sh)
腳本邏輯與啓動腳本一致,直接替換掉run_wildfly方法便可,但記得調用修改後的方法
stop_wildfly(){
for ((i=1; i<=${count_n}; i++));
do
if [ " ${para_cmd} " == " a " -o " ${para_cmd} " == " ${wildfly[$i]} " -o " ${para_cmd} " == " ${wildfly_quick[$i]} " ];then
echo " Stop: ${wildfly[$i]} "
# 檢查 普通用戶 對應容器的進程,獲得進程號
formal_pc=`ps -ef|grep " Formal-wildfly-${wildfly[$i]}/ "|grep -v grep|awk ' {print $2} '`
if [ " $formal_pc " == "" ] ; then
echo " ${echo_tips}${echo_tips}UAT not Found! "
else
# 中止進程
kill -9 $formal_pc
sleep_2
# 再次檢測是否已中止進程
formal_pc1=`ps -ef|grep " Formal-wildfly-${wildfly[$i]}/ "|grep -v grep|awk ' {print $2} '`
if [ " $formal_pc1 " == "" ] ; then
echo " ${echo_tips}Stop UAT Success! "
else
echo " ${echo_tips}${echo_tips}Stop UAT Failure! "
fi
fi
# 檢查 開發者用戶 對應容器的進程,獲得進程號
dev_pc=`ps -ef|grep " Dev-wildfly-${wildfly[$i]}/ "|grep -v grep|awk ' {print $2} '`
if [ " $dev_pc " == "" ] ; then
echo " ${echo_tips}${echo_tips}UAT-DEV not Found! "
else
# 中止進程
kill -9 $dev_pc
sleep_2
# 再次檢測是否已中止進程
dev_pc1=`ps -ef|grep " Dev-wildfly-${wildfly[$i]}/ "|grep -v grep|awk ' {print $2} '`
if [ " $dev_pc1 " == "" ] ; then
echo " ${echo_tips}Stop UAT-DEV Success! "
else
echo " ${echo_tips}${echo_tips}Stop UAT-DEV Failure! "
fi
fi
checkBoolean=`expr ${checkBoolean} + 1`
fi
done
}說明:
1.中止全部容器:./stop_wildfly.sh a
至此,第1個問題已圓滿解決!
結束語:
1.本來考慮與實現相對簡單,初版,把全部的容器路徑寫到文件裏,讀取啓動與中止便可,但不利於自動化部署、WAR分發等問題處理。
2.這個版本是實際當中優化的第三個版本,相對擴展與維護簡單,爲自動化部署提供中止與啓動腳本,也最適合咱們目前的轉測流程。
3.本想與自動部署一塊兒寫此文,發現所講的內容與貼出的腳本內容過多,有時間再講講解決第3、四個問題,超簡單的實現方式shell腳本。
4.Jenkins大多數以爲持續集成用這個很叼,完了其引入除了用發郵件功能、定時任務,其餘組件基本用不上。不少人也許只是對Jenkins組件的熟悉,但徹底不具有Jenkins轉化提高效率的能力,維護成本與效率還不如以前手工操做。
5.思想的支撐尤其重要,能夠在有限的資源裏發揮出最大的功效,尋找到最優的方案。
切勿捨本求末,忘記初心!
如轉載還請保留出處與做者姓名Findyou,謝謝!