之前:
1、Jenkins拉取Gitlab源碼。通過git@ip方式成功,通過http://ip方式,沒有成功
通過git@ip方式成功
- 重點是公鑰配置。參考:https://blog.csdn.net/qffj/article/details/26456357
- 注意:公司的VPN方式,不支持git方式,提提22端口拒絕,就得到公司內網纔可以
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
重點:
- 需要Sonar服務器。暫時用公司的10.135.102.85:9000
- 配置自己的工程,即Pom文件,詳見前https://mp.csdn.net/console/editor/html/104306635
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