1. 程式人生 > >Netflix如何做構建和部署?

Netflix如何做構建和部署?


在程式碼部署到雲端之前,Netflix 是如何做構建的?本篇文章將描述為 Netflix 服務8000萬用戶的微服務,是用什麼工具和技術構建出來的。


上圖描述了在 Netflix 的全球持續釋出平臺 Spinnaker 做釋出之前,仍然有幾個步驟需要執行,這些步驟就是將原始碼編譯、構建、測試打包的過程,這些過程包括:

·   程式碼在本地用 Nebula 進行構建和測試。

·   程式碼都會被提交到統一的中央 Git 程式碼庫。

·   使用 Jenkins 任務執行 Nebula 構建,測試並且執行打包應用。

·   構建被 “baked” 到 Amazon Machine Images(AMI)。

·   Spinnaker pipelines 用來部署和升級程式碼變更。

文化,雲端計算,微服務

在進入 Netflix 如果構建程式碼的細節之前, 先來看看 Netflix 最重要的關鍵元素:文化,雲端計算,微服務。

Netflix 的文化鼓勵員工使用任何他們認為最好的工具去完成任務。在 Netflix 內部功能風靡的工具,一定是很核心的,非常具有價值,為大部分程式設計師大幅提升效能的工具。團隊有選擇技術方案的自由,同時也承擔維護這些新方案的責任。

另外,在 2008 Netflix 開始將流媒體業務遷移到 AWS,也開始將巨石應用遷移到基於 Java 的微服務,微服務架構裡,服務之前鬆耦合,任何團隊可以按需的釋出程式碼變更。

構建

Netflix 建立了 Nebula, 一個精選了多個外掛的 Gradle 構建系統, 目的是為了全公司的 Java 服務提供統一的構建工具. Gradle 對應 Java 應用的構建,測試和打包支援的非常全面。為什麼選擇 Gradle? 因為使用 Gradle編寫 外掛非常容易,同時大大減少每個專案的構建檔案。Nebula 繼承了 Gradle 健壯的自動化構建系統,並且繼承了一系列開源工具,支援依賴管理,釋出管理,打包等等。

一個簡單的 Java 專案 build.gradle 檔案:


上面的 ‘build.gradle’ Netflix 的一個典型的 Java 構建專案。這個構建檔案聲明瞭 Java 的依賴和4個應用的 Gradle 外掛。 其中,‘nebula’ 外掛是內部用於整合內部基礎服務的Gradle 外掛。‘Nebula.dependency-lock’ 外掛能夠為專案生成一個.lock 檔案,記錄所有依賴的圖譜,用於版本的重建。 ‘Netflix.ospackage-tomcat’ 外掛接下來會講到。

通過 Nebula 能夠實現可重用的構建能力,減少了專案框架構建檔案的數量。 Nebula 已經在 Github 開源,詳情可以去 Nebula 的官網檢視 the Nebula website。

整合

當代碼被 Nebula 本地構建,測試完成後,可以將它做持續整合和部署。第一步是將它提交到 Git 倉庫。

一旦程式碼提交,一個 Jenkins 被觸發。Netflix 使用一個巨大的Jenkins Master 排程 AWS 上的25個 Jenkins Master 節點。

一個 Jenkins 會配置 Neluba 的構建,測試和打包。如果目標包是一個庫,Nebula 會打包成 .jar 到 Artifactory 倉庫。如果目標包是一個應用, Nebula ospackage plugin 會被執行。使用 Nebula ospackage 外掛,一個應用會被部署到一個 Debian 或者 RPM 包,這些包的內容會被 Gradle 的 DSL 定義。Nebula 會發布這些映象檔案到包倉庫管理平臺,準備下一個環節 “baking”。

Bake

Netflix 的部署策略是集中式,不可變基礎設施為主導的模式。動態修改線上伺服器的內容是嚴令禁止的,目的是為了每次釋出是完成從程式碼提交開始。每次部署始於一個新的亞馬遜機器映象 Amazon Machine Image。從程式碼到生成 AMI就叫做 “the Bakery”.

Bakery 提供了全域性的建立 AMIs 的介面。 Bakery API 服務定時的去執行建立映象的任務,任務使用 Aminator 去建立映象。使用者只需要宣告需要安裝的依賴包,基礎映象,以及 Netflix 的上線基礎服務即可。

當 Jenkins 任務成功了,它會觸發一個 Spinnaker pipeline. Spinnaker 流水線可以被 Jenkins 任務觸發,或者被一個 git commit 觸發。Spinnaker 將會讀取 Nebula 構建處理的系統包,並且呼叫 Bakery API 去發起一次 bake。

部署

