背景:
實現設想:
? ? ? ?要創建自動化發布,需要準備一臺測試服務器提前安裝好java運行所需的環境,JDK版本最好和Windows開發機器上的版本一致,在Jenkins上配置將構建好的jar上傳到測試服務器上,測試服務器自動啟動構建好的jar,這些步驟只需要在Jenkins完成相關的配置即可。
一、環境準備
1、在測試機器上安裝java運行環境
#解壓
tar -zxvf OpenJDK17U-jdk_x64_linux_hotspot_17.0.8.1_1.tar.gz#配置環境變量
vim /etc/bashrc
#在文件末尾追加
JAVA_HOME=/opt/devops/java
export PATH=${JAVA_HOME}/bin:${PATH}
2、創建測試用戶
#創建用戶用于代碼測試,指定家目錄為/opt/devops/test
useradd -m test -d /opt/devops/test#設置test用戶密碼等會Jenkins的SSH認證需要用到
passwd test
二、將IDEA代碼提交到GitLab并在Jenkins上創建maven項目
步驟一:將IDEA上的代碼提交到GitLab上
參考:
CI/CD—IDEA上提交代碼到GitLab-CSDN博客
步驟二:配置Maven連接GitLab并構建jar
參考:
CI/CD—Jenkins配置Maven+GitLab自動構建jar包-CSDN博客
二、Jenkins上進行操作
1、在Jenkins上安裝Publish Over SSH插件用于SSH認證
選擇如下圖示點擊安裝即可
2、?配置Publish Over SSH插件連接測試機器
2.1、選擇系統管理 --> 系統配置?
2.2、填寫連接測試機器的信息
3、Post Steps設置
3.1、點擊之前的構建的項目
?3.2、選擇Send files or execute commands over SSH選項
3.3、配置將Jenkins上生成的jar上傳到測試服務器上的相關選項
如下正則匹配:匹配Jenkins構建生成家目錄下target目錄下的jar包?
4、執行構建測試查看Jenkins下發的原理方便后續的配置?
4.1、執行構建
4.2、觀察傳到測試服務器上jar包的目錄結構
可以看到數據傳上去之后還帶有HelloWorld/target前綴,我們想要的結構就是將jar直接傳到測試服務器家目錄下不帶有HelloWorld/target目錄,如需要實現按照如下操作進行。
5、實現指定家目錄、去掉Jenkins前綴、自動啟動jar包的步驟
5.1、在Remove prefix中填寫需要去掉的目錄前綴
5.2、在Remote directory中填寫Source files中配置的內容傳輸到家目錄的具體哪個目錄下
在Remote directory中填寫java;表示將**/target/*.jar包傳到/opt/devops/test/java目錄下
6、Exec command配置測試服務器上執行的命令
#啟動jar,因為jar包的版本會變所以使用通配符進行匹配java -jar /opt/devops/test/java/*.jar >> /opt/devops/test/java/logs/java.log &
7、測試服務器上查看Jenkins自動化發布的結果
7.1、查看前綴是否已經去掉
7.2、查看jar是否傳送到/opt/devops/test/java目錄下
7.3、查看命令行是否已經執行
7.4、對前端內容進行訪問測試
在瀏覽器上輸入:http://192.168.72.132:8989/hello,對前端進行驗證
三、Jenkins調用測試服務器上的腳本執行復雜的任務
背景:?對jar進行構建前,測試機器上可能還運行著之前程序的進程或者有一些需要其他交互的場景,所以在進行構建之前應該要先將這些運行的進程等運行處理,再進行構建部署操作這樣就確保了測試環境的穩定,在進行構建時也減少了因為環境問題導致自動發布失敗等問題。
1、測試服務器上編寫java服務啟動腳本
#!/bin/bash
TIME=$(date +"%Y-%m-%d %H:%M:%S")
JAVA_PATH=/opt/devops/test/java
JAVA_LOG=${JAVA_PATH}/logs/java.logJavaStart ()
{echo ">>>>>>>>>>>>>>>>>Java Starting:${TIME}<<<<<<<<<<<<<<<<<<<
" >> ${JAVA_LOG}PID_NUM=$(ps -ef|grep ${JAVA_PATH}/*.jar|grep java|grep -v grep|awk '{print $2}'|wc -l)if [ ${PID_NUM} -gt 0 ];thenPID=$(ps -ef|grep ${JAVA_PATH}/*.jar|grep java|grep -v grep|awk '{print $2}')echo "[WARING] 已經存在JAVA進程$PID,退出本次操作!!"echo "
[WARING] 已經存在JAVA進程:$PID,退出本次操作!!
" >> ${JAVA_LOG}exitelsejava -jar ${JAVA_PATH}/*.jar >>${JAVA_LOG} 2>>${JAVA_LOG} &sleep 3PID_NUM=$(ps -ef|grep ${JAVA_PATH}/*.jar|grep java|grep -v grep|awk '{print $2}')if [ ${PID_NUM} -eq 0 ];thenecho "[ERROR] JAVA Fail To Start!!!"echo "
[ERROR] JAVA Fail To Start!!!
" >> ${JAVA_LOG}elsePID=$(ps -ef|grep ${JAVA_PATH}/*.jar|grep java|grep -v grep|awk '{print $2}')echo "[INFO] JAVA-PID:${PID} Successfully Runing!!!"echo "[INFO] JAVA-PID:${PID} Successfully Runing!!!" >> ${JAVA_LOG}fifi
}
JavaStart
情況一:程序已經運行,執行此腳本會退出不再執啟動命令,并將輸出結果打印到日志中
情況二:java啟動命令已經執行但是服務進程不存在啟動失敗
情況三:Java服務正常啟動
2、測試服務器上編寫java服務停止腳本
#!/bin/bash
TIME=$(date +"%Y-%m-%d %H:%M:%S")
JAVA_PATH=/opt/devops/test/java
JAVA_LOG=${JAVA_PATH}/logs/java.logMain ()
{PID_NUM=$(ps -ef|grep ${JAVA_PATH}/*.jar|grep java|grep -v grep|wc -l)if [ ${PID_NUM} -gt 0 ];thenPID_NUM=$(ps -ef|grep ${JAVA_PATH}/*.jar|grep java|grep -v grep|awk '{print $2}')kill -9 ${PID_NUM}echo "[INFO] JAVA-PID:${PID_NUM} Java Has Been Stopped!!!"if [ $? -eq 0 ];thenecho "
>>>>>>>>>>>>>>>>>Java Has Been Stopped:${TIME}<<<<<<<<<<<<<<<<<<<
" >> ${JAVA_LOG}fifi
}
Main
3、在Pre Steps中添加服務停止腳本
4、在Post Steps里也添加執行啟動腳本的命令
5、測試結果
自動發布連接超時解決方法
Publish over SSH超時機制
連接超時可能是因為腳本或者文件在傳送 過程中運行超時