JavaWEB學習記錄--Jenkins自動部署Maven項目
標簽(空格分隔): javaWEB
最近在研究jenkins的自動部署方案,有一些心得,記錄下來以幫助其他人.如果對你有幫助記得點下贊哈.
1.部署方式的選擇
1.1 tomcat上傳
該方式網上很多教程都是這個,使用這個方式的話需要tomcat中有初始時Manage這個項目,本質上是通過http://ip:port/manager/html
這個地址的上傳接口進行上傳,進行熱部署.具體如下圖:
這樣做有很多弊端:(個人觀點,可能因為目前見識短而不夠充分認識)
- 這樣做沒法對之前的項目備份
- 這種部署方式會導致tomcat內原項目的很多資源釋放不掉,部署多次后會報
OutOfMemoryError
這個錯誤. - 需要tomcat內有manage項目,安全性不夠,容易被利用
基于這些考慮,拋棄了這種方案.
1.2使用腳本部署
該方案實際上使用jenkins把打包后的war包上傳到服務器,上傳成功后執行服務器的腳本,該腳本會備份,并強制kill tomcat進程,部署war包后再啟動tomcat,具體流程圖如下:
最終采用了這種方案進行部署.
2.具體部署
2.1安裝jenkins,配置
安裝這里就不詳細講述了,說下需要的插件
Maven Integration plugin:是的jenkins支持maven任務構建
Publish Over SSH:使得jenkins支持ssh連接上傳,并執行對應命令
2.2配置Publish Over SSH插件
設置地址:系統管理/系統設置/Publish over SSH
公共配置:
Passphrase:密碼(如果你設置了key,為key的密碼,否則為username的密碼)
Path to key:key文件(私鑰)的路徑
Key:將私鑰復制到這個框中
Disable exec:禁止運行命令,這個不要勾選,否則沒法執行命令
私有配置:
SSH Server Name:標識的名字(隨便你取什么)
Hostname:需要連接ssh的主機名或ip地址(建議ip)
Username:用戶名
Remote Directory:遠程目錄
Use password authentication, or use a different key:可以替換公共配置(選中展開的就是公共配置的東西,這樣做擴展性很好)
私有配置的高級:
Port:端口(默認22)
Timeout (ms):超時時間(毫秒)默認即可
Disable exec:禁止運行命令
Test Configuration:測試連接
配置完成后測試下,提示success的話就沒問題.
2.3腳本配置
腳本的主要功能為備份,kill tomcat,部署war包,start tomcat,難點就是怎么kill tomcat,下面結合網上的腳本修改的
使用ps -ef | grep $TOMCAT_HOME | grep -v 'grep\|tail\|more\|bash\|less'| awk '{print $2}'
這個命令來查找指定tomcat的進程id的,解決了一臺機器多個tomcat互相間有關聯的問題.
#!/usr/bin/bash
#默認變量值
TOMCAT_HOME="/root/apache-tomcat-8.5.6"
TOMCAT_PORT=8080
PROJECT="$1"
#參數檢驗./deploy.sh <projectname> [tomcat port] [tomcat home dir]
if [ $# -lt 1 ]; then
echo "you must use like this : ./deploy.sh <projectname> [tomcat port] [tomcat home dir]"
exit
fi
if [ ! -n "$2" ]; then
TOMCAT_PORT=$2
fi
if [ ! -n "$3" ]; then
TOMCAT_HOME="$3"
fi
#根據端口查找tomcatpid,可能有多個,循環中判斷
tomcat_pid=`netstat -anp | grep $TOMCAT_PORT | awk '{printf $7}' | cut -d "/" -f 1`
echo "current :" $tomcat_pid
while [ -n "$tomcat_pid" ]
do
sleep 5
#進一步篩選
tomcat_pid=`ps -ef | grep $tomcat_pid |grep $TOMCAT_HOME | grep -v 'grep\|tail\|more\|bash\|less'| awk '{print $2}'`
echo "scan tomcat pid :" $tomcat_pid
if [ -n "$tomcat_pid" ]; then
echo "kill tomcat :" $tomcat_pid
kill -9 $tomcat_pid
fi
done
#備份路徑
BAK_DIR=$HOME/war/bak/$PROJECT/`date +%Y%m%d`
mkdir -p "$BAK_DIR"
cp "$TOMCAT_HOME"/webapps/$PROJECT.war "$BAK_DIR"/"$PROJECT"_`date +%H%M%S`.war
#publish project
echo "scan no tomcat pid,$PROJECT publishing"
rm -rf "$TOMCAT_HOME"/webapps/$PROJECT
rm -rf "$TOMCAT_HOME"/webapps/$PROJECT.war
cp $HOME/war/$PROJECT.war "$TOMCAT_HOME"/webapps/$PROJECT.war
#remove tmp
rm -rf $HOME/war/$PROJECT.war
#start tomcat
"$TOMCAT_HOME"/bin/startup.sh
echo "tomcat is starting,please try to access $PROJECT conslone url"
注意:
腳本如果從win下直接拷貝到linux會出現格式錯誤,使用vi直接建立個腳本,復制進去即可.
腳本放置在SSH配置的Remote directory下,不然找不到,并且需要給其一定的執行權限,不然也是無法執行.
使用方法:./deploy.sh <projectname> [tomcat port] [tomcat home dir]
2.4任務配置
在構建完成后選擇 Send build artifacts over SSH.
Source files:部署的源文件,相對于jenkins的工作目錄
Remove prefix:war包對應的前面的路徑,可以查看右邊的小問號.
Remote directory:配置目錄,這個目錄會和全局目錄疊加,比如我全局目錄為/home/web_as + 當前目錄/war,為上傳目錄
Exec command:要執行的命令,也就是執行自定義腳本,這里需要以~/開始,不然沒法執行,也不知道是不是只有我遇到了這個問題.
2.5 構建測試
點擊構建,在構建成功后jenkins控制臺會打出下面的日志:
.......
SSH: Connecting from host [DESHOP01.chmpay.com]
SSH: Connecting with configuration [30] ...
SSH: EXEC: STDOUT/STDERR from command [~/deploy.sh api 8090 /home/web_as/api-tomcat] ...
current : 18748
scan tomcat pid : 18748
kill tomcat : 18748
scan tomcat pid :
scan no tomcat pid,api publishing
tomcat is starting,please try to access api conslone url
SSH: EXEC: completed after 10,611 ms
SSH: Disconnecting configuration [30] ...
SSH: Transferred 1 file(s)
如果出現錯誤可以通過日志來定位,解決.
構建成功后查看tomcat日志,是關閉重啟的話則證明構建有效.