Jenkins推送Jar包至遠程主機

之前:

1、Jenkins拉取Gitlab源碼。通過git@ip方式成功,通過http://ip方式,沒有成功

通過git@ip方式成功

2、觸發遠程構建。這個不是重點,沒啥太大用

3、構建。我理解就是把源碼從GitLab上拉到本地工作區,再通過執行命令編譯成Jar包。關鍵看Goals and options的內容

重點:需要安裝Maven插件,如圖:

否則,創建工程時,在Pre Steps之後,沒有Build選項。Goals and options:clean pmd:pmd checkstyle:checkstyle findbugs:findbugs package -DskipTests。這是原來李老師寫的,新建項目這麼寫,運行沒有問題

坑:當編譯到第2個Moudle,即tds-common時,提示個:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project tds-common: Fatal error compiling: java.lang.ExceptionInInitializerError: com.sun.tools.javac.code.TypeTags -> [Help 1]
截圖如下:

百度,競然說是lombok版本低,與高版本的JDK不兼容。一查JDK,果然是版本較高:jdk-11.0.1。於是下載JDK1.8,裝之。再在Jenkins上設置全局工具設置中,JDK那裏,於增加一個JDK版本,再在項目中指定JDK(以前沒注意,如果只有一個,好像沒有JDK選項),果然過去了。感謝:快樂崇拜234   https://blog.csdn.net/liubenlong007/article/details/86139598

(一度懷疑是阿里的Maven的遠程鏡像問題——之前把鏡像改成阿里了vim /opt/maven3.6.0/conf/settings.xml)

 

4、代碼質量檢查。即用SonarQube。這裏在公司環境沒有成功,原因是項目需要下載支持包,而公司網不允許上外網。改爲直接在個人的IDEA環境中集成Sonar

重點:

5、直接構建並測試運行狀況。

Build選項卡,Goals and options:(Maven命令參數使用,感謝:https://www.cnblogs.com/hiver/p/7850954

  • clean package -DskipTests    這時,主項目和所有子項目,全部打包,分別在自己的項目錄下,均生成Target目錄,運行其中的一個子項目(如:Java tds-sal.jar -jar ),通過Postman運行成功。但是這個項目依賴其它多個項目,如Api,Model等,那說明,Package後的Jar包,已經將需要依賴都打裏了。將這個Jar包,單獨考到102.85上,運行,通過Postman仍能正常運行,證實確是如此。
  • clean package -pl com.tds:tds-clm -am -DskipTests,這時,只打包(因爲用的是Package,如果用Install,則是安裝)了tds-clm及其依賴包(目前有tds-model tds-api)。

6、將編譯後的代碼佈署到遠程主機。這是本節要學的東東

  • 方式一:Send files or execute commands over SSH

這裏差點沒折騰死我,終於摸索出源文件是啥,前綴是啥了:

Source files:有特定格式,點下右側門的?號就差不多知道了。

Remove prefix:表示考到目標服務器的位置後,文件名中要去掉的內容。我之前這裏是空,結果發佈後,Source files中設置的所有目錄層級,全部考到目標服務器的目標目錄裏了

Remote directory:一定要注意,這個目錄,是在系統設置中的遠程目錄的基礎上的!即,系統設置>Publish over SSH>SSH Servers>Remote Directory的內容,如圖:

Exec command:這裏好理解,可以寫命令,也可以Shell腳本,要是腳本的話,需要指定目錄(我是這樣寫的)

完整設置截圖:

折騰一小天,這個終於算是成功了!

小結:這種方式不靈活,只能執行發佈到遠端,再執行些指令,不能提前刪除舊文件

  • 方式二:Exceute shell script on remote host using ssh

MD,我增加上SSH sites,就出這個錯誤,也許是和方式一,在系統設置中有衝突了,只能用一種嗎?發現不是的,可以忽略這個提示,在下面的命令行中盡定寫就好了,能保存的。


第一個:Exceute shell script on remote host using ssh

SSH Site :[email protected]

Command:

echo "Stop service and rm files.....begin"
/usr/local/tds-msv/tds-server.sh stop ${qmModule}
rm -rf /usr/local/tds-msv/${qmModule}.jar 
echo "Stop service and rm files......end"

這裏:我的tds-server.sh腳本,在服務器上直接運行,有提示,但可以成功,但是在Jenkins上Build中,就會出現 exit staus -1,經倪工指點:需將tds-server.sh本身的進程號也排除,問題解決!感謝倪工!


再增加一個:Exceute shell

echo "scp files......begin"
scp ${WORKSPACE}/target/${qmModule}.jar [email protected]:/usr/local/tds-msv/${qmModule}.jar
echo "scp files......end"


第二個:Exceute shell script on remote host using ssh

SSH Site :[email protected]

Command:

echo "Start service and rm files.....begin"
/usr/local/tds-msv/tds-server.sh start ${qmModule}
echo "Start service and rm files.....end"


tds-server.sh,內容如下(感謝:https://blog.csdn.net/l1028386804/article/details/78669778?utm_source=blogxgwz2


#!/bin/sh

## java env
#export JAVA_HOME=/usr/local/jdk/jdk1.8.0_144
#102.85的JDK

##下面直接用java命令,而不指定Java位置 ZHCH 2020-03-12
#export JAVA_HOME=/usr
#export JRE_HOME=$JAVA_HOME/jre

## service name
APP_NAME=$2

#SERVICE_DIR=/usr/local/tds-msv/$APP_NAME
SERVICE_DIR=/usr/local/tdsapp/tdsmsv/$APP_NAME
SERVICE_NAME=$APP_NAME
SERVICE_LOG=$APP_NAME\.log
JAR_NAME=$SERVICE_NAME\.jar
PID=$SERVICE_NAME\.pid

cd $SERVICE_DIR

case "$1" in

    start)

    ## 起動參數
    if [ ! -n "$3" ]; then
      echo "未指定起動參數,默認爲test"
      APP_ACTION="test"
    else
      APP_ACTION=$3
    fi

#        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >>$SERVICE_LOG 2>&1 &
        nohup java -Xms256m -Xmx1024m -jar $JAR_NAME --spring.profiles.active=$APP_ACTION >>$SERVICE_LOG 2>&1 &
        echo $! > $SERVICE_DIR/$PID
        echo "=== start $SERVICE_NAME"
        ;;

    stop)
       # echo "$SERVICE_DIR/$PID"    
    if [ -f "$SERVICE_DIR/$PID" ]; then
          kill `cat $SERVICE_DIR/$PID`
          rm -rf $SERVICE_DIR/$PID
          echo "=== stop $SERVICE_NAME"
        else
          echo "$SERVICE_NAME is not running"
    fi

        sleep 5
        ##
        P_ID=`ps -ef | grep -w $SERVICE_NAME |grep -v 'tds-server'|grep -v "grep" | awk '{print $2}'`
    echo "$P_ID"

        if [ "$P_ID" == "" ] || [ "$P_ID" = "0" ]; then
            echo "=== $SERVICE_NAME process not exists or stop success"
        else
            echo "=== $SERVICE_NAME process pid is:$P_ID"
            echo "=== begin kill $SERVICE_NAME process, pid is:$P_ID"
            kill -9 $P_ID
        fi
        ;;

    restart)
        $0 stop
        sleep 2
        $0 start
        echo "=== restart $SERVICE_NAME"
        ;;

    *)
        ## restart
        $0 stop
        sleep 2
        $0 start
        ;;

esac
exit 0


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章