Jenkins在Java web專案CI/CD中的簡單應用

傲然絕唳發表於2019-03-12

Jenkins

Jenkins is a self-contained, open source automation server which can be used to automate all sorts of tasks related to building, testing, and delivering or deploying software.

  • 主要介紹使用Jenkins來達到持續整合持續交付/持續部署(CICD)的一些方案和選擇,不涉及Jenkins的深入研究。
  • 實現CI/CD的方式有很多種,本文介紹的只是我這幾天一些粗略的摸索,僅供大家參考。

一、安裝

  • Jenkins的安裝方式有很多選擇,這裡不做詳細討論,我這次採用了比較熟悉的部署WAR包的方式,將其部署到tomcat上來執行。

    圖片

  • 部署完成之後訪問相應地址即可,這是會提示新建使用者,大家按照指引一步一步完成即可,不做贅述。

二、新建任務

  • Jenkins部署完成之後,接下來便要進入正題了,新建一項任務,已達到CICD的目的。

  • 首頁左側選單按選擇新建任務-》輸入任務名稱-》構建一個自由風格的軟體專案-》確定(這裡我已經建立過一個名為test的專案了)

    圖片
    圖片

  • 點選確定後進入了該專案的配置頁面,先總覽所有的配置項,共有六項:General,原始碼管理,構建觸發器,構建環境,構建,構建後操作.從字面意思上不難理解。

    • General,一些通用的資訊,本次不做重點;
    • 原始碼管理,構建的來源,git,svn,亦或是其他一些原始碼管理服務;
    • 構建觸發器,以何種規則自動觸發原始碼的構建(持續構建),若該項不做任何配置,則只能手動觸發;
    • 構建環境,本次也未做關鍵性修改;
    • 構建,以何種方式構建,maven, gradle, 亦或是其他;
    • 構建後操作,成功構建之後的一些操作,持續交付/持續部署的操作主要放到這一塊。
      圖片

接下來分別較少這幾項配置,以及用到的外掛,已完成CI/CD的目標。

1. General

  • 本次並沒有做一些關鍵的修改
    圖片

2. 原始碼管理

  • 只說明git的一些相關配置,其他的原始碼管理服務同理

    圖片

  • Repository URL: git上的原始碼地址

  • Credentials: 使用者名稱/密碼

  • Branch Specifier:指定需要構建的分支

  • 上邊這些做完後其實基本上已經可以了,之所以修改Advanced clone behaiours,是防止第一次構建時拉取原始碼超時,預設超時時間為10minutes,多次構建失敗後,我把此處修改為了20minutes,如果依舊超時,可延長此處時間,或檢查網路(點選Additional Behaviours旁邊的add,選擇Advanced clone behaiours)

    • Shallow clone,Shallow clone depth:淺拷貝,節省拷貝時間和磁碟空間

3. 構建觸發器

  • 實現觸發構建的方式主要有定時觸發、web hook觸發,這些觸發方式可以單獨使用,也可以組合使用。

3.1 定時觸發

3.2 Gitlab Hook外掛

  web hook觸發主要介紹gitlab hook外掛,接下來我們先儲存已經完成的配置,回到首頁,下載所需外掛。

圖片

  可選外掛中搜尋gitlab,勾選列表中的GitLab Plugin和Gitlab Hook Plugin, 選擇直接安裝。待安裝完成後回到首頁,點選右邊剛剛我們建立的任務,然後點選配置回到我們之前的配置頁面。

圖片

  此時發現構建觸發器中多了個選項:Build when a change is pushed to GitLab. GitLab CI Service URL: http://172.16.192.142:9081/jenkins/project/test,如果仍然沒有,嘗試重啟Jenkins之後檢視。

