資源準(zhǔn)備
創(chuàng)新互聯(lián)建站長期為上千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為昌吉企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計,昌吉網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。1. 穩(wěn)定運行的K8S集群一套(沒有可使用Rancher快速部署一個)
2. Jenkins master一臺
3. Jenkins pipeline基礎(chǔ)知識:見 鏈接jenkinspipeline
傳統(tǒng)Jenkins使用中暴露的問題
1. 每個業(yè)務(wù)團隊使用的編譯環(huán)境不統(tǒng)一,需要準(zhǔn)備大量的slave節(jié)點
2. Slave很多,空閑期(如夜里)資源浪費
3. 雖然Slave很多,但高峰期隊列等待構(gòu)建任務(wù)依然在排隊,資源搶占嚴(yán)重
4. 構(gòu)建任務(wù)多,workspace空間不足
5. 性能瓶頸,偶爾有slave節(jié)點內(nèi)存泄漏問題
將Jenkins的slave節(jié)點部署到K8S的原理
K8S有pod的概念,一個pod內(nèi)可以有多個container。通過每次構(gòu)建時創(chuàng)建一個新的pod,掛載一個容器的slave節(jié)點的方式構(gòu)建。構(gòu)建后將構(gòu)建產(chǎn)物及結(jié)果報告輸出,并在構(gòu)建后銷毀pod。
方案的優(yōu)勢
1. 共享k8s集群資源,按需分配資源,不會出現(xiàn)slave機由于資源限制或者executor限制導(dǎo)致的資源搶占,構(gòu)建任務(wù)排隊現(xiàn)象。
2. 空閑期釋放掉在k8s集群上申請的資源 ,其他團隊可以復(fù)用該資源。如大數(shù)據(jù)團隊、AI團隊可以定時在夜里申請k8s資源計算模型,跑spark任務(wù)等。
3. 每次構(gòu)建都是新環(huán)境,內(nèi)存泄漏等問題不會互相影響,workspace空間不會共享。
4. 可根據(jù)業(yè)務(wù)需求,靈活的啟用不同環(huán)境的鏡像用于構(gòu)建。如jdk版本、maven版本、不同語言的編譯環(huán)境等,都可以做到按需創(chuàng)建。
具體步驟
1. Jenkins master下載插件
點擊系統(tǒng)管理 ——> 插件管理,選擇要安裝的插件Kubernetes plugin安裝
2. 配置K8S serverapi地址
在 點擊系統(tǒng)管理 ——> 系統(tǒng)設(shè)置 ——> Add a new cloud ——> 選擇kubernetes,填寫相關(guān)信息
為了所有構(gòu)建步驟由pipeline代碼管理比較靈活,所以這里只配置k8s集群地址,不設(shè)置pod模版
3. 創(chuàng)建pipeline任務(wù)
podTemplate(label: 'jenkins-slave', cloud: 'kubernetes'){
node('jenkins-slave') {
stage('git-checkout') {
sh 'pwd'
}
}
}
4. 簡單功能驗證
執(zhí)行流水線,可以看到j(luò)enkins master自動在k8s集群上拉起一個slave節(jié)點,并執(zhí)行了stage內(nèi)的命令
5. 準(zhǔn)備構(gòu)建環(huán)境鏡像
因為默認(rèn)啟動的jenkins slave節(jié)點只具備基礎(chǔ)功能,不具備類似maven這種構(gòu)建環(huán)境。所以我們需要準(zhǔn)備不同語言所需要的攜帶不同構(gòu)建環(huán)境的鏡像。
可以通過docker search需要對應(yīng)需求的鏡像
也可以自己做鏡像,具體dockerfile寫法參考如下:
https://github.com/jenkinsci/docker-jnlp-slave
6. 編寫構(gòu)建pipeline
語法參見jenkins語法生成器中podTemplate,可自行生成相關(guān)流水線語法
7.收集構(gòu)建過程數(shù)據(jù)
由于構(gòu)建環(huán)境鏡像在job執(zhí)行成功后會被銷毀,所以收集過程中的數(shù)據(jù)成為這種方案中最關(guān)鍵的一個步驟。下述三個點是我們一定需要收集的信息:
l 構(gòu)建產(chǎn)物
所有構(gòu)建產(chǎn)物應(yīng)該交給制品庫統(tǒng)一管理,pod中的slave節(jié)點機構(gòu)建后即可將制品傳輸?shù)街破穾熘?,完成后pod銷毀
l 構(gòu)建環(huán)境變量
由于構(gòu)建環(huán)境已經(jīng)銷毀,所以需要通過統(tǒng)一平臺管理每次構(gòu)建時對應(yīng)的構(gòu)建環(huán)境,如jdk版本,maven版本等,所以該環(huán)境最好交由制品庫管理,推薦使用Artifactory記錄構(gòu)建過程。
l 構(gòu)建元數(shù)據(jù)
構(gòu)建過程中會執(zhí)行一些如代碼靜態(tài)掃描,單元測試等,我們把這種結(jié)果數(shù)據(jù)稱之為軟件生命周期的元數(shù)據(jù),同樣這些結(jié)果會隨著構(gòu)建環(huán)境的銷毀一起丟失,我們需要通過api收集結(jié)果數(shù)據(jù),并與本次構(gòu)建過程或構(gòu)建產(chǎn)物相關(guān)聯(lián)。建議使用Artifactory管理構(gòu)建過程中的元數(shù)據(jù)。
最佳實踐
1.統(tǒng)一管理構(gòu)建環(huán)境
由運維維護K8S及Jenkins服務(wù)穩(wěn)定,并按需求制作攜帶不同構(gòu)建環(huán)境的jenkins slave鏡像。
2.由持續(xù)集成團隊統(tǒng)一編寫、統(tǒng)一管理pipeline模版,將模版存儲在git倉庫中,并提供詳細說明文檔,指導(dǎo)開發(fā)人員如何調(diào)用,如何傳參。
3.業(yè)務(wù)部門通過jenkins共享庫特性調(diào)用git倉庫中的構(gòu)建模版,傳入所需的構(gòu)建環(huán)境和源碼路徑以及其他變量進行構(gòu)建任務(wù)設(shè)置
4. 持續(xù)集成團隊需要在構(gòu)建模版中定義內(nèi)容收集元數(shù)據(jù),收集環(huán)境變量,設(shè)置質(zhì)量關(guān)卡,做到讓開發(fā)無感知的情況下,完成所有信息的收集。這樣就可以做到,開發(fā)人員無需學(xué)習(xí)復(fù)雜的groovy語法編寫pipeline;管理人員可以標(biāo)準(zhǔn)化構(gòu)建流程,并收集所有質(zhì)量關(guān)卡數(shù)據(jù),并會寫到統(tǒng)一制品倉庫管理。