閱讀38 返回首頁    go 阿裏雲 go 技術社區[雲棲]


小博無線CI係統演進之路

小博無線技術團隊至2014年創建以來,這三年多以來所使用的CI係統經過數次升級換代,現已全部上雲,全麵實現了容器化和pipeline化,並引入了扁平和伸縮的實踐來節省雲計算成本。本文回顧了CI係統的成長曆程。

2014 - virtual box

2014年初,拚了一台16G內存的PC機,在上麵開了多個virtual box,一個跑gitlab, 一個跑jenkins master, 剩下的幾個就用於搭建build環境,作為jenkins的ssh slave。上線部署通過配置promotion plugin實現 - 先將build出來的release package scp到線上ecs, 再ssh運行一個安裝升級腳本。

遇到的問題

  • virtual box比較重,很耗資源,16G內存也跑不了幾個虛擬機
  • virtual box實例是長期存在的,每次build都要注意對應的cleanup操作,避免不同的build之間相互幹擾
  • 每個虛擬機都需要單獨的環境配置,複製成本高
  • scp+ssh的上線方式難以統一運作,基本上每個服務都需要定製;如果代碼和配置都有變更,升級部署及回滾動作都可能相當複雜且風險較高

2015 - docker

2014年底,docker慢慢流行開來,容器比虛擬機要輕量很多,並且環境配置可以用Dockerfile很方便的以代碼形式管理起來,我們便將原本以virtual box形式存在的jenkins slave都替換成了docker。

另外,將線上服務也容器化,將代碼和配置統一裝入一個docker image, 這樣可以整體升級部署或回退,就消除了"代碼和配置都有變更時,是先回滾配置,還是先回滾代碼?"的難題。

遇到的問題

  • docker雖然解決了資源消耗的問題,但此時的docker仍然是作為長期存在的ssh slave來運行的,在build時仍然需要考慮對應的cleanup操作以避免不同的build之間相互幹擾
  • 每個服務的相關CI配置仍然是用jenkins web ui進行配置,變更比較麻煩,並且需要jenkins的配置權限

2016 - Jenkins pipeline & docker plugin

6月份,辦公室停了兩次電,有一次竟長達兩天!為了解決停電問題對上線迭代的影響,我們將位於辦公室內的CI係統逐步遷移到了阿裏雲上。本地的數據備份和恢複是一件非常麻煩的事情,上雲後,數據備份就方便多了。

另外,同年4月份Jenkins官方在新發布的Jenkins 2.0中開始全麵推進pipeline,隨著這次遷移,我們也一並實施了pipeline結合docker plugin的容器化改造。

pipeline化後,所有的build動作都通過代碼倉庫中的Jenkinsfile定義,完全不需要在jenkins的網頁上進行配置,開發通過git push Jenkinsfile就能實現對CI流程的控製。

容器化後,CI的各種build環境也通過Dockerfile得以標準化,並且每次build的容器都是按需新建的,無需考慮cleanup操作。

2017 - mesos plugin & auto scaling

之前的docker plugin連接的docker cloud是一個單點ecs, 負責代碼的編譯,測試,打包,及部署操作,對於線上運行的各種微服務項目,還能應付,但如果用來跑編譯路由器固件這種CPU密集型的任務,就力有未逮了。另一方麵,預發布的測試集群由於流量很小,在絕大多數時候,各個節點的CPU都是空閑的。於是自然想到將預發布環境和CI環境進行扁平化:利用mesos plugin在預發布測試環境的mesos集群中集成jenkins framework, 用於運行容器化的jenkins slave。

固件編譯雖然很耗CPU,但這隻是一個耗時不到1小時的短任務,如果為了一天隻做幾次的build而多開幾台包月ecs,會帶來巨大的浪費。使用自動伸縮,當jenkins提示mesos資源不足時,利用API創建按量ecs加入mesos集群,等build完成後就將它釋放掉,是一種高性價比的解法。

結論

係統化、標準化是降低成本,提升效率和質量的重要手段。2014年開始搭建CI係統時,build環境、部署環境、部署方式和配置方式都很零散,難以管理和維護。從2014-2017,先用容器標準化build環境和部署環境,並用pipeline標準化部署方式和配置方式,有效降低係統複雜度後,再用雲計算資源降低電力供應和數據備份的風險和維護成本,最後用"扁平"與"伸縮"[1]降低雲計算成本。


[1] 在雲計算的五種基本實踐方法 - "冗餘, 漂移, 伸縮, 熔斷, 扁平"中,"扁平"與"伸縮"是兩種提高資源利用率,降低成本的方法,這方麵的更多介紹請參考《雲計算十字真言及其在小博無線的實踐》一文 (https://yq.aliyun.com/articles/62686)

最後更新:2017-08-15 12:02:16

  上一篇:go  分布式MySQL集群方案的探索與思考
  下一篇:go  金融安全資訊精選 2017年第三期:互金第三方監管機製正在醞釀,催收平台信息泄露需警惕