在過往幾期的UWA Pipeline最佳實踐案例中,我們分享了如何通過Pipeline實現(xiàn)性能優(yōu)化、性能管理、游戲內(nèi)容驗收和云真機系統(tǒng)的應(yīng)用(實現(xiàn)批量真機設(shè)備的自動化測試,以及針對特效性能優(yōu)化的方式),其實這些高效的方法并不局限游戲引擎。今天,分享一篇來自廣州鈦殼樹的UWA Pipeline使用心得,這是一家致力于創(chuàng)造獨特原創(chuàng)IP、專注Unreal研發(fā)的游戲公司,看看UWA Pipeline如何幫助Unreal研發(fā)團隊達到如虎添翼的效果。
常態(tài)化的引擎自動化編譯、客戶端自動打包、服務(wù)器持續(xù)部署,這是鈦殼樹團隊在Unreal項目研發(fā)的過程中,使用UWA Pipeline實現(xiàn)的三大功能,大幅簡化了工作流程,節(jié)省了人力與時間,提高了CI/CD的執(zhí)行效率。以下分享出自鈦殼樹團隊CEO的自述,詳細介紹了具體實現(xiàn)的思路和方式,供廣大有類似需求的Unreal團隊參考。
一、Unreal引擎自動編譯的實現(xiàn)
我們使用Windows作為流水線節(jié)點,通過流水線的簡單操作,快速有效地實現(xiàn)不同的構(gòu)建需求;通常UE引擎都有比較嚴格的運行環(huán)境和編譯條件,借助流水線和聯(lián)合編譯IncrediBuild能極大提高構(gòu)建效率,降低構(gòu)建復(fù)雜度,減少人工干預(yù)的次數(shù)。
研發(fā)過程中修改Unreal引擎源碼是必不可少的。獲取源碼后,除了有利于理解引擎的運行機制和方便調(diào)試,更多的是可以對引擎進行個性化定制,從而增強項目的游戲效果和可玩性。在構(gòu)建流水線之前,大家可以通過Pipeline設(shè)置中的環(huán)境變量,來預(yù)設(shè)工作目錄和工程路徑,方便在后續(xù)的步驟中調(diào)用。

我們的引擎編譯流水線如下圖所示,主要包括“Init”、“UpdateRepos”、“BuildAndCook” 和“CommitRepos”四個階段。

每個階段的具體作用為:
第一階段 Init
確保編譯環(huán)境干凈、當前任務(wù)獨占相關(guān)資源。如此運算力資源能夠充分利用,并且可以避免資源占用沖突導(dǎo)致的報錯。我們的做法是:初始化環(huán)境、確保沒有手動打開的編譯進程。同時將節(jié)點的并發(fā)構(gòu)建數(shù)量設(shè)置為1,確保不會有多個任務(wù)并發(fā)執(zhí)行。
第二階段 UpdateRepos
進入預(yù)設(shè)的工作目錄,通過Git和憑證管理,更新位于內(nèi)部Gitlab的引擎源碼ue_tree。

第三階段 BuildAndCook
編譯引擎。進入工作目錄調(diào)用VisualStudio編譯命令,對引擎工程進行命令行編譯,對應(yīng)的批處理腳本如下:

通常編譯引擎會占用很多CPU算力資源,需要花費很長時間才能完成編譯,所以非必要情況下不執(zhí)行Rebuild操作。我們在這里通過Pipeline的參數(shù)化構(gòu)建功能,在流水線上設(shè)定選項參數(shù),提供多種編譯方式(Build和Rebuild),在執(zhí)行時,就可以將參數(shù)傳遞給編譯器以明確編譯模式。

第四階段 CommitRepos
把最新的引擎提交到SVN,用于接下來的開發(fā)任務(wù)。引擎編譯后會生成若干目錄,其中包含引擎運行所需的DLL、執(zhí)行程序以及中間文件。這里大家需要區(qū)分中間文件的內(nèi)容,避免把不必要的文件上傳到SVN倉庫中。

二、Unreal客戶端自動打包的實現(xiàn)
完成引擎編譯后,接下來就是對游戲客戶端進行編譯打包。日常的持續(xù)構(gòu)建,能夠方便我們隨時跟進游戲研發(fā)進度,體驗游戲的特性和玩法。Unreal客戶端打包時,大家需要注意引擎版本的使用,將官方版本和自定義版本區(qū)別開,以免效果不符合預(yù)期。
我們的打包流水線如下圖所示,主要包括“Init”、“UpdateRepos”、“StartBuild”、“BuildAndCook”和“Commit”五個階段。

每個階段的具體作用為:
第一階段 Init
與編譯引擎的處理方式一致,確保任務(wù)獨占編譯資源,保證后續(xù)步驟順利進行。
第二階段 UpdateRepos
獲取最新的代碼和資源。游戲客戶端除了涉及開發(fā)代碼和腳本外,還需要有數(shù)據(jù)資源,包括藍圖、配置數(shù)據(jù)、材質(zhì)、模型、場景等等。其中代碼和腳本使用Gitlab管理,數(shù)據(jù)資源使用SVN管理。

