如何建設一個用於編譯 iOS App 的 macOS 雲伺服器叢集?

2023-04-25 18:01:37

作者:京東零售 葉萌

現代軟體開發一般會藉助 CI/CD 來提升程式碼質量、加快發版速度、自動化重複的事情,iOS App 只能在 mac 機器上編譯,CI/CD 工具因此需要有一個 macOS 雲伺服器叢集來執行 iOS App 的編譯。

今天就來談談如何建設 macOS 雲伺服器叢集

購買 mac mini / Mac Studio 機器

最簡單的方式就是購買一批 mac 機器,買它個 1000 臺,買回來後放入機房,把其中一臺機器作為管理機,申請辦公網存取這臺機器的網路許可權,每次要維護這批機器裡的軟體時,先從辦公網進入管理機,然後從管理機在遠端連線到其他機器。

虛擬化 macOS 叢集

藉助 macOS 官方的Virtualization.Framework,可以分鐘級建立 macOS 虛擬機器器,這種方式建立的虛擬機器器效能、穩定性、安全性都很高,可以持續採用更新、更快、更高階的 mac 硬體,最終實現更快的 App 編譯速度。

在企業內部申請 macOS 機器,需要經歷申請預算、領導審批、採購、運輸、部署至機房等繁瑣步驟,現在可通過購買高設定的 mac 機器,然後再將其按需設定成多臺虛擬機器器,減少了硬體維護成本,提高了擴容效率。這方面代表性產品有

行動端 CI/CD 平臺 bitrise 採用的是這種方式,只不過他們做了很多自研工作,打造了Gen2編譯基礎設施,宣稱能讓客戶更快、更頻繁的釋出 App

雲端管理 macOS 伺服器

自行購買並維護 mac 機器還是不太方便,成本很高,如果能雲端管理、按需付費就更好了。亞馬遜的 AWS 解決了這個問題,他家的Amazon EC2 Mac Instances能讓我們按需申請 macOS 伺服器,如果能接受雲端服務的話,其實這種方式最省事。與這種服務類似的產品有

在 linux 裡執行 macOS 虛擬機器器

sickcodes/Docker-OSX是最近流行的一個專案。

  • 藉助 KVM 技術,實現了在 linux 裡執行 macOS 虛擬機器器

  • 藉助 docker,簡化了 macOS 虛擬機器器的部署

這個專案具有很多優勢,例如

  1. 不依賴專門的 Apple 硬體,能夠執行 KVM 的 x86_64 機器就行

  2. 能夠通過 docker 容器來部署 macOS 虛擬機器器。未來藉助 k8s,能夠實現大規模 macOS 伺服器的管理,輕易實現擴縮容

也有風險

  1. 不太合規,macOS 正常只能在 Apple 硬體上執行

  2. 在 KVM 裡執行 macOS,相容性、效能、穩定性需要評估。如果出現問題需要付費找專案維護者解決

我在裸金屬上利用 Docker-OSX 專案確實跑起來了 macOS 虛擬機器器。執行該專案有以下幾點要注意

  1. linux 宿主機需要支援巢狀虛擬化(Nested Hardware Virtualization)。開啟硬體虛擬化後才能安裝 kvm。裸金屬和物理機正常都支援

  2. 對 Linux 核心有要求,作業系統最好比較新,CentOS 8 可以,CentOS 7 不行

在 Apple 硬體上用 k8s 來排程 macOS

有沒有可能在私有云裡實現 aws 這種 mac 管理體驗呢?MacStadium家的 Orka 平臺做到了。Orka 有以下好處

1 - 降低了 mac 叢集的管理成本
花時間更少,例如管理伺服器、在伺服器上安裝軟體

利用 Kubernetes 排程 mac 伺服器,這與 Linux 伺服器的管理保持一致,方便融入公司已有技術棧

2 - 在真正的 Apple 硬體上執行 mac 虛擬機器器
不用擔心相容性、穩定性、效能問題

3 - 用心為開發者設計
提供多種操作方式(命令列、REST API)來管理 mac 虛擬機器器

對於企業來說,可以考慮購買 Orka 平臺,在私有云裡面搭建 macOS 雲伺服器叢集。GitLab SaaS 版也是使用這種方式來提供託管的 macOS Runner 的

總結

我講了建設 macOS 雲伺服器叢集的 5 種方式,這些方式各有利弊,總的來說:

  • 如果能接受使用雲伺服器,建議直接購買 AWS 的 Amazon EC2 Mac Instances,方便、成本低

  • 自建機房,如果計劃建設的 macOS 叢集規模很大,建議購買 MacStadium 的 Orka 平臺來建設,專業服務,避免踩坑,省時省力

  • 自建機房,如果 macOS 叢集規模比較小,對自動化要求不高,建議購買高配的 apple 硬體,然後通過Virtualization.Framework虛擬化出多臺 macOS 機器,整體架構比較簡單,也能解決問題