Jenkins 自動部署 Spring Boot 並自動起動

當程式存放在 程式版本控制 on GitHub or Gitee or Bitbucket or GitLab 有版本更新時,使用 Jenkins 可以減少人為手工的錯誤,並讓它自動部署及自動起動。這篇文章將 Jenkins 建置在 windows 10 作為說明。

下載 Jenkins 安裝檔

我們可以到以下連結下載適合的 OS 環境版本安裝,我們選擇熟悉的Windows環境。細部安裝步驟可以參考: Jenkins Master Server安裝

Jenkins – https://jenkins.io/download/
Java – OpenJDK: https://developers.redhat.com/products/openjdk/download
Git Tool – https://git-scm.com/download/win
Gradle Tool –  gradle-6.5

安裝 Jenkins 完後在幾分鐘後重新整理網頁,就過出現以下內容,我們可以依照指示在指定目錄找到初始管理員密碼,取得密碼後在下面輸入,接著按下Continue按鈕。

基本的配置設定

管理 Jenkins ->組態設定 : 設定遠端連到系統的網址,以及系統管理員的 email

管理 Jenkins -> Global Tool Configuration : 將 JDKGitGradle 的路徑設好

設定登入 GitLab 的憑證

Jenkins -> Credentials -> System -> Global credentials (unrestricted)

若不知怎麼設定  Personal Access Tokens ,可以參考: 程式版本控制 on GitHub or Gitee or Bitbucket or GitLab

建立工作

選擇 建置 Free-Style 軟體專案: Start Myapps

在 原始碼管理 中輸入 git 的 Repository URL ,及選擇剛建立的憑證,至於 Branches to build ,可以輸入 Repository 中的分支來作佈署

在建置的區段,分別選擇 Invoke Gradle Script, 執行 Windows 批次指令

選擇 Invoke Gradle Script 後,會出現相對應的Gradle 區段,選擇 Global Tool Configuration 的 gradle-6.3,專案編譯的指令為 gradlew build

然後把編譯完成的檔案搬到要執行的目錄下

copy .\build\libs\myapps.jar D:\Progs\services\myapps.jar

先停止 xampp

@echo off
echo "xampp stop"
setlocal enabledelayedexpansion
d:
cd D:\xampp
start xampp_stop.exe
exit

kill javaw 的執行緒

啟動前,先將現在正執行的系統中止,這裡是查詢 javaw 的執行緒,有查到的就 kill

@echo off
setlocal enabledelayedexpansion
set prog=javaw
echo "will kill program: %prog% in process"
for /f "tokens=1-5" %%a in ('tasklist ^| find "%prog%"') do (
    if "%%e%" == "" (
        set pid=%%b
    ) else (
         set pid=%%b
    )
    echo !pid!
)
if NOT "!pid!" == "" (
   taskkill /f /pid !pid!
)

重新啟動 xampp

確定都停止後,重新啟動 xampp

@echo off
echo "xampp start"
set BUILD_ID=DontKillMe
d:
cd D:\xampp
start xampp_start.exe
exit

以 javaw 啟動 spring boot

@echo off
set BUILD_ID=DontKillMe
d:
cd D:\Progs\services
start javaw -jar D:\Progs\services\myapps.jar
exit

工作建置的過程可以從 Console Output 中查看

kill port 的執行緒

使用 java 的指令來啟動時, 若以上面用的 tasklist 來找 java process 執行緒, 則會連同 jenkins 本身的執行緒也被 kill ,所以改為找 port 來找 pid ,再來 kill 。

@echo off
setlocal enabledelayedexpansion
set port=10443
echo "will kill port: %port% in process"
for /f "tokens=1-5" %%a in ('netstat -nao ^| find "%port%"') do (
    if "%%e%" == "" (
        set pid=%%e
    ) else (
         set pid=%%e
    )
    echo !pid!
)
if NOT "!pid!" == "" (
   taskkill /f /pid !pid!
)

以 java 啟動 spring boot