一旦 bake 完成,Spinnaker 將烘焙好的 AMI 成百上千臺伺服器裡。同樣的  AMI 可以被不同環境重複使用,Spinnaker 暴露一個執行時的 context,能夠進行執行時的環境變數注入。一個成功的 bake 會觸發下一個階段的 Spinnaker 流水線,一次部署到測試環境。從這裡,團隊會執行自動化的整合測試。在部署階段,團隊開始自定義自己的部署目標。可以使用 Spinnaker 管理多 Region 的部署,金絲雀釋出,藍綠部署等等。 Spinnaker pipelines 為團隊提供了足夠強大的能力去部署程式碼。

未來展望

總體來說,這些工具帶來了很高效的自動化能力。例如,Netflix 從程式碼提交,到部署到跨區域的雲伺服器的時間只需要16分鐘。


Netflix 一直在思考如何改進開發者的使用者體驗,如何做到更好,更快,更容易的交付軟體。

Netflix 一直受到如何管理包依賴問題的困擾。Nebula 提供了更方便的解析 Java 依賴的能力。例如 Nebula dependency-lock plugin 能夠為應用程式生成一個.lock 檔案,將所有依賴的檔案版本化起來。 Nebula resolution rules plugin 提供跨團隊的依賴解析規則,在所有 Nebula 的構建中生效。這些外掛可以將依賴管理變得更加容易。

另外一個挑戰,是 Bake 時間過長。在不久之前,16分鐘從程式碼提交到部署還是一個夢想,但隨著各個系統的時間都在縮短,這個時間變得越來越短。

隨著Netflix 的發展,支援非 JVM 語言的構建,測試工具鏈的需要越來越強烈,例如 JavaScript/Node.js, Python, Ruby and Go。目前推薦非 JVM 得語言使用 Nebula ospackage 外掛生成 Debian 包去做 baking,將構建和測試的階段交給團隊熟悉的工具。

原文地址:https://medium.com/netflix-techblog/how-we-build-code-at-netflix-c5d9bd727f15


掃碼關注我們!

關於JFrog

世界領先DevOps平臺

公司成立於2008年,在美國、以色列、法國、西班牙,以及中國北京市擁有超過200名員工。JFrog 擁有4000多個付費客戶,其中知名公司包括如騰訊、谷歌、思科、Netflix、亞馬遜、蘋果等。關注 JFrog,感受原汁原葉的矽谷技術!我們不僅僅提供最優秀的產品,也提供最優秀的持續交付平臺的解決方案,詳情請洽[email protected]

相關推薦

Netflix如何構建部署

在程式碼部署到雲端之前,Netflix 是如何做構建的?本篇文章將描述為 Netflix 服務8000萬用戶的微服務,是用什麼工具和技術構建出來的。 上圖描述了在 Netflix 的全球持續

數據庫服務器構建部署筆記

創建 大服務 阻止 server 戴爾 ror 數據庫日誌 操作系統 diff 1. 機架和電纜服務器 確保每個電源插入不同的電源電路 果可能,請確保網絡電纜已插入不同的網絡交換機 2.SQL Server服務和SQL Server

Window系統下用Ant實現Java項目的自動構建部署

echo 驗證 TP 地址 apach ava build 部署 系統環境變量 Step 1: 從官網下載Ant包,官網地址http://ant.apache.org/ Step 2: 解壓好了,去配置用戶自定義環境變量【或者系統環境變量】 Step 3:驗證一下自己環境是

個人站點升級持續集成,自動構建部署

lock 快的 標識 mar 根目錄 OS 執行 連接 path 前言 利用markdown+Hexo寫文章,整體體驗已經很棒。在寫作過程中,節省了我不少時間。 但是,美中不足的,就是發布的時候,需要手動輸入命令,build好文件,再用scp部署到服務器上。 本文,用於記錄

使用Leangoo一鍵構建部署DevOps

故事 部署 ops ati 幫助 htm 簡潔 ima 敏捷 先來說一下這個Scrum敏捷開發工具-Leangoo Leangoo(中文名:領歌)是一款基於看板的項目協作工具,完美支持Scrum敏捷開發。它的核心主要是看板,通過看板共享和實時同步團隊工作以實現高效協同!工具

邊緣化搭建DotNet Core 2.1 自動化構建部署環境(上)

寫在前面   寫這篇文章的緣由是由於筆者的對新興技術方向有所追求,但個人資產有限,只能容許購買一臺阿里雲低配1核2G伺服器。伺服器上搭建了 Centos7 & Docker & Jenkins & ASP.NET Core 2.0 自動化釋出和部署 環境後犧牲了大部分效能。

