PR 和模擬器工作一多,Mac Runner 就開始排隊,發布任務也被拖慢。最快的解法不是按開發者人數加機器:先用真實佇列與執行記錄拆分工作負載,再估基線容量,最後以試點決定是否擴容或租用。

這篇適合要規劃 iOS CI 資源並準備採購或租賃申請的企業 IT 负责人。
若你負責 GitHub Actions 自託管 Mac Runner 的路由與排隊治理,文中會提供可核對的資料欄位。
FinOps 负责人也可用本文的變數模型,建立能由團隊記錄重算的預算假設。

先分清平台佇列與 Mac 節點容量

GitHub Actions 自託管 Runner 不會因工作流程已啟動,就自動接下任何工作。工作必須符合 Runner 的標籤和 Runner Group 等路由條件;符合條件的 Runner 忙碌或離線時,工作便可能留在佇列。先確認工作是否「找不到合格節點」,再判斷節點不足,否則加機器也未必能消除排隊。GitHub 說明了自託管 Runner 的工作匹配與排隊規則,亦列出工作流程選擇 Runner 的路由方式。

GitHub 文件中的平台並發限制,與企業自行管理的 Mac 節點容量,是不同層次的問題。查閱Actions 限制說明時,要核對限制適用的產品與工作類型;不要把平台配額直接當成企業應配置的 Mac 數量。

怎樣從 GitHub Actions 排隊情況估算自託管 Mac Runner?

不要只看佇列長度的單一快照。相同的佇列數,可能來自短時間集中提交,也可能是節點長期滿載;兩種情況的擴容方式不同。把工作進入佇列、開始執行和完成的時間,與 Runner 標籤、執行結果及節點識別資料對照,才能分辨路由錯誤、短暫尖峰和持續容量不足。

GitHub 的 workflow_job Webhook 事件可用來追蹤工作狀態,並檢查工作標籤及 Runner 相關欄位。你可把事件記錄與 CI 平台的工作執行紀錄配對,計算排隊時間與實際佔用時間,而不是用團隊人數推估工作量。官方事件文件列出 workflow_job 的事件與 payload 欄位。

工作場景 容量輸入 主要限制 應核對的證據
PR 檢查與一般建置 進入 Mac 工作的頻率、執行時間、同時執行量 通用 lint、文件檢查等步驟未必需要 macOS 流水線步驟、Runner 標籤、佇列與開始時間
模擬器測試與回歸 測試工作數、矩陣展開方式、工作佔用時間 模擬器、Xcode 與測試資料可能限制共用 測試工作紀錄、環境標籤、重試和排隊情況
歸檔、簽名與發布 發布任務時間、觸發方式、排程窗口 憑證權限、受保護環境和發布流程可能要求隔離 發布工作流程、憑證授權與實際執行紀錄
專用工具鏈或遺留任務 特定 macOS、Xcode、架構與工作頻率 不相容的環境不能視為同一個容量池 標籤路由、工具鏈需求、工作失敗及重試紀錄

依工作場景拆分 Mac 建置池

PR 建置和模擬器測試要不要共用節點?

先看限制,不要只看兩者是否都在 macOS 上執行。PR 建置通常較容易拆出不需 Mac 的通用步驟;模擬器測試則可能有工具鏈、測試資料或環境狀態要求。若兩類工作使用不同標籤,或測試環境需要固定版本,應先分開統計需求,再判斷是否能共用節點。

GitHub 的標籤可用於指定自託管 Runner;Runner Group 則能協助管理哪些工作可以使用哪些 Runner。把路由條件寫清楚,才能知道一個工作池是否真的有資格接下某項工作。Runner 標籤文件與Runner Group 說明可供你核對這些設定。

配置方式 適用狀況 主要風險 判斷依據
PR、測試與發布共用池 工具鏈相容,路由和權限要求一致 測試或發布工作佔住一般建置容量 同時執行紀錄、工作等待時間、隔離政策
一般建置與測試分池 模擬器或測試環境有專用要求 池間容量可能無法互相補位 標籤需求、測試尖峰、空閒容量
發布任務獨立池 簽名憑證或受保護環境限制共用 專用資源可能在非發布時段閒置 發布時段、憑證權限、審批流程與真實排隊
遺留工具鏈獨立池 任務只能在特定系統或工具鏈執行 需維護額外環境,彈性較低 工作路由標籤、實際觸發頻率與相容性紀錄

PR、模擬器和發布是否分池,應由實際路由及隔離要求決定。不能只按建置耗時推導可共用程度:簽名任務即使執行時間短,也可能因憑證權限和受保護環境而必須走獨立路由。反過來說,若工具鏈相同、權限政策允許,而且記錄顯示工作能互相讓出容量,分池也未必帶來好處。

專用工具鏈與發布任務的隔離界線

把需要特定 macOS、Xcode 或架構的工作標上可辨識的標籤,並核對工作流程是否確實路由到相應 Runner。標籤名稱本身不是隔離證明:你還要檢查 Runner Group 的存取範圍、憑證可用對象與發布審批設定。

對簽名和發布工作,先查清楚誰能觸發工作、哪些環境可存取簽名資料,以及發布工作是否能與一般 PR 任務共用同一節點。若安全政策要求分離,就把它當作容量池的硬性條件;不要為了提高利用率而把不同信任層級的任務混跑。