在打包的時候,大家需要再創(chuàng)建一個新的工作目錄,把最新獲取的代碼和資源都拷貝到工作目錄中,進行獨立編譯。

第三階段 StartBuild
執(zhí)行編譯前的準備工作。
設(shè)定工程使用的引擎版本,在開發(fā)時是通過右鍵菜單進行選擇,在流水線中則使用VersionSelector.exe命令處理。

選擇引擎后需要對工程生成對應(yīng)的編譯工具,包括:UnrealPak、Bootstrap、CrashReport以及工程,命令如下。

第四階段 BuildAndCook
將游戲工程生成最終能運行的程序或安裝包。其中,Build執(zhí)行的是針對所選平臺編譯二進制可執(zhí)行文件;Cook是針對目標平臺,將所引用的資源轉(zhuǎn)換成對應(yīng)的運行時格式。開始構(gòu)建前,預(yù)設(shè)生成目標路徑和中間目錄,確保生成后的目錄有效,給予下階段使用。

第五階段 Commit
提交構(gòu)建結(jié)果到云空間。我們在開發(fā)階段不管是手動還是每天自動構(gòu)建,都會按照日期存放到公司內(nèi)部的云空間中,方便開發(fā)人員獲取和驗證。

結(jié)合Gitlab實現(xiàn)提交時觸發(fā)構(gòu)建
UWA Pipeline提供了遠程構(gòu)建功能,激活流水線設(shè)置中的遠程構(gòu)建,流水線會生成一個URL地址,我們通過不同的參數(shù)配置觸發(fā)流水線中對應(yīng)的編譯模式,達到和手動選擇參數(shù)一樣的效果。

通過Gitlab的Webhooks填寫對應(yīng)的URL地址,通常在代碼倉庫PR時,就可以自動觸發(fā)流水線運行,從而加快構(gòu)建和部署的頻率,提高開發(fā)效率。

三、服務(wù)器持續(xù)部署的實現(xiàn)
我們使用Linux作為流水線的節(jié)點,用于內(nèi)部游戲服務(wù)的自動構(gòu)建和部署,實現(xiàn)持續(xù)集成。
游戲服務(wù)是一個組件集群,涉及到多個進程和依賴,為了提高構(gòu)建速度、降低部署復(fù)雜度,通常支持一鍵部署。同時為了保證構(gòu)建任務(wù)的互斥和步驟順序的正確,建議大家將節(jié)點的并發(fā)構(gòu)建數(shù)設(shè)為1。同時,至于針對不同測試目的,需要在同一個節(jié)點進行持續(xù)集成。這就需要通過服務(wù)隔離、運行端口分配、第三方組件和使用容器部署等方式,實現(xiàn)多份服務(wù)進程的部署。

在單機部署測試環(huán)境中,將Linux作為流水線運行的節(jié)點時,還需要大家提前配置相關(guān)的數(shù)據(jù)庫、緩存以及游戲服務(wù)所需的運行環(huán)境,我們可以通過容器方式實現(xiàn)快速配置。
我們的服務(wù)器部署流水線如下圖所示,主要包括“Update”、“Build”和“Reboot”三個階段。

每個階段的具體作用為:
第一階段 Update
從內(nèi)部Gitlab拉取最新代碼(C/C++、Lua)和資源配置(Lua、JSON)。通過使用流水線提供的憑證管理和Git組件,在預(yù)設(shè)的工作目錄中獲得最新的代碼和資源。

我們在構(gòu)建之前,通過Pipeline流水線設(shè)置,添加了選項參數(shù)或文本參數(shù),設(shè)置版本目標和操作類型,方便后續(xù)在執(zhí)行部署時能夠根據(jù)需求進行構(gòu)建。

第二階段 Build
進入工程目錄,編譯Framework、依賴庫和游戲代碼,生成so文件和腳本文件。

第三階段 Reboot
根據(jù)預(yù)設(shè)的目標參數(shù),從編譯工作目錄中把執(zhí)行程序、so文件、腳本復(fù)制到目標運行目錄,停止運行過程中的游戲服務(wù)并重啟。

定時構(gòu)建
通過Pipeline提供的自動構(gòu)建方式,設(shè)定好構(gòu)建觸發(fā)器,根據(jù)需求設(shè)定自動構(gòu)建的頻率,就可以在無人值守的情況下,實現(xiàn)流水線的定時自動構(gòu)建。我們現(xiàn)階段的服務(wù)器構(gòu)建僅限用于內(nèi)部測試服使用,固定是每天構(gòu)建一次。

感謝鈦殼樹團隊的精心分享,有相同需求的Unreal團隊都可以參考和借鑒。如果你被這個團隊CEO的能力和態(tài)度所打動,愿意加入廣州鈦殼樹的話,現(xiàn)開放UE4引擎開發(fā)工程師、UE4特效設(shè)計師等崗位,小編也非常樂意為你引薦。再次感謝鈦殼樹團隊對UWA的認可,在游戲行業(yè)工業(yè)化發(fā)展的路上我們又共同邁進了一步。
更多UWA Pipeline使用案例分享可以查看: