基於容器服務的持續集成與雲端交付(三)- 從零搭建持續交付係統
前言
在上一篇文章中討論了容器服務提供的交付能力,在本文中我們將討論如何從零搭建一個持續交付係統。
對於大多數公司而言,選擇一個合適自己的持續交付係統是尤為重要的一件事情,不同的公司、不同的業務使用的場景也各不相同,因此要根據自己的業務場景與發展方向來選擇合適的方案。根據不同的業務場景與交付方式,阿裏雲容器服務提供了三種不同的持續交付方案。
基於Jenkins的持續交付方案

基於Jenkins的持續集成和持續交付方案是所有方案中最靈活、能力最強的方式,但也是需要客戶自主運維的方案。對於現有提供持續交付的SaaS服務而言,很難既覆蓋簡單性與可擴展性。而對於定製化需求明顯的開發者而言,開源的Jenkins一直是持續交付係統的第一選擇。容器服務為了讓開發者可以更簡單的使用Jenkins進行容器交付,我們提供了容器服務的Jenkins部署插件,可以直接在構建任務中推送Docker Compose模板到容器集群;提供了Java、C++、Python、Nodejs、Golang等語言的Jenkins Slave,開發者可以直接使用這些Slave快速實現一個分布式集成的持續交付係統。在Slave中內置了簡單的容器集成流程,開發者可以通過配置的方式將一個完整的持續集成流程在Slave中運行起來。
Jenkins的方案是所有方案中,功能最強大的。之所以選擇Jenkins作為容器服務支持的開源方案的原因在於:
- Jenkins在國內的開發者中認可度較高,很多創業公司的自建持續交付係統的選擇大部分都是Jenkins,便於開發者可以在老的係統上直接進行容器化的持續交付。
- Jenkins的能力遠不止我們上文中提到的這些,良好的開源社區給Jenkins帶來的反哺,讓Jenkins可以通過插件的方式滿足很多係統無法滿足的場景,比如對於剛剛使用容器的客戶可能會傾向於使用Jenkins的混合發布的方式,即將應用交付到容器服務的同時也交付到遠程的虛機上,進行應用的灰度測試,逐步的遷移。
- Jenkins擁有良好的擴展性,在開發Jenkins插件的時候,可以發現Jenkins內部實現機製幾乎可以通過插件的方式讓開發者擴展所需的任何一個位置,對於很多定製化場景而言,這會是選擇Jenkins的決定性因素。
- Jenkins擁有持續交付係統中最重要的也是最棒的流水線(pipeline)係統,在Jenkins2.0以上的版本中,內置了流水線(pipeline)的支持,這表示了未來Jenkins在持續集成與持續交付領域的發展趨勢與能力。
基於CRP的持續交付方案

CRP是阿裏雲推出的一款提供持續集成與持續交付功能的SaaS服務。同常見的持續交付係統類似,CRP也提供了一個可擴展的流水線。開發者可以將自己的持續集成與持續交付流程轉換為一條DAG圖的流水線(pipeline)。比如在本文中提供了一個簡單的容器化的持續交付的流水線定義。分為五個階段:代碼檢出、集成測試、鏡像構建、推送鏡像、部署應用。每次提交代碼,代碼倉庫都會觸發CRP進行持續集成,運行用戶預定義的流水線(pipeline),測試不通過則重新集成,測試通過則開始應用部署。
這種集成方式的覆蓋了高質量和可擴展兩個方麵,但是CRP作為一個通用的持續交付平台,提供的可擴展性有限、而且測試的基礎環境種類有限。對於複雜的多技術棧的微服務係統而言,靈活度不足。但是對於係統技術棧統一、持續交付需求簡單的客戶而言,CRP是一個值得推薦的方式。
基於Hub的持續交付方案

基於Hub的持續交付方案是最簡單的持續交付方案,開發者無需搭建任何服務,可以直接通過在鏡像倉庫與容器服務中配置觸發器的方式完成應用的自動更新。持續交付的本質是如何可擴展、高質量、快速的進行交付。高擴展就要求持續交付係統有良好的流水線(pipeline)的設計,高質量則要求開發者有覆蓋充分的測試腳本以及持續交付係統可以標準化的組織這些腳本並運行,而快速則是這三個要素中最簡單的,而基於Hub的方案對於很多場景來講功能上是有缺欠的,但是在速度上是有優勢的。用戶提交代碼後會自動觸發容器hub的鏡像自動構建,構建完畢後會觸發容器服務的自動重新部署實現應用的更新。
這種方案特別適合在測試環境中快速迭代聯調的應用場景,雖然在標準的持續集成中測試是必不可少的一環,但是在實際的開發聯調的過程中,全量的自動化測試也會給迭代速度帶來一些阻礙,因此如果追求快速迭代並且測試的需求不是很強烈的場中,可以考慮直接使用基於Hub的持續集成方案,簡單、高效。
尾聲
在上文中,我們介紹了三種不同的持續交付方案,開發者可以根據自己的需求選擇其中任意一種從零開始進行容器化的交付之路。但是無論哪種方案,都需要進行取舍,選擇最符合業務形態的持續交付係統才是最重要的。
個人簡介
莫源,阿裏雲高級研發工程師。在加入阿裏巴巴之前,先後在北京天方地圓科技有限公司、微軟亞洲研究院任職。現主要負責阿裏雲容器服務產品的底層服務發現係統、集群管理係統的研發,從事容器的持續交付、持續集成的方案的設計與實現。在雲計算、分布式係統、圖像識別與虛擬現實方向有多年的開發經驗。
最後更新:2017-07-04 15:02:16