用團隊記錄推算基線與尖峰容量

容量估算要同時看工作量與工作重疊,而不是只平均建置時間。對每個工作池,記錄觀察期間內的工作數、每項工作佔用 Runner 的時間、觀察窗口、可接受的利用率假設,以及因維護或不可用造成的折減。再用實際同時執行與排隊資料檢查模型是否低估尖峰。

模型項目 團隊要填入的資料 用途
工作量 指定觀察窗口內,各工作池的任務數 區分一般建置、模擬器、發布與專用工具鏈需求
Runner 佔用時間 工作開始至完成的時間,排除單純佇列等待 換算工作消耗的節點時間
可用窗口 你希望完成該批工作的時間範圍 對應團隊可接受的等待目標
利用率假設 團隊自行設定並以試點驗證的安全餘裕 避免用滿載理想值推算容量
可用性折減 維護、重啟或環境準備造成的實際不可用時間 修正紙面容量與可接單容量的差距
尖峰及隔離需求 同時工作紀錄、路由條件、發布限制 推出峰值與專用池的最低承載要求

對單一工作池,可用「工作數 × 平均 Runner 佔用時間 ÷(觀察窗口 × 利用率假設 × 可用性折減)」估算基線,再依團隊的節點粒度向上取整。這是企業內部的估算模型,不是 GitHub 官方指標,也不會自動保證特定等待時間。尖峰容量則要用實際重疊工作的紀錄校驗;如果模型算出的基線能承接平均工作量,卻仍在集中合併時形成長佇列,就要調整尖峰方案,而不是把平均值當成完整答案。

GitHub 提供 Runner Scale Sets 等擴縮方式,但平台的擴縮機制不會替你決定工作池的安全界線或容量目標。可參考Runner Scale Sets 概念文件及部署與設定說明,再以團隊實際佇列和執行記錄調整方案。

容量試點與擴容里程碑

團隊 iOS CI 負載波動時,如何安排 Mac 節點擴容?

先分清楚尖峰排隊是短暫突發,還是基線容量長期不足。集中合併或回歸測試可能造成短時間需求上升;若工作在尖峰後迅速消化,增加常駐節點未必划算。若佇列持續出現,或關鍵發布工作反覆等待,就應檢查工作池是否不足、路由是否錯誤,以及節點是否受工具鏈和權限限制。

依以下檢查清單完成容量試點;每項都應留下可供 IT、平台工程與 FinOps 一起覆核的記錄。

  • [ ] 從 CI 紀錄匯出工作觸發、排隊、開始、完成和失敗資料,並標明工作池。
  • [ ] 把可改由非 Mac Runner 執行的通用步驟移出 Mac 工作流程,重新統計 Mac 任務。
  • [ ] 依標籤與 Runner Group 核對 PR、模擬器、發布和遺留任務的實際路由。
  • [ ] 將簽名憑證、受保護環境與發布審批列為硬性隔離條件,不能以節點利用率取代安全判斷。
  • [ ] 用工作數、Runner 佔用時間、窗口、利用率假設和可用性折減計算各池基線。
  • [ ] 對照集中提交、回歸和發布時段的同時執行紀錄,推導尖峰與備援需求。
  • [ ] 以試點記錄比較擴容前後的排隊時間、失敗重試和節點可用狀況,再決定常駐或彈性容量。

把試點結果分成基線、峰值和備援三種需求。基線用來承接日常工作;峰值對應已觀察到的突發佇列;備援則處理維護、重啟或特殊工具鏈造成的不可用情況。這三者不必全部轉化為長期自購設備:若尖峰短暫、工作池可清楚隔離,而且租期與交付方式符合團隊排程,可以評估彈性租用;若工作全年穩定且持續高負載,則應把自購或長期配置納入總持有成本比較。

自購、租用與混合配置

每種做法都要計入設備或租期成本以外的項目。自購的成本還包括採購交期、維護、折舊與閒置容量;共享建置機則要處理排隊、環境互相影響及權限邊界;遠端租用也需核實配置、租賃周期、交付方式、資料處理要求和服務是否適配你的工作負載。沒有團隊自己的任務量與預算資料,就不應直接宣稱哪種方式一定較便宜。

你可先對照 VMSPIN 的價格與租期資訊,再確認頁面列出的配置和交付方式是否符合工作池要求。若仍在規劃可行性,先以現有自購設備或暫時保留的容量完成試點;只有在佇列證據顯示需要補充 Mac 資源,而且租用條件可核對時,才把租賃容量納入正式方案。確認符合需求後,可查看 VMSPIN 的 Mac 租用選項。

若你目前以團隊自購 Mac 作為常駐建置機,前期資本投入、設備維護和尖峰以外的閒置,都是需要納入 TCO 的真實成本;若改用一般非 Mac 執行環境,則不能假設它能承接必須由 macOS 與 Xcode 執行的工作。對短期試點、突發回歸或尚未確定長期節點數的團隊,租用 VMSPIN 的遠端 Mac 可作為補充容量的選項;先按工作池核對配置、租期與交付,再用實際排隊記錄決定是否保留。若你的負載長期穩定且持續偏高,或任務必須使用現場實體介面,則不應只為追求彈性而租用,應先比較自購與混合方案的總成本及操作限制。