美團技術團隊Docker實戰(zhàn):基于容器的自動構建

責任編輯:賈世華

作者:Puff

2015-05-28 10:15:32

摘自:meituan

自動構建系統(tǒng)是從美團的自動部署系統(tǒng)發(fā)展出來的一個新功能。

自動構建系統(tǒng)是從美團的自動部署系統(tǒng)發(fā)展出來的一個新功能。每當開發(fā)人員提交代碼到倉庫后,系統(tǒng)會自動根據(jù)開發(fā)人員定制的構建配置,啟動新的Docker容器,在其中對源代碼進行構建(build),包括編譯(如Java、C++和Go)、預處理(如Javascript和CSS)、壓縮(如圖片)等操作,生成最終需要上線的程序包。

背景

美團的代碼發(fā)布系統(tǒng)有中央控制節(jié)點,負責代碼的拉取、應用的構建和上傳等任務。隨著業(yè)務的迅速增長,應用發(fā)布項的數(shù)目和單個發(fā)布項的服務器數(shù)量也隨之增長,中控節(jié)點的任務加重,幾個問題也變得亟待解決:

不同應用的構建環(huán)境在同一個虛擬機上,需要解決環(huán)境沖突和隔離的問題
多個應用同時構建會競爭發(fā)布機的CPU和IO資源,讓構建變慢
應用的構建腳本運行在公共發(fā)布機上,腳本的bug可能會影響到發(fā)布機的正常運行
例如某次主站(PHP)的發(fā)布速度非常慢,調查后發(fā)現(xiàn)當時某些Java應用正在編譯,占用了大量CPU資源,導致其它應用的發(fā)布變慢。

為解決上述問題,我們設計了把應用的構建過程從中央發(fā)布機分離出來的方案,并利用Docker作為構建的基礎環(huán)境。關于Docker的介紹,可以參考《Docker系列之一:入門介紹》這篇文章。

原理

 

首先,開發(fā)人員在Stash上配置自動構建,之后的代碼提交就會通知自動構建系統(tǒng)。自動構建系統(tǒng)收到通知,找到所有配置了該倉庫的發(fā)布項,生成構建任務,并把這些任務提交到Django-rq隊列。任務的主要配置是YAML格式的自動構建配置文件,該文件類似Dockerfile,但是為了使用方便,只支持少量的關鍵字,因此比Dockerfile使用更簡單。通過該配置文件可指定構建容器使用的鏡像,一些環(huán)境變量,以及構建命令等。系統(tǒng)從私有的 Docker registry獲取鏡像,并根據(jù)YAML配置生成Docker容器,在此容器中完成構建。

從Stash觸發(fā)自動構建的功能,是從這個項目修改實現(xiàn)的,只需簡單配置即可啟用自動構建。

 

構建成功的結果會自動上傳到美團存儲服務(Meituan Storage Service)。當發(fā)布人員發(fā)布時,就直接從MSS拉取構建好的應用包進行發(fā)布,省去了在發(fā)布時才進行的編譯環(huán)節(jié)。

為什么用Docker?

為了達到隔離構建環(huán)境的目的,應用的構建可以在分別的美團云虛擬機上實現(xiàn)。但是,應用構建有一些特點讓Docker在此場景更合適。首先,構建環(huán)境都是臨時的,每次構建結束后就銷毀(也可選擇保留)。而我們內部使用的美團云虛擬機是和運維用的配置管理數(shù)據(jù)庫(Configuration Management Database)關聯(lián)的,新虛擬機會自動部署一些基礎環(huán)境、監(jiān)控報警項等,并注冊進CMDB,而這些東西對自動構建的系統(tǒng)是多余的。第二,自動構建的系統(tǒng)啟停頻繁,Docker這樣的輕量級容器可以更好地滿足快速生成和銷毀的需求。因此,自動構建系統(tǒng)是在美團云虛擬機里面運行的Docker容器中進行的。

收益

自動構建很好地解決了文章開頭提到的發(fā)布系統(tǒng)的三個問題:

自動隔離不同應用的構建環(huán)境,無需擔憂環(huán)境沖突的問題
不同應用的構建容器不必運行在同一臺虛擬機,可以分布在多虛擬機的集群上,避免了構建之間的資源競爭,讓構建過程更加迅速
任一應用構建的錯誤不會影響其它應用的構建或者中央發(fā)布機的運行
此外,自動構建還有如下兩個好處。

首先,預先的主動構建把冗長的構建時間從發(fā)布過程省去,讓發(fā)布人員在發(fā)布時耗時更短,既讓發(fā)布更敏捷迅速,又提升了用戶體驗。美團在工作日每天的代碼發(fā)布要上千次,快速的發(fā)布過程才能更好地保證業(yè)務的迭代過程。

其次,自動構建讓構建環(huán)境的定制更方便。原來在發(fā)布機上構建時,如果需要的依賴在發(fā)布機上還沒有,就需要給運維人員提需求來進行配置,這個過程不夠敏捷。使用自動構建后,開發(fā)人員可自行在YAML格式的配置文件指定構建環(huán)境。前端開發(fā)人員的構建環(huán)境往往比較新,需要頻繁改變環(huán)境,因此支持自定義依賴的自動構建系統(tǒng)受到了前端開發(fā)人員的歡迎。

總結和展望

自動構建目前是發(fā)布項配置里面的一個可選項,這保持了和原有系統(tǒng)的兼容。自動構建是美團在線上業(yè)務中首次使用Docker。我們會持續(xù)推進該特性在自動部署系統(tǒng)的使用,最終成為所有發(fā)布項的默認配置。

自動構建使用Docker的方式,為我們后續(xù)更廣泛地使用Docker提供了啟發(fā)。

第一,將Docker用于開發(fā)環(huán)境。通過Dockerfile描述測試環(huán)境,并維護起測試環(huán)境的Docker鏡像,可以讓開發(fā)人員快速搭起來一個統(tǒng)一的開發(fā)環(huán)境;再結合Vagrant,可以很好地解決研發(fā)團隊中普遍存在的測試環(huán)境搭建麻煩的問題。

第二,將Docker用于應用部署。完成自動構建后,容器中已經(jīng)有了應用程序包,再加上運行時依賴,即可讓這個容器直接提供服務。

未來可以在應用的開發(fā)測試,編譯構建,和部署運行等三個環(huán)節(jié),都使用Docker容器。關于Docker在上述場景的應用,請關注我們博客的后續(xù)更新。

鏈接已復制,快去分享吧

企業(yè)網(wǎng)版權所有?2010-2024 京ICP備09108050號-6京公網(wǎng)安備 11010502049343號