如何實現tomcat自動化部署?
像BAT這樣的大公司,都是有一套自動化流水線的,出於公司安全紅線要求,我無法講的太細,但是我可以提供些思路給題主參考。
工具工欲善其事,必先利其器,我們先來說需要哪些工具
1 git,用於保存最新要上線的代碼
2 maven,用於打包項目
3 Jenkins,用於觸發任務
4 sh腳本或者Python腳本,執行Jenkins任務的腳本
流程接下來是實際的流程。
首先,由開發人員把要上線的代碼上傳到指定代碼庫。
然後,開發人員觸發Jenkins任務。
這個Jenkins的任務是自動化部署的核心,包含以下步驟
1 開始對代碼進行打包
2 把包放到伺服器指定文件夾下
插一句,為了安全起見,我們建議的是進行熱部署,何為熱部署?
熱部署需要Nginx+多台Tomcat的配合。
假設目前只有一台Tomcat連接到了Nginx上,那麼可以把要更新的代碼部署在另一台Tomcat上,然後啟動新的Tomcat,確認該服務啟動成功,各能力已經啟動後,再去修改Nginx的conf文件,把原本給舊Tomcat的請求切到新Tomcat上,這樣就實現了熱部署。如果不使用這種辦法,而是直接在舊的Tomcat上部署新的war包的話,重啟Tomcat的過程,就會有幾秒停服,這對用戶來說是不可接受的。既然說到這裡,再介紹兩個熱部署用到的Nginx的命令。在修改Nginx的conf文件後,要在Nginx的根目錄下執行sbin/nginx -t 來檢查當前conf文件配置是否正確,如果是「successful」的,就可以執行sbin/nginx -s reload來進行實現把新的流量切到新的機器上,即使新的conf文件生效。
好的,關於熱部署的部分說完了,我們再說回來。
3 將舊的伺服器根目錄下的war包用cp命令放到一個專門備份的文件夾下
4 將新的war包同樣用cp命令放到即將啟動的Tomcat根目錄下的webapps文件夾下,然後解壓
5 執行sh bin/
start.sh
啟動新的Tomcat6 檢查該Tomcat是否啟動成功,包括進程存在,tail -f
catalina.out
日誌一直在打,api能夠調通
7 修改Nginx的conf文件
8 檢查Nginx配置文件是否successful
9 更新Nginx配置,即sbin/nginx -s reload
10 繼續觀察新Tomcat是否運行正常,如果不正常則立刻切回原Tomcat,本次自動更新失敗
11 如果正常,則停止舊的Tomcat。
以上,自動化部署完成。
我是蘇蘇思量,來自BAT的Java開發工程師,每天分享科技類見聞,歡迎關注我,與我共同進步。
最近接觸了jenkins這個東西,所以花點時間了解了下。它可以在代碼上傳倉庫(如github,gitee,gitlab)後,在jenkins(一個網站界面)中通過獲取代碼倉庫中最新代碼,進行自動化部署,而省去手動打包、上傳伺服器、部署這一系列步驟,非常方便。
下面教程分為以下幾個部分:
一、在你的本地電腦或者linux伺服器上下載安裝jenkins:jenkins下載地址:https://jenkins.io/ 下載網站的war包版本就好了
下載完後把它部署到你的tomcat上運行:放到tomcat的webapps目錄下,啟動tomcat(windows下雙擊startup.bat或者linux下運行sh startup.sh),然後通過瀏覽器訪問,如我的電腦上訪問:localhost:8080/jenkins 。啟動後的界面如下:
然後到提示的文件中把裡面的文本複製出來填到管理員密碼中。
接著如果是在本地電腦跑,可能會出現:該jenkins實例似乎已離線 提示,如果出現,是因為本地https訪問不了的原因。在瀏覽器中另打開一個界面http://localhost:8080/pluginManager/advanced,把升級站點中的url中的https改為http,保存更新。然後關掉tomcat伺服器重啟,就可以聯網了。
接下來選擇安裝推薦的插件,這個需要一定的時間。最後額外推薦安裝兩個插件,在系統管理中可以安裝插件:
1、 Rebuilder
2、 Safe Restart
二、在linux伺服器中安裝git, maven,創建一個jenkens目錄,配置git的公鑰到你的github上,這些步驟是使用jenkins的前提。
安裝git的目的是在自動化部署前實時從git遠程倉庫中拉取最新的代碼。在linux(我用的是centos系統)安裝git:
yum install git
生成密鑰:
ssh-keygen -t rsa -C "[email protected]"
可以不設置密鑰密碼直接按三次回車。 把家目錄中生成的公鑰內容複製到github或其他倉庫上。
安裝maven的目的是通過項目中的pom.xml文件自動解決項目依賴問題,構建項目。linux中通過wget+下載鏈接下載maven的zip包然後解壓即可。配置maven環境變數:
vim /etc/profile
//在這個文件末尾加上export MAVEN_HOME=/root/maven3.4.5export PATH=$MAVEN_HOME/bin:$PATH //保存後在命令行輸入,啟動配置. /etc/profile
創建jenkins目錄,用來存儲拉取下來的項目代碼等。
三、將Linux伺服器註冊到Jenkins上
1、開啟伺服器上的ssh服務,可通過 netstat -anp | grep :22命令查看是否開啟
2、先來測試一下怎麼在jenkins中操作遠程伺服器
在jenkins中選擇系統管理——》新建節點
其中遠程工作目錄即你在Linux上創建的jenkins目錄。在Credentials添加一個遠程用戶,輸入你的遠程機器用戶名和密碼保存。
點擊TestEnv,啟動代理。
在全局工具配置中配置git命令:
3、自動化部署過程原理:
所以需要編寫一個shell腳本來執行這個過程。
具體的創建Jenkins任務的過程為
1.創建jenkins任務
2.填寫Server信息
3.配置git參數
4.填寫構建語句(shell腳本),實現自動部署。
四、創建自動化部署任務1、編寫shell部署腳本deploy.sh,並放到linux伺服器中的jenkins目錄下,在該目錄下通過touch deploy.sh創建一個腳本,把下面的腳本複製到裡面即可(到時每次自動部署都會執行它),腳本中的my-scrum為我要自動構建的項目名:
#!/usr/bin/env bash
#編譯+部署項目站點
#需要配置如下參數# 項目路徑, 在Execute Shell中配置項目路徑, pwd 就可以獲得該項目路徑# export PROJ_PATH=這個jenkins任務在部署機器上的路徑 # 輸入你的環境上tomcat的全路徑# export TOMCAT_APP_PATH=tomcat在部署機器上的路徑 ### base 函數killTomcat()
{ #pid=`ps -ef|grep tomcat|grep java|awk "{print $2}"` #echo "tomcat Id list :$pid" #if [ "$pid" = "" ] #then # echo "no tomcat pid alive" #else # kill -9 $pid #fi #上面注釋的或者下面的 cd $TOMCAT_APP_PATH/bin sh shutdown.sh}cd $PROJ_PATH/my-scrummvn clean install # 停tomcatkillTomcat # 刪除原有工程rm -rf $TOMCAT_APP_PATH/webapps/ROOTrm -f $TOMCAT_APP_PATH/webapps/ROOT.warrm -f $TOMCAT_APP_PATH/webapps/my-scrum.war # 複製新的工程到tomcat上cp $PROJ_PATH/scrum/target/order.war $TOMCAT_APP_PATH/webapps/ cd $TOMCAT_APP_PATH/webapps/mv my-scrum.war ROOT.war # 啟動Tomcatcd $TOMCAT_APP_PATH/sh bin/startup.sh
2、在jenkins上點擊新建一個任務,填好任務名,填寫運行的節點(上文中新建節點時創建的):
3、點擊源碼管理,填寫github(或gitlab等)地址:
4、點擊add,選擇check out to a sub-directory ,添加源碼下載到jenkins目錄下的指定目錄(可以命名為你的項目名):
5、填寫構建任務時的shell腳本,然後保存,點擊立即構建完成自動構建。(這裡有一個坑,一定要給tomcat下所有sh文件加上x許可權才能啟動tomcat成功,具體為在tomcat目錄上層執行chmod a+x -R tomcat目錄或者在tomcat的bin目錄下執行chmod +x *.sh)
#當jenkins進程結束後新開的tomcat進程不被殺死
BUILD_ID=DONTKILLME#載入變數. /etc/profile#配置運行參數 #PROJ_PATH為設置的jenkins目錄的執行任務目錄export PROJ_PATH=`pwd`#配置tomcat所在目錄export TOMCAT_APP_PATH=/root/tomcats/tomcat-my-scrum #執行寫好的自動化部署腳本sh /root/jenkins/deploy.sh
6、自動化構建成功:
7、後續代碼如果有改動,只要push到github或者gitlab等上,在jenkins界面中再次執行構建任務就可以了,非常方便,自動化部署,再也不用手動上傳項目到伺服器了。
五、解決一個tomcat關閉,所有tomcat都被關閉了的問題(如果你的jenkins也是安裝的伺服器上的其中一個tomcat中,就可能被莫名殺掉)這是因為所有的tomcat的關閉腳本(shutdown.sh或者說catalina.sh)都默認監聽的是8005埠。只要進去tomcat目錄下的conf目錄下的server.xml文件中,將
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <!-- Security listener. Documentation at /docs/config/listeners.html <Listener className="org.apache.catalina.security.SecurityListener" /> -->
中的8005埠改為不同的埠,就不會一個tomcat關閉,所有的tomcat都被關閉了
六、以後可以在linux伺服器中安裝多個tomcat,來部署不同的項目,分別使用不同的埠,如我喜歡用8081,8082,8083等埠來解決多個tomcat埠衝突問題(在tomcat的conf目錄下的server.xml中修改即可,默認為8080)。然後可以用jenkins來管理這些tomcat的自動化部署啦。雖然我只是個開發人員,但是很多時候都是我們自己完成環境部署,目前我們測試環境實現了自動化部署,是基於Jenkins來做的;生產環境暫時還是【人肉】部署。整體的發布水平和很多公司還是有很大的差距,不過公司缺少一些基礎平台,我們也只能自己想辦法。
自動化發布,前置工作有很多通過Jenkins實現自動化發布的過程很簡單:
開發人員把代碼通過git或者svn提交;
Jenkins可以通過手動或定時的方式啟動,會更新最新的代碼,跑全量的測試用例,測試通過後進行代碼的部署;部署的過程都是提前寫好的腳本,比如通過什麼命令打包,把包放到哪台伺服器的哪個目錄下面,通過什麼命令停止和啟動(重啟)服務。(具體的安裝和配置,搜索一下會找到很多資料)
自動化發布看起來非常簡單,但實際上前置工作很多:
- 需要有代碼版本控制工具:這個問題不大,基本上每個公司都會有,最常用的git和svn;需要告訴Jenkins項目的代碼在哪裡。
- 自動化構建工具:如Maven、Gradle、Ant,我們基本都用Maven,個別特別老的項目用的Ant;需要告訴Jenkins項目執行什麼命令可以打包。
- 整包發布:我了解還是有不少公司喜歡增量發布,但是我覺得如果能做到全量發布的話是最好了,能避免很多的問題。
- 單元測試:很多人會忽視這個問題,我還是覺得很有必要的;寫單元測試要發自內心地覺得有用,而不是為了追求測試覆蓋度,不是為了做給領導看。
- 灰度發布和回滾:這一點我們也沒有做到,上線就是全部都上線,有問題的話就全部回退;我們項目盡量做到了【人肉灰度發布】,也就是先更新一個server,然後驗證通過之後,再更新下一個;回滾也是人肉操作。
- 容器:要是公司用到了容器的話,那麼自動化發布會容易一些...
因為很多基礎平台沒有(我們公司很多工作都做了細分),一些事情的推進不是開發就可以推進的,通常需要很多部門的配合;所以生產環境依然還是手動發布。
拆包:我們項目是純介面的項目,沒有頁面;項目被拆成了幾個包,有單獨一個包是對外提供服務的,也就是說,其餘幾個包隨時可以在線發布,反正對用戶是無感的;
編寫各種shell腳本:既然做不到自動化發布,那麼就讓發布儘可能簡單;可以把發布過程中一系列的命令,都寫到shell腳本裡面完成;
偽灰度發布:對外提供介面的包被部署在N個server上(使用Spring Boot內嵌的Tomcat),前面掛著Nginx,Nginx可以監控每個server(節點)的存活,所以發布的時候先停掉一個server做程序更新,Nginx會知道這個server不存活,這時候不會再發送新的請求到這個server上,直到程序更新完成啟動。
1、需要一個SCM也就是代碼控制管理工具,現在用git的比較多,當然也可以用svn;
2、需要偵探出需要部署的實際,有如下幾個辦法:
(1)對於git或者svn來說,都有hook,比如merge,commit,update之後觸發等,比如,提交了一個文件之後,觸發調用一個url;
(2)做一個定時任務,每半個小時或者1個小時檢查源代碼,看是否有代碼的改變,如果有,則需要往下去做部署。
這一步一般使用Jenkins創建job;
3、打包
針對步驟2,如果是全量包,比較好做,也就是只要檢測出代碼有改變,則直接使用Maven,ANT,Gradle直接的打包工具進行打包即可。但是如果是增量包,則需要通過git log或者svn log等檢查出具體更新的文件,然後針對文件是否需要編譯繼續操作,當然一個更簡單的辦法,就是代碼全量編譯,然後真針對有變更的文件進行操作。本步驟可以得到修改後的文件(class或者靜態文件)以及路徑。
這一步一般使用Jenkins創建job,然後使用Maven或者ANT或者Gradle等工具;
4、上傳
從第三步中獲取到的文件和路徑,需要上傳到tomcat伺服器中。如果是全量包,要好做一些,直接用腳本scp合作和jenkins的tomcat插件傳到遠程伺服器即可。如果是增量包,則需要寫腳本針對每個不同的文件進行上傳。
這一步一般用Jenkins,也可以自己寫python或者shell腳本;
5、重啟
無論是重啟tomcat或者ng等,原理都一樣:
(1)獲取伺服器進程id;
(2)kill掉進程;
(3)start 服務。
此三步可以用python的psutil或者shell腳本實現。調用實現也是通過Jenkins。
綜上,幾個關鍵工具和步驟:
1、版本控制管理,git或者svn,獲取文件變更通知和內容;
2、打包,java系的是maven,ant,gradle這些;
3、jenkins,偵測代碼的變更、調用打包工具、上傳包和重啟伺服器。
一般來講,還需要加一步,就是重啟之後的伺服器連通性驗證,以免服務沒有啟動成功造成生產故障。
首先謝謝邀請,
自動化部署在互聯網中已經非常成熟了。也有很多的開源方案。
現在用Jenkins 自動部署的比較多,詳細的配置可以網上搜。
自動部署流程一般如下
- git同步最新代碼
- 使用maven打包項目
- 停止tomcat伺服器
- 部署項目
- 啟動tomcat伺服器
通過web操作的過程一般都是
通過web頁面調用jenkins腳本,進行代碼編譯,代碼編譯建議在乾淨環境區編譯,編譯成功後,把上線java文件上傳到上線文件伺服器,然後修改配置文件。利用命令調用遠程伺服器端部署監控程序,下載服文件伺服器部署jar,下載最新配置文件進行替換。然後備份原來jar文件,刪除jar,把新的jar替換。自動重啟就可以。也可以開發遠程看啟動日誌頁面。可以查詢web是否啟動正常。當然完善的自動部署還會涉及到自動切換流量。上線成功後狀態回傳等。詳細的內容比較多。你可以關注我的頭條號。改天我可以總結一個完整的產品流程和實現
看了一下各位樓主的回答,確實不錯。
說說我個人的看法吧,希望對你有幫助。
各位樓主說了好多工具,當然都可以用無可厚非,工欲善其事必先利其器,工具當然是好的,但是不要被太多的工具束縛了從而耽誤浪費更多的時間。
如果只是單純的部署的話,也不費事。無非題主的意思是這部分工作重複性高,複雜度低,但是比較重要,日常工作中用在部署上的時間太多,不值得,更不值得去加太多的班,因為好多重要應用系統都必須要在非業務時段去做變更,所以加班就不可避免了。
所以呢,花一點時間出來,梳理一下你們部署的流程,例如,上線準備(下載投產包等)、備份(備份程序和配置文件、數據備份等)、程序更新、資料庫更新、修改配置、重啟服務、技術檢查等,梳理好之後,開始開發這樣一整套自動化流程,固定下來,盡量不要人工干預,除非必要的增加斷點提醒,至於用什麼語言開發,shell、bat、 Python等腳本最好不過,也可以考慮使用java開發,然後用shell、bat或Python封裝成腳本,這些都是核心功能,等完全實現了,部署的工作就可以變成一鍵啟動執行一個腳本就搞定了,不用再手工每次重複操作那麼多步驟而且還容易出錯。等一鍵執行功能成熟之後你就可以設置定時任務,讓它定時自動發起就不用加班守候了。
以上就是自動化的一個簡單粗暴的實施方案,供參考。
tomcat自動化部署腳本實現的功能如下:
(1) 檢查tomcat進程是否存在,如果存在則kill掉
(2) 備份現有war包到tomcat/backup目錄
(3) 複製當前目錄新war包到tomcat/webapps目錄
(4) 啟動tomcat
shell腳本內容如下:
#!/bin/bash
now=`date +%Y%m%d%H%M%S`
tomcatPath=/usr/local/tomcat/software/tomcat6
backupPath=/usr/local/<span style="line-height: 1.5;">tomcat</span><span style="font-size: 1em; line-height: 1.5;">/software/tomcat6/backup</span>
war=$1
if [ -e "$war.war" ]; then
echo -e " 33[34m war archive: $war.war 33[0m"
else
echo -e " 33[31m war archive "$war.war" not exists 33[0m"
exit -1
fi
# change color
echo -e " 33[34m"
#create backup dir
if [ ! -d "$backupPath" ]; then
mkdir "$backupPath"
fi
echo "tomcat home: $tomcatPath"
echo "backup path: $backupPath"
echo "try to stop tomcat..."
pid=`ps aux|grep "java"|grep "$tomcatPath"|awk "{printf $2}"`
if [ -n $pid ]; then
echo "tomcat pid: $pid";
kill -9 $pid;
fi
echo "stop tomcat finished..."
echo "backup old archive..."
if [ -f "$tomcatPath/webapps/$war.war" ]; then
mv -v "$tomcatPath/webapps/$war.war" "$backupPath/$1_$now.war";
fi
rm -rf $tomcatPath/webapps/$war*
echo "copy $war.war archive to webapps.."
cp -v "$war.war" "$tomcatPath/webapps/"
echo -e " 33[32m"
echo "startup tomcat..."
sh $tomcatPath/bin/startup.sh
tail -10f $tomcatPath/logs/catalina.out
使用時,需要先修改tomcatPath的值為實際tomcat路徑。
保存該文件到autodeploy.sh, 執行命令:
Shell執行代碼
./autodeploy.sh abc
autodeploy.sh和abc.war
請大家多多關注我的頭條號,謝謝大家
發布到本地的話,在maven中使用tomcat plugin即可,如果要發布到測試環境SIT或UAT環境,應該使用ci工具比如Jenkins, 在Jenkins中建一個continues project, 只要有code checkin, 就自動build和deploy到測試環境,在Jenkins中還需要有一個release project, 因為continues自動build的都是snapshot,這不能部署到production上去, 這個release project就是用來build release版本,然後publish到公司內部的maven repositories(一般用nexus),開發人員不應該允許操作production環境, 應該由專門的伺服器管理人員從nexus上下載release版本進行production的部署。
題外說一點,大多數部署也包含資料庫腳本的變化,這怎麼自動部署,也是有很好的工具比如liquibase,用liquibase建立資料庫命令的版本控制,打包在war/ear中,部署時liquibase能自動檢測環境中現有的資料庫腳本的版本,而運行沒有部署過的資料庫腳本命令。
題主,這個問題很好做,寫一個shell腳本就可以搞定
下面是我給你的解決方案(linux系統下):
開發人員使用Git或者SVN把修改好的代碼提交到SVN或Git伺服器上,然後在做檢出打包的功能,步奏如下:
1.刪除原來tomcat下的webApp
2.checkout 最新的代碼,進行打包和copy到tomcat的目錄下
3.再次啟動tomcat伺服器
一個程序員,從頭到尾都是自己搞,完全手動式,好累!
推薦閱讀: