前言
前段時間成功通過Jenkins將一個必須運行在windows上的springboot項目部署到遠程的windows7上,記錄一下以備后查。Jenkins V2.204.1 , publish-over-ssh V1.20.1. FreeSSHd V1.3.1
1. 安裝FreeSSHd
第一步,官網下載http://www.freesshd.com/?ctt=download,選擇freeSSHd.exe。安裝據說需要具有管理員權限,我使用的administrator賬戶登錄的。安裝時其他都是默認安裝選項,只有最后兩步會彈出對話框詢問是否生成私鑰和是否設置為系統服務,選擇“yes"即可,因為沒有生成私鑰,SSH服務將不能啟動,設置系統服務的話每次開機都會自動啟動SSH服務。
第二步,結束掉進程里面的freesshdservice.exe進程,然后雙擊桌面的freesshd圖標進行配置,先到User選項卡添加SSH用戶,如圖,添加默認的系統管理員帳號,authorization選擇NT authentication,這樣的話密碼就是系統管理員帳號的密碼。然后勾選shell,SFTP選項,確定添加。
第三步,選擇SSH,配置如下,然后在SFTP中設置home path,該SFTP home path就是以后通過ssh上傳文件的根目錄。
第四步,選擇Authentication選項卡,password authentication項選擇Required項,Public key authentication選擇Disabled項。如果不這樣設置連接的時候將會出現Access denied的錯誤,導致ssh客戶端不能連接。
第五步,右鍵點擊任務欄下的freesshd圖標點擊Unload退出軟件,然后重新打開freesshd軟件。打開后點擊Server status下的Click here to start 啟動SSH服務
第六步,添加22端口的防火牆放行,>> 控制面板\系統和安全\Windows 防火牆\高級設置\入站規則\新建規則:
規則類型:端口,下一步;特定本地端口:22,下一步;允許連接,下一步;何是應用該規則選擇全部,下一步;名稱隨便取,完成。
最后,可以找個測試機,利用putty使用ssh協議連接目標主機的22端口,使用administrator以及系統登錄密碼測試連接即可。
2. 配置Jenkins插件
第一步,安裝Publish Over SSH插件,Jenkins > Manage Jenkins > Manage Plugins > 找到 Publish Over SSH插件安裝重啟Jenkins .
第二步,配置Publish Over SSH插件,菜單路徑: Jenkins > Manage Jenkins > Configure System > Publish over SSH,添加一個SSH Servers,
Name隨便取,Hostname是遠程windows7的IP,Passphrase / Password填對應的administrator賬戶的密碼,在Advanced中Port指定端口22. 填寫完成之后可以使用Test Configuration測試連接是否成功。
3. 創建並啟動Jenkins Slave節點
第一步,創建節點,菜單路徑是Jenkins > Manage Jenkins > Manage Nodes > New Node:
Node name隨便取一個,選中Permanent Agent,點擊OK進入詳細頁面,其中Labels 填寫的名稱一會要用在創建作業中,注意Launch method選擇的選項:
創建完成之后,節點的狀態是離線狀態,需要在遠程windows7上啟動節點。可以在剛剛創建的節點status頁面得到指導。
第二步,在windows7上登錄到Jenkins管理界面,進入剛剛創建的節點的status頁面(如下圖),下載agent.jar到本地,然后在cmd命令運行圖中的命令,之后下面的界面將會顯示“Agent is connected.”
4. 准備啟停bat腳本
在springboot項目src\main\resources下創建兩個bat腳本,如下所示:
@echo off setlocal enabledelayedexpansion set port=8885 for /f "tokens=1-5" %%a in ('netstat -ano ^| find ":%port%"') do ( if "%%e%" == "" ( set pid=%%d ) else ( set pid=%%e ) echo !pid! taskkill /f /pid !pid! ) exit 0
@echo off set BUILD_ID=dontKillMe set JAVA_HOME=D:\jdk\jdk1.8.0_251 set classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar set path=%JAVA_HOME%\bin java -jar xxxx-0.0.1-SNAPSHOT.jar exit
第一個shudown.bat 腳本用於殺死占用8885端口的應用程序(因為這個項目部署之后是運行在8885端口),最后的exit 0是告訴Jenkins在進行作業編譯的時候是成功結束的,因為可能有時候根本沒有占用該端口的程序,腳本就會拋異常,從而Jenkins會認為任務執行失敗。
第二個start.bat 腳本就是用於執行 springboot jar,這里還可以設置使用的jdk版本,並且這樣的JAVA_HOME設置不會影響遠程主機的環境變量。注意 set BUILD_ID=dontKillMe 是告訴Jenkins在執行任務完成之后不要殺死后台進程,這很重要!!!
5. 創建Jenkins作業
我創建了三個自由風格的任務,第一個任務執行shudown.bat,第二個任務執行 從git拉取代碼maven打包之后通過Publish Over SSH將jar推送到遠程windows7主機。第三個任務執行start.bat 啟動項目,可以通過配置任務的上下游關系將它們關聯起來。注意,Restrict where this project can be run 要選擇之前創建的節點的label。
第一個作業:
Build -> Execute Windows batch command:
Command: start call "D:\xxxx\shudown.bat"
第二個作業:
省略git拉取代碼,maven打包的過程。。。
Post Steps -> Send files or execute commands over SSH > SSH Publishers -> Add Server, SSH Server 選擇之前在Publish Over SSH插件中配置的Name,然后Add Transfer Set拷貝文件至遠程windows7.
Transfer Set 中 :Source files 是要拷貝的源文件,可以使用通配符*, Remove prefix 是要移除的目錄層次結構,Remote directory 是要上傳到遠程SFTP根目錄下的那個文件夾。例如:
這樣的配置將會上傳springTest/src/main/resources目錄下面所有的bat文件到SFTP根目錄下的/bat文件夾下,如果Remove prefix 不設置,那么將會上傳到/bat/springTest/src/main/resources目錄下。
注意!!!如果有多個Transfer Set ,那么第二次操作的遠程目錄的當前目錄位於上一次Transfer Set操作的目錄下,例如上圖這種情況,如果再Add Transfer Set一個Transfer Set ,那么第二次Transfer Set 時,Remote directory 指向的其實是/bat文件夾,因此如果第二個Transfer Set 的Remote directory 為 "/" 的話,將會把第二次上傳的文件也放在遠程的/bat文件夾下。
第三個作業:
Build -> Execute Windows batch command:
Command: start call "D:\xxxx\start.bat"
注意!!!,第一個作業與第三個作業中shudown.bat和start.bat文件的路徑以及start.bat中jar文件的路徑由第二個作業實際上傳到遠程windows7的路徑為准。Command中的 start call XXXX表示要新開一個cmd窗口執行腳本,如果不使用start命令而用“cmd /c ” 則將會直接在Jenkins的任務build控制台執行,導致Jenkins無法退出,等到超時之后Jenkins會自動殺掉命令。而當新開cmd窗口之后,如果命令中不指定BUILD_ID=dontKillMe,在Jenkins執行作業成功退出之前也會殺死后台進程。
6. 運行測試
沒什么說的,依次build 這三個作業任務,發現成功在遠程windows7主機上通過cmd命令啟動了springboot項目。