Docker在英雄聯盟遊戲中的實踐探索(一)

2021-09-23 00:17:46 字數 2967 閱讀 4081

本文講的是docker在英雄聯盟遊戲中的實踐探索(一)

【編者的話】riot將docker和jenkins相結合,以此來構建流水線(pipeline)。這篇部落格是riot實踐docker的系列部落格的第一篇,主要介紹了他們的目標和理念;後續部落格則以教程的形式一步一步地記錄riot的docker實踐。

容器技術已經風靡全球,我們歡迎容器化領域的新霸主們。

然而,他們也給riot的流水線工程團隊(pipeline engineering team)的同事們帶來了新挑戰。我叫maxfield stewart,是riot的工程師,我們組主要負責構建流水線(pipeline)——從**簽入(check in)到部署的一切工作,甚至更多。如果說持續交付是一首主題曲的話,那麼我們就是用清唱的方式演唱它。我們運轉的是乙個類似雲的環境,管理著riot最大的乙個伺服器和虛擬機器集群。其中的乙個龐然大物是構建集群(build farm),由大量的物理機和虛擬機器組成。它是從數年前的乙個小集**展而來的,當時只負責構建英雄聯盟的遊戲客戶端。

最近,我們已經融入了docker容器技術。我們是如何將容器與傳統的構建集群整合,並使其越來越像乙個自服務的基於雲的工作引擎呢?我們能否使用dockerfile定義構建環境,並與我們常用的開源架構相結合呢?我們又能不能拋棄傳統的基於虛擬機器的雲,轉身擁抱容器雲呢?

上述問題已經持續了相當長的一段時間,就像寒冰射手(ashe)的箭一樣。接下來,我將通過乙個系列部落格介紹我們的團隊是如何嘗試回答上述問題的。本文是其中第一篇部落格,主要是介紹我們的團隊背景,以及我們為什麼要整合容器技術。在後續部落格中,我將具體地分享如何整合jenkins和docker。第一篇教程是乙個

基礎介紹

。如果你對於使用容器建立構建集群、持續交付、幫助工程師快速交付,那麼這個系列就是你要的。請準備好:我將從基本介紹,逐步深入,最終介紹如何使用docker承載真正的業務。

一年之前,我們將持續整合引入到了英雄聯盟。在那之前,我們拼命地嘗試以乙個常規節奏來發布英雄聯盟,但是我們步履維艱。因此我們打算盡可能自動化這一切,從構建流水線到建立測試環境,獲得了大量的成果,包括提高交付一致性、減少構建時間、改善總體完成度。英雄聯盟從一天幾次的構建,增長到了每天30次構建。

我們需要世界一流的技術棧才能達到這些目標。通常有三種選擇:完全重頭編寫、購買別人的工具或者定製化開源專案。

我們選擇了第三種。在這篇部落格中,我不想比較各種ci工具。不過,通過修改開源工具來符合我們的需求是乙個最好的折中方案:不需要重頭編寫;可以與開源世界合作;如果有必要的話,可以輕易脫離它。

因此,我們的技術棧非常簡單:

我們選擇和繼續使用jenkins,是因為它是靈活的、開源的、易於處理我們的基本構建操作。總體來說,jenkins是易於建立乙個構建流水線的,符合我們持續交付的核心需求(如上所述)。作為一款廣泛應用的開源工具,我們有乙個極具活力的社群在與我們合作。與重頭編寫自定義工具相比,工程師團隊可以利用開源標準的實現,這是很有幫助的,也是具有風險的。開源標準經常變化,昨天的乙個好主意明天就可能變成乙個壞主意。然而,利用合適的外掛程式和技術訣竅,我們只用了少量的**、配置和開銷,就完成了乙個全自動的持續整合鏈。

那麼,docker發揮了什麼作用呢?讓我們回想一下我提到的持續交付的核心原則。最近,我們團隊遇到的乙個挑戰是構建環境的所有權。之前,工程師們通過packer.io定義自己的虛擬機器映象,然後給產品團隊集群的root許可權。本質上,我們需要通過jenkins這乙個工作流引擎定義乙個內部的雲環境。我們探索了幾個通用的配置管理工具,如puppet和chef,來實現虛擬雲環境,並使工程師們能控制這些機器。

然後,docker出現了。

