Jenkins+tomcat自動發佈的熱部署/重啓及遇到的坑解決辦法

一.背景

  公司的項目一直手動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重啓

  1. 下載安裝包jenkins.war

  2. 在安裝包根路徑下,運行命令 java -jar jenkins.war --httpPort=8080(linux環境、Windows環境都一樣),運行後有一個密碼,需要登錄時使用:

  3. 打開瀏覽器進入鏈接 http://ip:8080,進入插件安裝選擇,這裏建議選擇,推薦安裝的插件,保證基本常用的功能可以使用;

  4. 選擇後,進入插件安裝頁面,有些插件安裝失敗,可以點擊到後面的再次安裝:

  5. 設置初始用戶和密碼,爲下次登錄時使用:

  6. 進入系統,安裝完成:

    1. 注意,如果還是進入不了系統,需要稍等一下,或者刷新頁面,如果還是進入不了,需要重新啓動jenkinds服務器,在啓動首頁url後面加上restart就可以了【重啓:http://ip:8080/restart】;
    2. 如果輸入默認密碼之後,一直卡住問題:
      • 在$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就解決了
  7. 進行系統系統配置設置Jenkins的訪問路徑,當然,這個路徑在創建用戶名之後會出現:

     

     

  8. 設置插件安裝源:插件管理 -> 高級,http://mirror.xmission.com/jenkins/updates/current/update-center.json

     

     

  9. 進行系統管理的全局工具配置,maven、JDK、Git的配置:

  10. 配置完後進行項目的搭建,選擇新建任務:

  11. 在進行項目信息配置前,需要一些憑證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>
  12. 進行項目信息的配置,在配置完進行構建,tomcat必須在服務器中是啓動狀態

  13. 上面是tomcat熱部署,下面進行tomcat的重啓執行項目:

    1. 先安裝插件Publish Over SSH,進行信息配置:系統管理 -> 信息配置 -> Publish over SSH
    2. 構建的配置前需要創建一個重啓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 "啓動項目"
    3. 構建:Post Steps選擇Send files or execute commands over SSH,下面的構建後操作 -> Deploy war/ear to a container 就不需要了

       

       

三.構建遇到的坑

  1. 如果沒有構建一個maven項目,在插件中查找後進行安裝:Maven Integration plugin

  2. 在構建後如果沒有Deploy war/ear to a container,在插件中查找後進行安裝:Deploy to container Plugin

  3. 出現下面的錯誤:

    [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>
  4. 出現下面的錯誤: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>
  5. 出現下面的問題: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>
  6. 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>
  7. 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,代替上面的用戶名和密碼,最後終於成功了 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章