1分鐘將你的jenkins構建環境遷移到K8S叢集上

JFrog傑蛙科技發表於2019-12-19

資源準備

1. 穩定執行的K8S叢集一套(沒有可使用Rancher快速部署一個)

2. Jenkins master一臺

3. Jenkins pipeline基礎知識:見   連結jenkinspipeline

 

傳統Jenkins使用中暴露的問題

1. 每個業務團隊使用的編譯環境不統一,需要準備大量的slave節點

2. Slave很多,空閒期(如夜裡)資源浪費

3. 雖然Slave很多,但高峰期佇列等待構建任務依然在排隊,資源搶佔嚴重

4. 構建任務多,workspace空間不足

5. 效能瓶頸,偶爾有slave節點記憶體洩漏問題

 

將Jenkins的slave節點部署到K8S的原理

K8S有pod的概念,一個pod內可以有多個container。透過每次構建時建立一個新的pod,掛載一個容器的slave節點的方式構建。構建後將構建產物及結果報告輸出,並在構建後銷燬pod。

 

方案的優勢

1. 共享k8s叢集資源,按需分配資源,不會出現slave機由於資源限制或者executor限制導致的資源搶佔,構建任務排隊現象。

2. 空閒期釋放掉在k8s叢集上申請的資源 ,其他團隊可以複用該資源。如大資料團隊、AI團隊可以定時在夜裡申請k8s資源計算模型,跑spark任務等。

3. 每次構建都是新環境,記憶體洩漏等問題不會互相影響,workspace空間不會共享。

4. 可根據業務需求,靈活的啟用不同環境的映象用於構建。如jdk版本、maven版本、不同語言的編譯環境等,都可以做到按需建立。

 

 

具體步驟

1. Jenkins master下載外掛

點選系統管理 ——> 外掛管理,選擇要安裝的外掛Kubernetes plugin安裝



2. 配置K8S serverapi地址

點選系統管理 ——> 系統設定 ——> Add a new cloud ——> 選擇kubernetes,填寫相關資訊


為了所有構建步驟由pipeline程式碼管理比較靈活,所以這裡只配置k8s叢集地址,不設定pod模版



3. 建立pipeline任務


podTemplate(label: 'jenkins-slave', cloud: 'kubernetes'){

    node('jenkins-slave') {

        stage('git-checkout') {

                sh 'pwd'

        }

    }

}


4. 簡單功能驗證

執行流水線,可以看到jenkins master自動在k8s叢集上拉起一個slave節點,並執行了stage內的命令

5. 準備構建環境映象

因為預設啟動的jenkins slave節點只具備基礎功能,不具備類似maven這種構建環境。所以我們需要準備不同語言所需要的攜帶不同構建環境的映象。

可以透過docker search需要對應需求的映象

也可以自己做映象,具體dockerfile寫法參考如下:

 

6. 編寫構建pipeline

語法參見jenkins語法生成器中podTemplate,可自行生成相關流水線語法


7.收集構建過程資料

由於構建環境映象在job執行成功後會被銷燬,所以收集過程中的資料成為這種方案中最關鍵的一個步驟。下述三個點是我們一定需要收集的資訊:

l   構建產物

所有構建產物應該交給製品庫統一管理,pod中的slave節點機構建後即可將製品傳輸到製品庫中,完成後pod銷燬

l   構建環境變數

由於構建環境已經銷燬,所以需要透過統一平臺管理每次構建時對應的構建環境,如jdk版本,maven版本等,所以該環境最好交由製品庫管理,推薦使用Artifactory記錄構建過程。

l   構建後設資料

構建過程中會執行一些如程式碼靜態掃描,單元測試等,我們把這種結果資料稱之為軟體生命週期的後設資料,同樣這些結果會隨著構建環境的銷燬一起丟失,我們需要透過api收集結果資料,並與本次構建過程或構建產物相關聯。建議使用Artifactory管理構建過程中的後設資料。



最佳實踐

1.統一管理構建環境

由運維維護K8S及Jenkins服務穩定,並按需求製作攜帶不同構建環境的jenkins slave映象。


2.由持續整合團隊統一編寫、統一管理pipeline模版,將模版儲存在git倉庫中,並提供詳細說明文件,指導開發人員如何呼叫,如何傳參。


3.業務部門透過jenkins共享庫特性呼叫git倉庫中的構建模版,傳入所需的構建環境和原始碼路徑以及其他變數進行構建任務設定


4. 持續整合團隊需要在構建模版中定義內容收集後設資料,收集環境變數,設定質量關卡,做到讓開發無感知的情況下,完成所有資訊的收集。這樣就可以做到,開發人員無需學習複雜的groovy語法編寫pipeline;管理人員可以標準化構建流程,並收集所有質量關卡資料,並會寫到統一製品倉庫管理。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69954434/viewspace-2669413/,如需轉載,請註明出處,否則將追究法律責任。

相關文章