公司的開發環境每次部署項目都很麻煩,需要手動打包並上傳上去。這個太麻煩了,所以就准備搞個自動打包的腳本。腳本自動從svn代碼庫里面更新最新的代碼下來,然后maven打包,最后把war包丟到tomcat里面去。其實搞個Jenkins就完事了,但是還是想自己寫個腳本玩玩,因此特意記錄下自己寫這些腳本的過程,方便后續查閱。
一、環境介紹
CentOs6.9 +
svn + maven
二、編寫maven打包腳本
這里先提一下,公司有個公共的框架項目framework,其他項目都依賴了它。所以其他項目打包前,都需要mvn install 一下這個公共框架項目。
這個 mvn 命令執行后,想獲取是編譯成功還是失敗了,就需要點技巧了。
下面說說怎么獲取mvn install 后是否編譯成功的方案。
一般來說,如果mvn install 后出現了BUILD SUCCESS字眼,那就說明是編譯成功了。所以我們把 mvn命令的輸出內容直接存放到一個文件中,然后我們在文件中查詢有沒有BUILD SUCCESS這個字符串,如果有就說明是編譯成功了。
下面為maven install 公共框架framework項目的腳本代碼(/root/workspace/mvnscript/install_framework.sh):
#!/bin/sh
# this is maven install framework script
echo "[The install framework script is running.....]"
# go to framework dir
cd /root/workspace/framework
# 定義該腳本的臨時文件的名字
TmpFileName=/tmp/framework_sh_tmp
# 先把原來的這個腳本的臨時文件刪除
rm -rf ${TmpFileName}*
# 獲取當前時間
Time=`date +"%Y%m%d%H%M%S"`
# 把mvn命令的結果在屏幕顯示的同時寫入到文件中,文件名為:上面定義的文件名+當前時間
mvn clean install | tee ${TmpFileName}${Time}
# 文件中查找 BUILD SUCCESS 字眼
result=`grep 'BUILD SUCCESS' ${TmpFileName}${Time}`
# 如果結果為空那就是失敗,否則就成功了
if [ -z "$result" ];
then
echo "[ install framework error! -------- you can see the log on ${TmpFileName}${Time}]"
echo "[ ------------------------ script exit!! ------------------- ] "
exit
else
echo "[framework install SUCCESSS] "
fi
echo "[The install framework script is end]"
31
1
2
# this is maven install framework script
3
echo "[The install framework script is running.....]"
4
# go to framework dir
5
cd /root/workspace/framework
6
7
# 定義該腳本的臨時文件的名字
8
TmpFileName=/tmp/framework_sh_tmp
9
10
# 先把原來的這個腳本的臨時文件刪除
11
rm -rf ${TmpFileName}*
12
13
# 獲取當前時間
14
Time=`date +"%Y%m%d%H%M%S"`
15
16
# 把mvn命令的結果在屏幕顯示的同時寫入到文件中,文件名為:上面定義的文件名+當前時間
17
mvn clean install | tee ${TmpFileName}${Time}
18
19
# 文件中查找 BUILD SUCCESS 字眼
20
result=`grep 'BUILD SUCCESS' ${TmpFileName}${Time}`
21
22
# 如果結果為空那就是失敗,否則就成功了
23
if [ -z "$result" ];
24
then
25
echo "[ install framework error! -------- you can see the log on ${TmpFileName}${Time}]"
26
echo "[ ------------------------ script exit!! ------------------- ] "
27
exit
28
else
29
echo "[framework install SUCCESSS] "
30
fi
31
echo "[The install framework script is end]"
下面為maven打包sp項目的腳本代碼(
/root/workspace/mvnscript/package_sp.sh
):
#!/bin/sh
# this is maven package sp script
echo "[The package sp script is running.....]"
# go to sp dir
cd /root/workspace/sp
# 定義該腳本的臨時文件的名字
TmpFileName=/tmp/sp_sh_tmp
# 先把原來的這個腳本的臨時文件刪除
rm -rf ${TmpFileName}*
# 獲取當前時間
Time=`date +"%Y%m%d%H%M%S"`
# 把mvn命令的結果在屏幕顯示的同時寫入到文件中,文件名為:上面定義的文件名+當前時間
mvn clean package | tee ${TmpFileName}${Time}
# 文件中查找 BUILD SUCCESS 字眼
result=`grep 'BUILD SUCCESS' ${TmpFileName}${Time}`
# 如果結果為空那就是失敗,否則就成功了
if [ -z "$result" ];
then
echo "[ package sp error! -------- you can see the log on ${TmpFileName}${Time}]"
echo "[ ------------------------ script exit!! ------------------- ] "
exit
else
echo "[ sp package SUCCESSS] "
fi
echo "[The package sp script is end]"
x
1
2
# this is maven package sp script
3
echo "[The package sp script is running.....]"
4
# go to sp dir
5
cd /root/workspace/sp
6
7
# 定義該腳本的臨時文件的名字
8
TmpFileName=/tmp/sp_sh_tmp
9
10
# 先把原來的這個腳本的臨時文件刪除
11
rm -rf ${TmpFileName}*
12
13
# 獲取當前時間
14
Time=`date +"%Y%m%d%H%M%S"`
15
16
# 把mvn命令的結果在屏幕顯示的同時寫入到文件中,文件名為:上面定義的文件名+當前時間
17
mvn clean package | tee ${TmpFileName}${Time}
18
19
# 文件中查找 BUILD SUCCESS 字眼
20
result=`grep 'BUILD SUCCESS' ${TmpFileName}${Time}`
21
22
# 如果結果為空那就是失敗,否則就成功了
23
if [ -z "$result" ];
24
then
25
echo "[ package sp error! -------- you can see the log on ${TmpFileName}${Time}]"
26
echo "[ ------------------------ script exit!! ------------------- ] "
27
exit
28
else
29
echo "[ sp package SUCCESSS] "
30
fi
31
echo "[The package sp script is end]"
上面這個兩個腳本主要目的其實是為了在執行maven命令的同時獲取maven執行的結果,如果install或者package失敗了,直接給出提示,並退出腳本。
三、編寫自動svn更新代碼+maven打包並發布的腳本
因為sp項目依賴framework項目,所有每次都要先更新framework項目,然后再install。這樣sp項目打包后的framework的依賴才是最新的。
- 具體步驟為:
- svn命令更新framework項目
- svn命令更新sp項目
- maven命令install公共框架項目framework
- maven命令打包sp項目
- 停止tomcat
- 刪除tomcat里面的項目
- 把新打包好的項目copy到tomcat中
- 啟動tomcat
- 腳本代碼為(/root/deploy_sp.sh):
# 此腳本用於自動從svn上面更新sp代碼並打包
cd /root/workspace/framework
echo "[ update framework from svn....]"
svn update
cd /root/workspace/sp
echo "[ update sp from svn....]"
svn update
echo "[ maven install framework ....]"
#導入安裝framework腳本
source /root/workspace/mvnscript/install_framework.sh
echo "[ maven package sp....]"
#導入打包sp腳本
source /root/workspace/mvnscript/package_sp.sh
#打包完成后先停止tomcat
/root/tomcat-instance/shutdown_sp.sh
#刪除tomcat里面原來的sp相關的war包和文件夾
rm -rf /root/tomcat-instance/sp-tomcat/webapps/sp*
#copy新的war包到tomcat里面
cp /root/workspace/sp/sp-deploy/target/sp.war /root/tomcat-instance/sp-tomcat/webapps/sp.war
echo "[ sp.war copy SUCCESS ]"
#重新啟動tomcat
/root/tomcat-instance/sp-tomcat/bin/startup.sh
cd ~
echo [" sp deploy SUCCESS "]
1
# 此腳本用於自動從svn上面更新sp代碼並打包
2
cd /root/workspace/framework
3
echo "[ update framework from svn....]"
4
svn update
5
cd /root/workspace/sp
6
echo "[ update sp from svn....]"
7
svn update
8
echo "[ maven install framework ....]"
9
#導入安裝framework腳本
10
source /root/workspace/mvnscript/install_framework.sh
11
echo "[ maven package sp....]"
12
#導入打包sp腳本
13
source /root/workspace/mvnscript/package_sp.sh
14
#打包完成后先停止tomcat
15
/root/tomcat-instance/shutdown_sp.sh
16
#刪除tomcat里面原來的sp相關的war包和文件夾
17
rm -rf /root/tomcat-instance/sp-tomcat/webapps/sp*
18
#copy新的war包到tomcat里面
19
cp /root/workspace/sp/sp-deploy/target/sp.war /root/tomcat-instance/sp-tomcat/webapps/sp.war
20
echo "[ sp.war copy SUCCESS ]"
21
#重新啟動tomcat
22
/root/tomcat-instance/sp-tomcat/bin/startup.sh
23
cd ~
24
echo [" sp deploy SUCCESS "]
這個腳本代碼里有個好玩的東西就是用了source這個命令來實現類似於靜態包含的功能,把其他腳本的內容導入進來。為什么要用這個東西?
直接調用其他腳本不就好了。
主要原因是那兩個安裝腳本和打包腳本有退出的功能,如果mvn命令執行失敗,是直接退出了。
如果我直接用調用的方式,就不能實現調用第一個腳本失敗后,退出整個腳本;會出現第二個腳本繼續執行的情況。
這不是我想要的結果,我希望第一個腳本失敗后就直接結束了。因此百度了一下怎么才能實現這種包含的功能,后面發現用source能夠實現把其他腳本的內容導入到當前腳本來執行的功能。
這個和java的jsp的靜態包含的效果是類似的,因為它是相當於把其他腳本的內容拿到當前腳本來執行了,所以第一個腳本執行exit命令就相當於把整個腳本退出了。
四、小結
(1)通過查找mvn命令執行后的關鍵字的方法來實現判斷mvn命令是否執行成功
(2)通過source命令來實現腳本的靜態包含,從而實現導入的腳本中exit時可以退出整個腳本
(3)
其實也可以通過 $? 來判斷mvn命令的執行結果