關於構建結束后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