@echo off
set BUILD_ID=DontKillMe
d:
cd D:\Progs\services
start /B java -jar D:\Progs\services\guspring.jar > D:\apps\logs\guspring.log 2>&1

註: 在 windows 中啟用時使用 start /B ,則 log 會同步顯示在檔案中,有助於偵錯( Debug ) 使用。

使用 email template

  1. 在網路上有找到一個不錯的Email Template,也可以自行設計,儲存到Jenkins目錄中,路徑為%ProgramFiles(x86)%\Jenkins\email-templates\,檔名這理存成 jenkins-email-template.jelly
    註: 如果沒有email-templates,要自己新增資料夾
  2. 在 管理 Jenkins -> 設定系統 -> 擴充電子郵件通知
    在 預設內容:這邊請設定 ${JELLY_SCRIPT,template="jenkins-email-template.jelly"},也就是上一個步驟存放的email template檔名,要用這個檔來產生電子郵件內容,這樣就可以了
  3. Trigger
    在建立好的工作Start Myapps中,在可編式電子郵件通知 的 Advanced Settings,要設定觸發條件(Failure/Success or Always),請依照自身需求設定觸發條件,這樣就完成了

防火牆設定

本機以外的電腦若無法連入時,請檢查防火牆,並打開必要的 port

更改 Jenkins 啟動的 port

修改 C:\Program Files (x86)\Jenkins\jenkins.xml 裡的 port, 再重啟即可

How to add Java arguments to Jenkins? 如何修改啟動參數

在 C:\Program Files (x86)\Jenkins\jenkins.xml 裡,將啟動參數放在 <arguments>...</arguments> 裡,記得參數前要加 -D 。

<service>
  <id>Jenkins</id>
  <name>Jenkins</name>
  <description>This service runs Jenkins automation server.</description>
  <env name="JENKINS_HOME" value="%BASE%"/>
  <!--
    if you'd like to run Jenkins with a specific version of Java, specify a full path to java.exe.
    The following value assumes that you have java in your PATH.
  -->
  <executable>%BASE%\jre\bin\java</executable>
  <arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -Dmail.smtp.starttls.enable=true -Dmail.smtp.ssl.checkserveridentity=false -Dmail.smtp.ssl.trust=your.domain.com -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war"</arguments>
  <!--
    interactive flag causes the empty black Java window to be displayed.
    I'm still debugging this.
  <interactive />
  -->
  <logmode>rotate</logmode>

  <onfailure action="restart" />
  
  <!-- 
    In the case WinSW gets terminated and leaks the process, we want to abort
    these runaway JAR processes on startup to prevent corruption of JENKINS_HOME.
    So this extension is enabled by default.
  -->
  <extensions>
    <!-- This is a sample configuration for the RunawayProcessKiller extension. -->
    <extension enabled="true" 
               className="winsw.Plugins.RunawayProcessKiller.RunawayProcessKillerExtension"
               id="killOnStartup">
      <pidfile>%BASE%\jenkins.pid</pidfile>
      <stopTimeout>10000</stopTimeout>
      <stopParentFirst>false</stopParentFirst>
    </extension>
  </extensions>
  
  <!-- See the referenced examples for more options -->
  
</service>

Jenkins admin 密碼忘記解決方式

1. 將 C:\Program Files (x86)\Jenkins\config.xml 裡的文字區段(如下)移除後存檔

<useSecurity>true</useSecurity>
 <authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">
   <denyAnonymousReadAccess>true</denyAnonymousReadAccess>
 </authorizationStrategy>
 <securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
   <disableSignup>true</disableSignup>
   <enableCaptcha>false</enableCaptcha>
 </securityRealm>

2.重啟Jenkins服務;

3.進入首頁>“系統管理”>“Configure Global Security”;

4.勾選“啟用安全”;

5.點選“Jenkins專有使用者資料庫”,並點選“儲存”;

6.重新點選首頁>“系統管理”,發現此時出現“管理使用者”;

7.點選進入展示“使用者列表”;

8.點選右側進入修改密碼頁面,修改後即可重新登入。

參考:

How to add Java arguments to Jenkins?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *