三名Netflix工程師Ed Bukoski、Brian Moyles和Mike McGarr在一篇博文中解釋了Netflix如何持續交付向7500萬觀眾提供電視節目和電影的代碼。
Immutable Server模式是Netflix部署的基礎。每次部署都會創建一個全新的亞馬遜機器鏡像(AMI)。
Netflix的微服務架構讓Netflix團隊可以松耦合。變更推送速度讓每個團隊都很舒服。
Netflix不要求任何團隊使用任何工具集,但他們要負責維護他們實現的工具。在Netflix,有團隊會集中提供工具,作為“鋪好的路”的一部分,以減少大多數Netflix工程師的認知負擔。
這個“鋪好路”的代碼交付過程由幾個步驟組成。代碼使用Nebula在本地構建和測試。變更提交到中心Git版本庫。一個Jenkins作業構建、測試并打包應用程序用于部署。這些程序包使用Netflix的全球持續交付平臺Spinnaker部署到亞馬遜機器鏡像(AMI)。
構建
Nebula是Gradle構建系統的一組插件,它可以構建、測試并打包Java應用程序。Netflix的大多數代碼都是用Java編寫的。這些插件擴展了Gradle的自動化功能,包括依賴管理、發布管理以及打包。一個項目的構建文件聲明了用到的依賴和插件。
集成
下一步是將本地構建、測試并打包的源代碼推送到Git版本庫。具體的流程由團隊選擇。
提交完成后,會觸發一個Jenkins作業構建、測試并打包代碼用于部署。程序包類型會根據構建對象是一個庫還是一個應用程序作出恰當的選擇。
部署
Netflix “Bakery”暴露了一個API用于創建AMI。具體的鏡像使用Aminator創建。用戶指明將什么基礎鏡像和程序包放入該AMI。基礎鏡像是一個Linux環境,包含與Netflix生態系統集成所需的約定、工具和服務。
當Jenkins集成任務執行成功后,它會觸發Spinnaker管道。Spinnaker讀取Nebula程序包,并使用Bakery API創建AMI。
然后,Spinnaker會向數以十計、百計或千計的實例提供該AMMI。
第一次部署是到測試環境,部署會執行自動化集成測試。在通過這些測試后,Spinnaker為團隊提供了自定義生產環境部署過程的靈活性,例如多區域部署、金絲雀發布或者紅/黑部署。
該自動化過程非常高效,舉例來說,Janitor Monkey云彈性和維護服務從代碼檢入到多區域部署只要16分鐘就可以完成。
未來方向
在Netflix,語言無關的需求與日俱增。非JVM語言需要包含進構建過程。
部署時間有一大部分是“烘焙(baking)”過程,Netflix正設法減少這部分時間。
此外,Netflix還在研究容器是否能夠幫助他們應對上述兩個挑戰。
容器還可以改進當前的構建、烘焙和部署過程,進而改善開發測試周期。可以在本地部署的容器,無需修改就可以部署到生產環境,這對于確定一個Bug是否是由環境差異導致的非常有幫助。這讓工程師可以專注于新特性。
查看英文原文:How Code is Built at Netflix