Jenkins+tomcat自動釋出的熱部署/重啟及遇到的坑解決辦法
阿新 • • 發佈:2020-07-10
一.背景
公司的專案一直手動maven打包、上傳伺服器、關閉/開啟tomcat,整個流程下來耗時耗力,雖然可以將所有流程通過shell指令碼一次性解決,但如果可以通過idea的Jenkins外掛一鍵自動部署,那更省時省力。
下面是一個簡單的釋出tomcat的shell指令碼,執行下面指令碼的前提是要在伺服器中安裝了git、maven
# 先關閉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拉取時,都需要密碼,進行下面的配置後,只需要在第一次輸入密碼後會永久儲存到伺服器中,下次再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:[email protected]
上面這些配置儲存在.git/config
二.Jenkins的安裝/配置/熱部署/指令碼tomcat重啟
下載安裝包jenkins.war;
在安裝包根路徑下,執行命令
java -jar jenkins.war --httpPort=8080(linux環境、Windows環境都一樣),執行後有一個密碼,需要登入時使用:
開啟瀏覽器進入連結
進入外掛安裝選擇,這裡建議選擇,推薦安裝的外掛,保證基本常用的功能可以使用;http://ip:8080,
選擇後,進入外掛安裝頁面,有些外掛安裝失敗,可以點選到後面的再次安裝:
設定初始使用者和密碼,為下次登入時使用:
進入系統,安裝完成:
注意,如果還是進入不了系統,需要稍等一下,或者重新整理頁面,如果還是進入不了,需要重新啟動jenkinds伺服器,在啟動首頁url後面加上restart就可以了【重啟:
http://ip:8080/restart
】;如果輸入預設密碼之後,一直卡住問題:
在$JENKINS_HOME/hudson.model.UpdateCenter.xml檔案中,預設內容如下:
<?xml version='1.0' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>http://updates.jenkins-ci.org/update-center.json</url>
</site>
</sites這個地址在外國的伺服器,因為牆的原因,下載初始化介面所需外掛不了,就一直處於等待狀態,把url改為
http://mirror.xmission.com/jenkins/updates/update-center.json就解決了
進行系統系統配置設定Jenkins的訪問路徑,當然,這個路徑在建立使用者名稱之後會出現:
設定外掛安裝源:外掛管理 -> 高階,http://mirror.xmission.com/jenkins/updates/current/update-center.json
進行系統管理的全域性工具配置,maven、JDK、Git的配置:
配置完後進行專案的搭建,選擇新建任務:
在進行專案資訊配置前,需要一些憑證Credentials資訊,比如git的使用者名稱和密碼、tomcat使用者的使用者名稱和密碼:系統管理 -> 憑據(Manage Credentials)
需要tomcat的使用者名稱和密碼,是為了讓Jenkins可以遠端釋出tomcat,在tomcat的conf下tomcat-users.xml裡面配置的:tomcat遠端釋出需要修改tomcat-users.xml、context.xml(下文構建遇到的坑第5點)、manager.xml(下文構建遇到的坑第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>
進行專案資訊的配置,在配置完進行構建,tomcat必須在伺服器中是啟動狀態:
上面是tomcat熱部署,下面進行tomcat的重啟執行專案:
先安裝外掛Publish Over SSH,進行資訊配置:系統管理 -> 資訊配置 ->Publish over SSH
構建的配置前需要建立一個重啟tomcat的指令碼:vi tomcat.sh,然後賦予執行許可權chmod 777 tomcat.sh
#這裡需要加上JAVA_HOME的配置,雖然在本地的環境變數中已經配置了,但是遠端呼叫的時候,還是需要配上的,否則執行指令碼出錯。
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解壓後的檔案 如果是區域性發布這句不需要 這只是正對jenkins整個war釋出
rm -rf /home/tomcat-dev/webapps/TSISAPP* #得到程式ID 這裡也可以簡寫 如果你ps -ef|grep 專案名稱 可以帶出PID 那麼可以直接寫成這樣
#之前為什麼寫那麼長 是因為在用jenkins呼叫指令碼的時候,也會帶出jenkins呼叫指令碼的那個程式 這樣kill -9 就會killjenkins程式 導致一建釋出中斷
#所以這裡一直寫到了conf資料夾目錄
#如果不需要用到jenkins可以用下面簡潔版 得出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 "啟動專案"構建:Post Steps選擇Send files or execute commands over SSH,下面的構建後操作 -> Deploy war/ear to a container 就不需要了:
三.構建遇到的坑
如果沒有構建一個maven專案,在外掛中查詢後進行安裝:Maven Integration plugin
在構建後如果沒有Deploy war/ear to a container,在外掛中查詢後進行安裝:Deploy to container Plugin
出現下面的錯誤:
[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>
出現下面的錯誤: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>
出現下面的問題: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檔案,將檔案中對訪問的來源受限設定註釋
<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遠端連接出現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結合Jenkins外掛進行遠端釋出,在Crumb Data通過http://ip:8080/crumbIssuer/api/xml?tree=crumb#獲取填入時,出現CSRF enabled -> Missing or bad crumb data
通過搜尋網上解決方案,大多都是說開啟CSRF服務,
但還是無法解決該問題,解決辦法:點選使用者名稱 -> 設定 ->API Token -> 當前 Token,通過token名生成token,代替上面的使用者名稱和密碼,最後終於成功了