JavaWEB學習記錄--Jenkins自動部署Maven項目

JavaWEB學習記錄--Jenkins自動部署Maven項目

標簽(空格分隔): javaWEB


最近在研究jenkins的自動部署方案,有一些心得,記錄下來以幫助其他人.如果對你有幫助記得點下贊哈.


1.部署方式的選擇

1.1 tomcat上傳

該方式網上很多教程都是這個,使用這個方式的話需要tomcat中有初始時Manage這個項目,本質上是通過http://ip:port/manager/html這個地址的上傳接口進行上傳,進行熱部署.具體如下圖:

這里寫圖片描述
這里寫圖片描述

這樣做有很多弊端:(個人觀點,可能因為目前見識短而不夠充分認識)

  1. 這樣做沒法對之前的項目備份
  2. 這種部署方式會導致tomcat內原項目的很多資源釋放不掉,部署多次后會報OutOfMemoryError這個錯誤.
  3. 需要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日志,是關閉重啟的話則證明構建有效.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容