jenkins自動化部署項目7 -- 新建job(將服務代碼部署在windows上)


關於構建結束后jenkins會kill所有衍生子進程的官方解決方案:https://wiki.jenkins.io/display/JENKINS/Spawning+processes+from+build

jenkins(windows)----------->應用服務(windows):2個服務部署在一台windows機器上 

公司項目是前后端分離的。web前端+java后台服務,因此項目分為兩類

1.前端使用tomacat啟動服務:只有一些靜態文件,因此新建項目的時候直接選擇【構建一個自由風格的軟件項目】

<1>項目名稱根據需要填寫,git源碼配置如圖,我點擊add-jenkins后選擇的是用戶名和密碼的方式去下載代碼(kind處選擇username and password,然后填上用戶名和密碼即可)

 

<2>構建:先關掉tomcat,再重啟tomcat

ps:此處遇到的坑是,構建完成之后tomcat會隨着構建結束被jenkins殺掉進程,為了解決這個問題,需要做下圖的設置

另外,我在命令行里沒有將jenkins下載的代碼復制到tomcat的webapps目錄下,是因為我在tomcat的配置文件里加了一行,server.xml

<Context path="" docBase="E:\Jenkins\workspace\sr_center\webapp"  />

這里的命令可以根據需要做調整,只要注意以上標藍的一點即可(sr_utils.bat腳本內容見下面java項目構建步驟)

 

 

2.后端通過java -jar命令行的方式啟動服務

<1>新建的時候選擇構建一個MAVEN項目(需要強調的是項目的pom.xml文件要能正常使用,我們的項目一開始是用eclipse啟動的,后面更改啟動服務方式時遇到一些問題)

源碼管理如上面前端,構建觸發器看業務需要自由選擇,

<2>build:使用默認的pom.xml即可,不需要更改

(如果項目使用的一些jar包在maven中央倉庫找不到。或者測試環境無法訪問外網,無法在線下載一些jar包,有2點要注意:1.Goals and options處可以配置本地倉庫路徑;2.要提前手工下載安裝一些jar包到本地maven倉庫。具體操作方法見:https://www.cnblogs.com/yy-cola/p/9664598.html)

下圖步驟是:殺掉要正在運行的此項目進程 ------ 刪掉項目jar包(我特意新建了一個目錄存放jar包,在此啟動服務) ------ 將新下載打包的jar包復制到存放項目的目錄 ------以后台啟動的方式啟動服務

殺進程的sr_utils.bat腳本是我自己寫了之后放在jenkins目錄下使用的:通過項目端口找到項目進程,找到則殺掉進程,找不到則忽略。腳本內容如下:

::demo
@echo off
::延遲環境變量擴展
setlocal enabledelayedexpansion
for /f "delims=  tokens=1" %%i in ('netstat -aon ^| findstr %1') do (
set a=%%i)
::判斷服務是否已經啟動,如果啟動則殺掉進程
if defined a (taskkill /F /pid "!a:~71,5!") else (echo Service does not exist)
::等待你按任意鍵結束
pause>nul
::執行時后面帶上端口即可

 

 

 

 ps:這里需要注意的是,如果將所有命令都寫在一個步驟里,執行完一個bat腳本之后,后面的命令將不會被執行,因此這個地方我分了兩步。

 

問題:

最近在使用jenkins部署服務過程中遇到一個問題,那就是通過start javaw -jar 以后台啟動的方式啟動服務,如果服務沒有成功啟動,這個時候jenkins還是顯示構建成功,因為對於jenkins來說這個命令本身是成功執行完成了的,jenkins不會繼續判斷服務是否真的啟動成功構建就結束了。

解決方案:

jenkins認為非零返回就是job失敗

在啟動服務之后新增一步檢查服務是否真的成功啟動的步驟,即通過端口查找該服務的進程,如果找到了在返回給jenkins 0表示服務正常啟動,如果沒找到該服務的進程,則返回給jenkins 1.具體的bat腳本如下:

@echo off
setlocal enabledelayedexpansion
for /f "delims=  tokens=1" %%i in ('netstat -aon ^| findstr %1') do (
set a=%%i
goto js
)
:js
::判斷服務是否已經啟動,如果啟動則返回給jenkins信號0
if defined a (exit 0) else (exit 1)
pause>nul
::在執行bat腳本的時候在命令后加上參數也就是端口即可

另外在啟動服務的命令執行之后,需要等待幾秒再去判斷進程是否存在。windows和linux不一樣沒有類似sleep這樣的命令,查閱資料之后我用這一句實現

等待10秒
ping
/n 10 127.1 >nul

 

部署java后端項目的時候可能會遇到一個問題,項目引用的jar包在maven中央倉庫找不到,解決方法可以參考我另一篇隨筆:

https://www.cnblogs.com/yy-cola/p/9664598.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM