一.背景
公司的項目一直手動maven打包、上傳服務(wù)器、關(guān)閉/開啟tomcat,整個流程下來耗時耗力,雖然可以將所有流程通過shell腳本一次性解決,但如果可以通過idea的Jenkins插件一鍵自動部署,那更省時省力。
下面是一個簡單的發(fā)布tomcat的shell腳本,執(zhí)行下面腳本的前提是要在服務(wù)器中安裝了git、maven
# 先關(guān)閉tomcat進程
kill -9 `ps aux|grep tomcat|grep -v 'grep'| awk 'NR==1{print $2}'`
# 切換到項目存放位置
cd nxyyProjectSource/NXYY
# git拉取最新代碼
git pull xxxx
# 切換到項目下面的代碼存放位置
cd nxyy
# maven打包
mvn clean
mvn install -DskipTests
# 將war包放到tomcat下
cd
cp nxyyProjectSource/NXYY/nxyy/target/nxyy.war /home/tomcat/webapps
# 開啟tomcat
cd /home/tomcat/bin
./startup.sh
# 查看日志
tail -f ../logs/catalina.out
每次git拉取時,都需要密碼,進行下面的配置后,只需要在第一次輸入密碼后會永久保存到服務(wù)器中,下次再git拷貝/拉取時就不需要輸入密碼了:
git config --global credential.helper store
如果想清除賬號和密碼,輸入:
git config --global credential.helper reset
如果想臨時存儲(默認15分鐘),輸入:
git config --global credential.helper cache
單獨對某個項目免密,在https鏈接里加入username:password
git remote add origin https://username:password@xxx.git
上面這些配置保存在.git/config
里。
二.Jenkins的安裝/配置/熱部署/腳本tomcat重啟
下載安裝包jenkins.war;在安裝包根路徑下,運行命令java -jar jenkins.war --httpPort=8080(linux環(huán)境、Windows環(huán)境都一樣),運行后有一個密碼,需要登錄時使用:
![](/d/20211016/ca8c5f2dc03f7630d0a227dfd0ea7467.gif)
打開瀏覽器進入鏈接http://ip:8080,進入插件安裝選擇,這里建議選擇,推薦安裝的插件,保證基本常用的功能可以使用;選擇后,進入插件安裝頁面,有些插件安裝失敗,可以點擊到后面的再次安裝:
![](/d/20211016/1784813912cd9e4a9ce23f62781b8f63.gif)
設(shè)置初始用戶和密碼,為下次登錄時使用:
![](/d/20211016/0e8aed646eb76def640ff076bfeebf09.gif)
進入系統(tǒng),安裝完成:
![](/d/20211016/3a69bbe84e35ffc52bf20b86266feb88.gif)
注意,如果還是進入不了系統(tǒng),需要稍等一下,或者刷新頁面,如果還是進入不了,需要重新啟動jenkinds服務(wù)器,在啟動首頁url后面加上restart就可以了【重啟:http://ip:8080/restart
】;如果輸入默認密碼之后,一直卡住問題:
![](/d/20211016/0625662807376d036ab8f6642ed6437c.gif)
在$JENKINS_HOME/hudson.model.UpdateCenter.xml文件中,默認內(nèi)容如下:
<?xml version='1.0' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>http://updates.jenkins-ci.org/update-center.json</url>
</site>
</sites>
這個地址在外國的服務(wù)器,因為墻的原因,下載初始化界面所需插件不了,就一直處于等待狀態(tài),把url改為http://mirror.xmission.com/jenkins/updates/update-center.json就解決了
進行系統(tǒng)系統(tǒng)配置設(shè)置Jenkins的訪問路徑,當然,這個路徑在創(chuàng)建用戶名之后會出現(xiàn):
![](/d/20211016/324c43e161217b636c393348b3a18fe9.gif)
設(shè)置插件安裝源:插件管理 -> 高級,http://mirror.xmission.com/jenkins/updates/current/update-center.json
![](/d/20211016/80c585123f66d78dfd62bfdbfd0e65aa.gif)
進行系統(tǒng)管理的全局工具配置,maven、JDK、Git的配置:
![](/d/20211016/cc644bbc9f8973dc7d5b1a93bf1e73a4.gif)
![](/d/20211016/162733754a2caefd0dad36dd7a23bd18.gif)
配置完后進行項目的搭建,選擇新建任務(wù):
![](/d/20211016/6d254912ee0fcc2645d544748464801c.gif)
在進行項目信息配置前,需要一些憑證Credentials信息,比如git的用戶名和密碼、tomcat用戶的用戶名和密碼:系統(tǒng)管理 -> 憑據(jù)(Manage Credentials)
![](/d/20211016/e7055538738620bcc1a1ba1fe16888ea.gif)
需要tomcat的用戶名和密碼,是為了讓Jenkins可以遠程發(fā)布tomcat,在tomcat的conf下tomcat-users.xml里面配置的:tomcat遠程發(fā)布需要修改tomcat-users.xml、context.xml(下文構(gòu)建遇到的坑第5點)、manager.xml(下文構(gòu)建遇到的坑第6點
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<user username="用戶名" password="密碼" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui"/>
</tomcat-users>
進行項目信息的配置,在配置完進行構(gòu)建,tomcat必須在服務(wù)器中是啟動狀態(tài):
![](/d/20211016/d8ffa3a7494d2bdf9d0d3aa1d39c44b9.gif)
![](/d/20211016/63f8938f1f045b6c671e929cb7088266.gif)
![](/d/20211016/ba90c5788b1d7d6204c6d2f33d6fcbb4.gif)
上面是tomcat熱部署,下面進行tomcat的重啟執(zhí)行項目:先安裝插件Publish Over SSH,進行信息配置:系統(tǒng)管理 -> 信息配置 ->Publish over SSH
![](/d/20211016/e3faa47004a7c518a8f291bc11a74fa8.gif)
構(gòu)建的配置前需要創(chuàng)建一個重啟tomcat的腳本:vi tomcat.sh,然后賦予執(zhí)行權(quán)限chmod 777 tomcat.sh
#這里需要加上JAVA_HOME的配置,雖然在本地的環(huán)境變量中已經(jīng)配置了,但是遠程調(diào)用的時候,還是需要配上的,否則執(zhí)行腳本出錯。
export JAVA_HOME=/usr/java/jdk1.8.0_141-cloudera
# tomcat的位置
tomcat_home=/home/tomcat-dev
#【3.1】 停止tomcat變量
SHUTDOWN=$tomcat_home/bin/shutdown.sh
#【3.2】 啟動tomcat變量
STARTTOMCAT=$tomcat_home/bin/startup.sh
#【3.3】 刪除所有項目文件包括war包和war解壓后的文件 如果是局部發(fā)布這句不需要 這只是正對jenkins整個war發(fā)布
rm -rf /home/tomcat-dev/webapps/TSISAPP*
#得到進程ID 這里也可以簡寫 如果你ps -ef|grep 項目名稱 可以帶出PID 那么可以直接寫成這樣
#之前為什么寫那么長 是因為在用jenkins調(diào)用腳本的時候,也會帶出jenkins調(diào)用腳本的那個進程 這樣kill -9 就會killjenkins進程 導致一建發(fā)布中斷
#所以這里一直寫到了conf文件夾目錄
#如果不需要用到j(luò)enkins可以用下面簡潔版 得出PID命令
#PID=`ps -ef |grep 項目名稱 |grep -v grep | awk '{print $2}'`
#【3.4】 獲取進程ID
PID=`ps -ef |grep /home/tomcat-dev/conf |grep -v grep | awk '{print $2}'`
if [ ! "$PID" ];then # 這里判斷TOMCAT進程是否存在
echo "進程不存在"
else
echo "進程存在 殺死進程PID:$PID"
kill -9 $PID
fi
#【3.5】啟動項目
$STARTTOMCAT
echo "啟動項目"
構(gòu)建:Post Steps選擇Send files or execute commands over SSH,下面的構(gòu)建后操作 -> Deploy war/ear to a container 就不需要了:
![](/d/20211016/4e4a01e723df1f716576b9b7d1599445.gif)
![](/d/20211016/956c33960c278ab186395239328506a7.gif)
三.構(gòu)建遇到的坑
如果沒有構(gòu)建一個maven項目,在插件中查找后進行安裝:Maven Integration plugin
在構(gòu)建后如果沒有Deploy war/ear to a container,在插件中查找后進行安裝:Deploy to container Plugin
出現(xiàn)下面的錯誤:
[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]
解決辦法:在pom.xml的<build>標簽中添加<defaultGoal>install</defaultGoal>
出現(xiàn)下面的錯誤:org.codehaus.cargo.container.ContainerException: Failed to deploy 或org.codehaus.cargo.container.ContainerException: The [cargo.remote.username] and [cargo.remote.password] properties are mandatory and need to be defined in your configuration
解決辦法:在pom.xml的<build>標簽中的<plugins>中添加
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.4.9</version>
<configuration>
<container>
<!-- 容器版本名稱-->
<containerId>Tomcat 9.x</containerId>
<type>remote</type>
</container>
<configuration>
<type>runtime</type>
<properties>
<!-- tomcat管理界面-->
<cargo.remote.uri>http://ip:8888/manager/text</cargo.remote.uri>
<!-- tomcat管理界面用戶名和密碼-->
<cargo.remote.username>用戶名</cargo.remote.username>
<cargo.remote.password>密碼</cargo.remote.password>
</properties>
</configuration>
</configuration>
</plugin>
出現(xiàn)下面的問題:Caused by: org.codehaus.cargo.container.tomcat.internal.TomcatManagerException: The username you provided is not allowed to use the text-based Tomcat Manager
解決辦法:到tomcat的 /webapps/manager/META_INF/context.xml文件,將文件中對訪問的來源受限設(shè)置注釋
<Context antiResourceLocking="false" privileged="true" >
<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
--> //注釋掉即可
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
tomcat遠程連接出現(xiàn)403拒絕,在conf/Catalina/localhost下添加manager.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context privileged="true" antiResourceLocking="false"
docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>
idea結(jié)合Jenkins插件進行遠程發(fā)布,在Crumb Data通過http://ip:8080/crumbIssuer/api/xml?tree=crumb#獲取填入時,出現(xiàn)CSRF enabled -> Missing or bad crumb data
![](/d/20211016/4b7276035275cd974baaf6792af02daf.gif)
通過搜索網(wǎng)上解決方案,大多都是說開啟CSRF服務(wù),
![](/d/20211016/414e734d390ce5c2ebdd6681bad5a803.gif)
![](/d/20211016/057a74ae942ddce23d0d708ed3ff55be.gif)
但還是無法解決該問題,解決辦法:點擊用戶名 -> 設(shè)置 -> API Token -> 當前 Token,通過token名生成token,代替上面的用戶名和密碼,最后終于成功了
![](/d/20211016/cc7e226aae13e18b88a9aa107ec1b9b2.gif)
![](/d/20211016/ded63464173721cb44d2fb045110b27d.gif)
到此這篇關(guān)于Jenkins+tomcat自動發(fā)布的熱部署/重啟及遇到的問題解決辦法(推薦)的文章就介紹到這了,更多相關(guān)Jenkins tomcat 熱部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!