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按鈕。

image 36

基本的配置設定

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

image 37

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

image 38

設定登入 GitLab 的憑證

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

image 39

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

建立工作

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

image 40

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

image 41

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

image 42

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

image 43

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

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
image 44

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

image 45

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

image 46
image 47

更改 Jenkins 啟動的 port

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

image 48

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>
image 49

2.重啟Jenkins服務;

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

4.勾選“啟用安全”;

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

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

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

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

參考:

How to add Java arguments to Jenkins?

發佈留言

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


內容索引