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 定時觸發
-
Build periodically: 週期性構建
-
Poll SCM: 週期性檢測,若原始碼有變化則構建
-
圖中為每六小時檢測一次
-
定時構建部署,可控制頻率
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程式碼
4. 構建環境
- 沒有關鍵配置的修改,其中Color ANSI Console Output為下載的外掛AnsiColor,可以使日誌輸出帶有顏色,詳情可檢視Jenkins 的輸出日誌也可以變得色色的
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
-
增加構建後操作步驟中選擇Deploy war/ear to a container
-
WAR/EAR files中填上所需要部署的程式包,支援
**/*.war
的形式 -
Context path配置程式相對於中介軟體環境的釋出路徑
-
本文中Containers我選擇了Tomcat 7.x,Credentials需要在tomcat裡配置上,Tomcat URL即環境的基礎地址
- 在tomcat中新增授權使用者:修改conf/tomcat-users.xml
<role rolename="manager-script"/> <user username="caozeal" password="******" roles="manager-script"/> 複製程式碼
-
只是做上邊這些配置的話,你會發現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控制檯中文輸出亂碼解決方法處理
- 解決之後,Jenkins啟動的tomcat發生亂碼
- 自動構建部署的時候,Jenkins呼叫命令啟動StartTAS.sh的時候會一直監聽啟動日誌,直到超時才斷開連結,這時候因超時而導致本次構建為黃燈,即不穩定的構建
- Jenkins構建的時候控制檯亂碼