圖片

  圖中紅框上邊為Gitlab Web Hook處需要新增的URL,若Jenkins設定了不允許匿名使用者執行構建操作,則需要在Gitlab安全令牌處新增第二個紅圈處的Secret token。

  • Gitlab處需要增加的配置(設定-》整合,注意登入賬戶需要有相應許可權)

    圖片

  • 隨時提交,隨時構建,快速相應開發人員的操作,但需要開發人員提交程式碼的時候確保提交可用,多次commit一次push,除非緊急需要儘量在午休時間,早上上班前,晚上下班後push程式碼

  • 參考資料:Gitlab利用Webhook實現Push程式碼後的jenkins自動構建

4. 構建環境

5. 構建

  • 構建部分主要採用了maven構建,確保部署Jenkins的機器已經配置好了maven環境,maven的配置不做贅述。
    圖片

6. 構建後操作

  • 使用maven構建打包完成後,與pom.xml同級的target目錄下會生成一個war包(取決於pom.xml中的配置,對pom.xml的配置不做描述),接下來我們要做的就是將生成的war包部署到中介軟體或容器中,下面主要介紹兩個外掛,可以根據實際情況有選擇的使用,使用之前首先需要參考之前介紹的步驟下載相應外掛。

6.1 Deploy to Container外掛

  • 達到效果:構建前需保證目標中介軟體正常啟動,每次Jenkins構建時會把指定的war包自動部署到指定的伺服器上的context path中,如果目標服務已存在,首先undeploy目標服務,再把新的war包redeloy上去,已完成自動部署的功能。
  • 僅支援GlassFish,JBoss,Tomcat
    圖片
  1. 增加構建後操作步驟中選擇Deploy war/ear to a container

  2. WAR/EAR files中填上所需要部署的程式包,支援**/*.war的形式

  3. Context path配置程式相對於中介軟體環境的釋出路徑

  4. 本文中Containers我選擇了Tomcat 7.x,Credentials需要在tomcat裡配置上,Tomcat URL即環境的基礎地址

    • 在tomcat中新增授權使用者:修改conf/tomcat-users.xml
    <role rolename="manager-script"/>
    <user username="caozeal" password="******" roles="manager-script"/>
    複製程式碼

    圖片

  5. 只是做上邊這些配置的話,你會發現Jenkins的自動部署僅支援第一次,已有舊版應用執行時,自動部署會報undeploy失敗,原因是在應用執行時,tomcat會對應用的資源進行鎖定,導致無法覆蓋更新,這時需修改tomcat的另一項配置:conf/context.xml(詳情可檢視Tomcat中antiResourceLocking和antiJARLocking的作用

<Context antiJARLocking="true" antiResourceLocking="true">
複製程式碼

圖片

6.2 Publish Over SSH外掛

  • 通過SSH操作目標服務,從而傳輸檔案,執行命令已達到目的

  • 更靈活,支援各種中介軟體伺服器

  • 首先在系統設定中配置上所需連線的遠端伺服器,配置上相關配置,其中Remote Directory是訪問伺服器的基礎路徑,之後步驟能用到

    圖片

  • 然後回到任務配置繼續配置構建後操作一塊

    圖片

  • Remote directory 遠端伺服器資料夾,空即為預設的上邊步驟配置的路徑,如果此處不為空,即為相對路徑

  • Remove prefix 去除前置路徑

  • Exec command 執行指令碼,此處的指令碼比較簡單,呼叫目標中介軟體的停止與啟動

  • 需要注意的是執行指令碼的時候有個坑,讀取不到系統的環境變數,原因是此處執行指令碼的方式為non-interactive + non-login shell,不會讀取/etc/profile中的配置,此處的解決方案是採用bash執行命令,由於bash恆執行BASH_ENV中的變數,因此需要把/etc/profie賦值到BASH_ENV中,詳細解決思路參考連結

三、其他

  • 至此已經完成了從開發人員push程式碼到應用構建、部署等相關操作的基本自動流程,具體細節部分還需要繼續深入研究探索
  • 遺留問題:
    • Jenkins構建的時候控制檯亂碼
    • 自動構建部署的時候,Jenkins呼叫命令啟動StartTAS.sh的時候會一直監聽啟動日誌,直到超時才斷開連結,這時候因超時而導致本次構建為黃燈,即不穩定的構建

相關文章