Mozilla 構建系統
英文來源:Mozilla’s Build System
中文出處:開放博客,由灰狐翻譯小組制作
Mozilla 構建系統是一個非常酷的分布式系統,運行在BuildBot上。系統能在每次修改后自動重新構建和測試代碼樹。
目前,整個構建基礎設施使用了大約 1,000 臺機器并分組在3個 pools 池中,每個 pool 都有數臺 Build Masters 和很多臺 Slaves 組成:
構建池(Build Pool) 處理所有更改觸發的構建,除了那些要去試驗的構建:
- 4 臺 Build Masters
- 大約 300 臺 Slaves
試驗構建池(Try Build Pool) 處理所有試驗構建:
- 1 臺 Build Master
- 大約 200 臺 Slaves
測試池(Test Pool) 處理所有的測試,包括試驗(Try):
- 7 臺 Test Masters
- 大約 400 臺 Slaves
它是如何工作的?
hg poller 每隔幾分鐘就在 hg.mozilla.org 倉庫里尋找新的更改。這些更改通過構建調度者(Build Scheduler Master) 獲得,并創建構建請求(Build Requests),為每一個支持的平臺都創建一個。這些構建請求以待定的方式進入調度數據庫。Build Masters 尋找待定的構建請求然后當有空閑Slaves就分配給它們。
為構建完整,Build Master 將狀態更新到調度數據庫中。另外,測試調度者(Test Scheduler Master) 為相應的測試創建測試構建請求。
接著,測試構建請求由 Test Masters 獲得并分配給空閑的 Slaves。當測試完成,Test Master 更新它們的狀態到調度數據庫中。
每個 Build Master 和 Test Master 控制它們自己的一組 Slaves。
構建運行生命周期
每個推向 mozilla-central 的請求,如果成功的話,會生成總數為 168 個構建請求(截至2010年10月,但在未來會有所變化),其中 10 個構建(支持10種平臺),108個單元測試和50個 talos tests。所有這些構建請求組成一個 Build Run。
10種平臺的構建都需要有一套自己的測試請求。僅當相應的構建成功完成這些測試才被創建。這就意味著如果構建失敗,這些測試將不被創建,Build Run 也不會有168個構建請求,
Build Run 生命周期中有兩個非常重要的測量:等待時間(Wait Time) 和 端對端時間(End to End Time)。
等待時間測量在隊列中的構建請求在開始執行前要等待多長時間,更具體的講,它測量生成構建請求改變的時間戳和構建請求賦予空閑 Slave 的時間戳之前的時間差。(見上面 Build Run 的生命周期圖)
端對端時間測量一個 Build Run 完成需要多長時間。也就是說,觸發這個 Build Run 改變的時間戳和最終生成構建請求的時間戳之間的時間差(換句話說,就是當所有的構建和測試完成)。(見上面 Build Run 生命周期圖)
正常情況下 mozilla-central 的端對端時間會少于4小時,但是隨著系統負載的增加時間會有所延長。
Mac minis 壘的墻
構建是在一個虛擬機組合之上完成的,包含 1U 服務器,xserves 和 Mac minis,并且所有的測試都是在 Mac Minis 上完成的。
這堵 mac minis 墻是由 400 個 Mac minis 盒子壘成的,它被放在發布工程師在山景城的辦公室里。