基于Docker+Jenkins+Git的CI/CD實戰
與上一篇随筆:基于 Jenkins+Docker+Git 的CI流程初探 有所不同,該内容更偏向于實際業務的基礎需求。
有幾點需要注意:
該實戰中沒有涉及到鏡像倉庫,是以略去了鏡像推送階段,可以參考基于 Jenkins+Docker+Git 的CI流程初探。
與上一篇對比,該實戰是基于外網伺服器進行的,是以加入了Jenkins自動觸發拉取代碼以及發送建構報告功能。
實戰中的Jenkins也是基于docker運作,對于Jenkins資料持久化是通過VOLUME實作的。
不再進行自建git代碼倉庫,選擇使用Gitee管理代碼。
實驗環境均已提前準備完畢。
啟動後設定使用者與密碼
名稱:java-devops-demo
建立流水線
選擇儲存
Jenkins流水線工作流程:
先定義一個流水線項目,指定項目的git位置
流水線啟動
a.先去git位置自動拉取代碼
b.解析拉取代碼裡面的Jenkinsfile檔案
c.按照Jenkinsfile指定的流水線開始加工項目
Jenkins重要的點
1) jenkins的家目錄 /var/jenkins_home 已經被我們docker外部挂載了/var/lib/docker/volumes/jenkins-data/_data
2)WORKSPACE(工作空間)=/var/jenkins_home/workspace/java-devops-demo每一個流水線項目,占用一個檔案夾位置
3)BUILD_NUMBER=5;目前第幾次建構
4)WORKSPACE_TMP(臨時目錄)=/var/jenkins_home/workspace/java-devops-demo@tmp
Jenkinsfile部分是逐漸測試,按階段寫成。
Dockerfile:
Jenkinsfile與Dockerfile均位于java-devops-jemo目錄下,由Jenkins從git倉庫拉取。
期望效果: 遠端的github代碼送出了,jenkins流水線自動觸發建構。
實作條件:
保證jenkins所在主機能被遠端通路。
jenkins中遠端觸發需要權限,我們應該使用使用者進行授權。
配置gitee,webhook進行觸發。
實作過程:
1)進入流水線配置頁,填入身份驗證令牌
2)遠端建構即使配置了gitee/github 的webhook,預設會403。我們應該使用使用者進行授權
a.建立一個使用者 (主界面>管理Jenkins>管理user>建立使用者)
b.建立使用者後一定要重新登陸激活一次,進入使用者清單>點選目前使用者名>設定
c.生成一個apitoken (生成後立即複制,隻出現一次)
3)碼雲端配置WebHooks,進入碼雲對應代碼倉庫-配置-WebHooks-添加WebHook
URL配置格式:http://dk:使用者dk的apitoken@主機的公網ip:8080/job/java-devops-demo/build?token=身份驗證令牌
添加成功後可測試與Jenkins主機的連通性。
至此,當本地修改代碼,git push送出到gitee/github後,Jenkins就能夠自動建構,建構成功即可檢視前端頁面的變化。
(使用自定義agent的方式引入maven環境,利用多階段建構不同場景下的複雜環境)
1)安裝docker pipeline插件
2)自定義agent(在stages内部)
3)配置maven加速(配置國内阿裡雲)
把Maven的配置檔案放在jenkins-data裡面的某個位置。預設所有的可變配置項都推薦放在jenkins-home的位置,增強移植性。
4)緩存必要jar包,下次建構無需下載下傳
注:jenkins不配置任何環境的情況下, 僅适用docker相容所有場景。
臨時容器導緻的問題(每個stage都會回到預設workspace,臨時容器産生的打包資料不能被利用)
第一次檢出代碼,預設在 /var/jenkins_home/workspace/【java-devops-demo】
使用docker臨時agent的時候,每一個臨時容器運作又配置設定臨時目錄 /var/jenkins_home/workspace/java-devops-demo@2;預設就是workspace/java-devops-demo 的内容
在臨時容器裡面 運作的mvn package指令,會在 /var/jenkins_home/workspace/java-devops-demo@2 進行工作
package到了 /var/jenkins_home/workspace/java-devops-demo@2 位置
進入下一步(stage)進行打包鏡像,又會回到 /var/jenkins_home/workspace/【java-devops-demo】(預設workspace)這個位置
這個位置沒有運作過 mvn clean package ,是以沒有target。 預設的 工作目錄 沒有 target
解決方法:在臨時容器内部切換到Jenkins的預設工作目錄,再進行maven打包。
使用郵件擴充插件:Email Extension Plugin-2.71 (對于每個stage執行的任務成功與否可以通過後置執行post來進行感覺)
系統管理>系統配置>配置管理者郵箱(系統管理者郵件位址)、SMTP服務相關及其他

下圖Use SMTP Authentication部分在高版本插件中已不再支援
填寫完畢,可以通過發送測試郵件進行測試。
上圖的郵件使用者的授權碼需要配置郵件發送的認證權限資訊
登入自己郵箱,開啟POP3/SMTP郵件服務
擷取到自己的授權碼(tlqhksolsmeodjad)
配置并測試好郵件發送即可
郵件模闆内容見Jenkinsfile中報告推送階段。
至此,開發送出代碼後,将自動觸發建構過程,建構結束後發送此次建構郵件報告如下: