專案DevOps研發雲CI實踐之路

貓飯先生發表於2017-10-11
本文講的是專案DevOps研發雲CI實踐之路【編者的話】DevOps是Develop與Operations的縮寫。DevOps不是憑空冒出來的,是我們持續整合思想的延伸。

使用敏捷或其他軟體開發過程與方法,專案要求加快產品交付的速率,虛擬化和雲端計算基礎設施(可能來自內部或外部供應商)日益普遍,都促使我們不斷向DevOps方向發展。

因此,現在的業務開發,對傳統的CI提出了更新更高的要求,藉助於雲技術,我們可以在DesOps趨勢下實現從傳統CI向雲化CI的演變。

一、專案痛點

筆者所在專案在敏捷推進過程中,已經建立了一套以Jenkins為核心的CI持續整合系統,相信很多專案也是通過Jenkins來構建專案自己的CI防護網的。

01.jpg


02.png


基於CI持續整合系統對敏捷的重要性,穩定和高效成為了CI整合系統最重要的兩個要素。

在實際使用過程中,各種型別的編譯環境,部署安裝、配置維護,成本越來越大,工作重複、效率低;隨著CI整合越來越複雜,對裝置的效能、穩定性要求越來越高,維護成本也越來越高,越來越專業,需要人員有專門的技能才能維護。

同時隨著敏捷的深入,快速交付、快速部署,對CI整合時間、週期、效率提出了更高的要求,CI系統的效率和反饋速度也成為瓶頸。產品級敏捷也期望能夠全程監控CI的過程質量,全方位度量、質量保證,對CI系統提出了更高的要求。

綜上所述,總結一下專案在持續整合方面的痛點:

  • 效率低下
  • 環境複雜
  • 基礎設施維護困難
  • CI質量狀況難以實時監控


二、解決思路

現在DevOps概念在業界比較火熱,並逐漸成為趨勢。這也讓我們覺得藉助雲端計算和DevOps理念來進一步持續推進傳統CI,正是我們需要的。

03.jpg


04.png


三、實踐情況

1、入雲方案

(1)OKR驅動

OKR驅動,本著向更有價值,更有挑戰性的目標衝刺的原則。

在部門的改進工作坊上,結合專案的痛點,大家一起制定了專案的DevOps貫通OKR計劃。跟隨著公司研發雲專案的不斷演進過程中,逐漸認識到雲CI在DevOps推進過程中,越來越扮演著非常重要的角色。

經過研究,雲CI使用到的Jenkins和Docker技術,以及雲內的計算資源,能夠助力後面的雲託管、雲構建,所以CI上雲成為我們DevOps推進中非常有價值的事情。

(2)總體方案
藉助雲端計算的發展,傳統CI向雲CI進行演進。

05.jpg


  • CloudCI(http://cloudci.zte.com.cn/
    雲Jenkins伺服器,優勢:CloudCI是基於Docker叢集的雲Jenkins伺服器
  • Mesos叢集(基於Docker,CloudCI已整合為Mesos節點)
    海量雲資源,優勢:可共享,隨用隨申請,使用結束自動釋放。
  • Docker映象倉庫
  • Mesos叢集+Docker映象,構成CI任務執行環境


(3)總體流程
流水線任務優化和拆分,序列變並行,資源雲化,度量及時反饋。

06副本.jpg


  • Step1 程式碼入庫
    程式碼通過Pha評審,提交到程式碼託管SVN倉庫。
  • Step2 Jenkins任務執行
    程式碼入庫,觸發雲Jenkins伺服器執行CI任務,CI任務並行同時觸發執行。CI整流水線速度取並行任務的最長時間,相比原來的序列累加速度提升明顯。
  • Step3 資料採集
    資料採集任務,在CI任務執行過程中採集專案度量資料(如程式碼行數、靜態檢查資料等),以及CI任務的執行次數、成功率等資料。以Shell和Python為主的指令碼庫作為資料採集的支撐,採集資料自動接入無線度量系統。
  • Step4 度量報告
    在度量系統建立統計模型,每天以郵件方式自動輸出度量報告,用於專案/團隊及時反饋和改進開發,形成閉環。


2、CI入雲準備

(1)執行環境標準化
主要的原則是:環境分類、標準化,利用Docker技術資源雲化。

07.jpg


執行環境標準化的目的是將CI任務按照執行環境分類管理,並且梳理出每個任務執行所依賴的環境要求(重點:作業系統以及軟體)。

以我們專案IaaS版本構建為例:

  • 作業系統:Linux
  • 編譯工具:交叉編譯鏈
  • 其餘軟體:tcl、bc、zip、bzip2


最終,執行環境需要使用Docker技術實現容器化,實現Ship&Run。

(2)CI任務整理優化
主要的原則是:任務拆分,去依賴和狀態,序列變並行。

  • Job拆分:根據專案特性拆分,以更好的利用雲端彈性伸縮特性
  • 去依賴化:隔離CI全流程中工具鏈等因素對物理機/虛機的依賴
  • 去狀態化:轉化/消除CI全流程中各job對於實體機/虛機狀態化的需求,如各種快取等


3、部署實施

(1)CI任務配置執行 

08.jpg


相比於以前,現在CI Jenkins任務的部署就非常簡單,尤其是使用Mesos叢集的任務,可以簡單到只需要下面這樣Pull&Run:

docker pull mirrors.zte.com.cn:5000/ft-cloudci-centos:latest
docker run --rm mirrors.zte.com.cn:5000/ft-cloudci-centos


4、相關技術

因為需要使用到Linux、Docker和Jenkins,所以這些相應的技術要熟悉。

另外,CI任務改並行後,必須要考慮多工並行時,程式碼檔案(含二進位制檔案)在Mesos叢集機器中動態掛載的問題。

經過實踐,建議的檔案掛載方式如下:

  • Svn全量檢出
    低效不建議採用,參考資料:1.8G程式碼,下載速度:8-15min。
  • Git/Gerrit全量檢出
    高效,參考資料:1.8G程式碼,下載速度:雲內30-40s,雲外1-2min。
  • Rsync全量同步
    高效,參考資料:1.8G程式碼,下載速度:雲內2-4min。
  • 增量更新+網路共享
    未來的優化方向,研究中。程式碼增量更新,通過網路共享(NFS/Ceph)到Mesos叢集,然後再docker –v掛載到執行容器。


四、效果評價

通過CI上雲,解決了專案CI的四個痛點。

現狀:版本已經上線,任務優化和拆分,序列變並行,資源雲化

收益:

  • 效率:Jenkins任務序列變並行,整版本構建速度和流水線執行速度大幅提升
  • 環境:環境構建實現自動化與標準化
  • 基礎設施維護:公司統一維護,無需專案額外指定專人維護
  • 質量控制:度量系統實時監控,及時反饋


原文連結

原文釋出時間為:2016-12-05

本文作者:尼古拉斯

本文來自雲棲社群合作伙伴Dockerone.io,瞭解相關資訊可以關注Dockerone.io。

原文標題:專案DevOps研發雲CI實踐之路


相關文章