用Ant實現Java專案的自動構建部署

       Ant是一個Apache基金會下的跨平臺的構件工具,它可以實現專案的自動構建和部署等功能。在本文中,主要讓讀者熟悉怎樣將Ant應用到Java專案中,讓它簡化構建和部署操作。 一.安裝與配置 下載地址:http://ant.apache.org/,在本文中下載的是1.7.0版本。解壓到某

Ant詳解(用Ant實現Java專案的自動構建部署)

       Ant是一個Apache基金會下的跨平臺的構件工具,它可以實現專案的自動構建和部署等功能。在本文中,主要讓讀者熟悉怎樣將Ant應用到Java專案中,讓它簡化構建和部署操作。 一.安裝與配置 下載地址:http://ant.apache.org/,在本文

搭建Jenkins自動化持續構建部署系統

什麼是Jenkins? Jenkins是一個持續整合和持續交付的java應用程式,可以處理任何型別的構建或持續整合。整合Jenkins可以用於一些測試和部署技術。簡單得說就是一款自動化構建測試和部署的Java應用程式。 Jenkins的應用場景 簡單的應用場景:在團隊開

瞭解以太坊區塊鏈智慧合約開發從零構建部署去中心化投票

區塊鏈愛好者(QQ:53016353)編輯器選擇理論上講任何編輯器都可以編寫Solidity合約程式碼,比如:WebStorm,VSCode,Sublime,等等。我選擇的是Atom,沒有任何理由,因為Atom輕量並且介面漂亮。移步https://atom.io/地址,下載安

【機器學習】在生產環境使用Kafka構建部署大規模機器學習

使用Apache Kafka在生產環境構建大規模機器學習智慧實時應用為所有行業帶來了革命性變化。

資料庫伺服器構建部署最佳實踐

17.檢查下,保證新的邏輯驅動器在Windows資源管理器中都能夠看到   18.在安裝SQL Server 2012之前,把所有需要的邏輯驅動器都建立上   19.使用CrystalDiskMark測試每個邏輯驅動器的效能   20.使用SQLIO測試每個邏輯驅動器的效能   21.在每個驅動器上,建立下

從零構建以太坊(Ethereum)智能合約到項目實戰——第23章 從零構建部署去中心化投票App,decentralization Voting Dapp

上傳數據 文件 ali 安裝 存儲文件 去中心化 圖片上傳 個人 構建 P90 、1-從零構建和部署去中心化投票App-01P91 、2-從零構建和部署去中心化投票App-02P92 、3-從零構建和部署去中心化投票App-03P93 、1-IPFS環境配置P94 、2-I

講一下springboot多模組的構建部署

因為今天小踩一點坑,話不多說,直接上程式碼,基本直接按照我的結構複製就行。有三個子模組和一個父模組子模組有 common   biz  和web依賴關係為biz依賴common    web依賴biz 和common下面給出每個模組的具體依賴關係父依賴<modelVer

.NET Core 3.0 構建部署

Default Executables 預設可執行檔案  在 dotnet build 或 dotnet publish 期間,將建立一個與你使用的 SDK 的環境和平臺相匹配的可執行檔案。 和其他本機可執

基於jenkins構建應用的docker映象持續整合部署

為了做持續的整合和部署,引入了jenkins,利用jenkins來構建應用的docker映象並push到私有倉庫,然後再基於應用的docker映象來發布專案,這樣減少了很多的手動操作,基本能實現持續整合

使用Bitbucket Pipeline進行.Net Core項目的自動構建、測試部署

net yml cimage 參考 www 模板 -c 免費 clas 1. 引言 首先,Bitbucket提供支持Mercurial和Git版本控制系統的網絡托管服務。簡單來說,它類似於GitHub,不同之處在於它支持個人免費創建私有項目倉庫。除此之外,Bitbucke

自動化部署之jenkins自動觸發構建發布

jenkins 自動觸發構建 一、下載gitlab pluginjenkins-->系統管理-->管理插件-->下載並安裝gitlab plugin二、配置gitlab認證路徑:Jenkins-->Credentials-->System-->Global cred

Shell -- 通過AWS cli targets_group 流量切換部署指令碼(長連線服務)

1 #!/bin/bash 2 3 who am i 4 # 部署jar包通過cli的形式 5 set -x 6 7 #獲取線上服務埠 8 PORT=$2 9 10 15 16 # 負載均衡目標組ID:register-targets 17 targe

詳解Dockerfile,並構建docker私有庫,通過maven自動構建映象部署,達到持續整合

上篇給大家簡單的介紹了一下docker的架構,已經常用命令. 今天帶大家通過Dockerfile構建docker映象,並構建docker私有倉庫,通過maven進行打包自動構建映象自動部署,達到持續整合目的 廢話不多說,首先介紹下Dockerfile中常用的命令 FROM