這件事情就變得簡單了:dockerfile比其他工具更易於維護。在docker的幫助下,我們意識到容器更容易管理了。如果我們把docker中dockerfile的概念和構建環境的所有權結合起來,我們就進入了工程天堂。

docker很善於解決部署中的挑戰。我主要關注docker是如何幫助工作流引擎、構建系統和流水線,同時也熟悉了如何將其作為乙個部署工具和方**。riot管理著大量的微服務,而容器和微服務的組合就像花生醬和巧克力的組合。因為docker成為了乙個「thing(tm)」,我們也會使用它來解決其他的一些問題。

流水線工程團隊的夢想變得更真實了:我們想要乙個流水線構建工具,它能動態地加速持續交付流水線,使用框架**來按需地一鍵構建環境。為了建立乙個完整的構建流水線,我們之前是通過自動化配置虛擬機器來實現的,現在我們認為使用docker容器來完成。

需要說明的是,docker並不是乙個完美的整體解決方案。它不能解決windows和osx的構建環境中的問題,也不能和我們使用的每個工具結合。但是,docker確實解決了linux平台中我們遇到的很多困難。在riot,我們在平台和後端上進行了大量的工程工作。包括核心的後台服務在內,幾乎所有的特性都是通過跑在linux上的微服務來提供的。因此,如何優化解決方案空間是值得我們投入時間和精力的。

我們已經開始將docker與現有的構建棧結合,並獲得了一些早期的成就。我們建立了jenkins的一鍵部署環境,在容器中部署,加速了測試和除錯過程。我們從乙個小型集群(大概500個任務)開始,使用容器作為構建環境,在所有權和迭代速度上團隊也提供了積極的反饋,包括:

這篇部落格僅僅是乙個系列話題的介紹,這個系列將覆蓋多個領域,以教程的形式發布,提供例項和原始碼。首先,系列部落格將介紹如何使用docker來部署jenkins,包括各種最佳實踐,並通過乙個真實應用引入docker的基礎知識;然後,系列部落格將探索容器化構建環境的各種方案,並介紹riot是如何將docker融入jenkins的生態環境;最後,將介紹流水線工程團隊是如何完成最終目標的。

本質上來說,這一系列部落格就是記錄了這個旅程。就像之前宣稱的,我們知道我們想要的就是docker容器定義的構建環境,開發團隊可以通過dockerfiles來維護它。在已知技術棧的情況下,我們希望能預生成構建流水線,這樣一來,團隊從建立**庫的第一天就能維護持續整合的構建流水線。對於如何實現我們有些想法,但過程是不斷迭代的,而且有很多新的發現,部落格的寫法將會遵循這個過程。

我們希望通過系列部落格來能分享我們的發現以及遭遇的挫折。這些或許不是什麼大秘密,但可能是不容易發現的。我希望我們的系列部落格能回報社群,並通過交流和對話學習到更多。

原文發布時間為:2015-09-20 

羅技攜手拳頭遊戲推出《英雄聯盟》官方遊戲外設

羅技旗下電競子品牌logitech g 剛剛攜手拳頭遊戲 riot games 為 pc程式設計客棧 玩家推出了一套極富價值的 英雄聯盟 league of legends 官方外設。產品中包括了 g pro x 遊戲耳機 無線遊戲滑鼠 機械鍵盤 以及 g840 xl 滑鼠墊,輔以獨特的配色方案。l...

C 英雄聯盟挑戰賽 24點遊戲

24點遊戲是一種使用撲克牌來進行的益智類遊戲,遊戲內容是 從一副撲克牌中抽去大小王剩下52張,任意抽取4張牌,把牌面上的數 a代表1 運用加 減 乘 除和括號進行運算得出24。每張牌都必須使用一次,但不能重複使用。有些組合有不同種演算法,例如要用2,4,6,12四張牌組合成24點,可以有如下幾種組合...

state模式在遊戲中的運用

好久沒有寫blog了!最近決定多寫寫,把自己的經驗多給大家分享!state模式的定義 不同的狀態,不同的行為 或者說,每個狀態有著相應的行為.我舉個遊戲應用的例子吧!mmo中,遊戲世界可以分為 登陸時前,進入遊戲中,進入遊戲後 3個狀態 我打的比喻 首先 抽象狀態的基類 class game cla...