截至 2026 年 9 月 4 日,GitHub Actions macOS Runner 仍應按「成功建置的總成本」而不是分鐘單價選擇。 GitHub Actions 的工作可按執行分鐘計費,官方計費文件也將 macOS Runner 列為獨立計費類別:GitHub Actions Runner 計費規則。本週先匯出最近一個完整週期的任務、排隊和失敗重跑資料:低頻、短任務、維護人手有限,先用托管 Runner;高用量、固定 Xcode 環境或需要私有網路,才進入自託管 Mac 評估。
這篇適合三類人:
- GitHub Actions macOS 任務經常排隊或超時的 DevOps 工程師。
- 需要估算 iOS 建置總成本的團隊負責人。
- 準備部署自託管 Mac Runner 的平台工程團隊。
Last updated:2026 年 9 月 4 日。 本文資料核實自 GitHub 官方 Runner 規格、計費、限制、映像檔與自託管文件;費率、並發上限、映像檔標籤和 Xcode 27 預覽狀態更新後,應重新計算。
先用總成本模型,而不是只看分鐘價格
托管 Runner 的帳單容易讀,決策卻不應停在帳單。你需要把同一批 iOS 工作、同一個統計週期放在一起比較。建議建立以下模型:
有效 CI 成本 = 建置分鐘費 + 失敗重跑成本 + 排隊等待成本 + 快取失效成本 + 維護工時成本。
其中,建置分鐘費來自 GitHub Actions 官方計費;自託管 Mac 則要換成設備或租賃、網路、儲存、監控和替換節點的成本。GitHub 的自託管文件明確指出,主機的作業系統、軟體、硬體、網路和安全維護由你負責:自託管 Runner 的責任範圍。
排隊等待也要量化。開發人員等待 Pull Request 檢查完成,會延後合併;發版工作排隊,則可能影響上架窗口。失敗重跑同樣不能忽略:一次因環境漂移造成的重跑,會同時增加分鐘用量和工程師排查時間。
| 評估項目 | 托管 macOS Runner | 自託管 Mac Runner |
|---|---|---|
| 計費方式 | 按工作執行分鐘與方案規則計費 | 設備或租賃、網路、儲存及維護人力 |
| 環境版本 | 由官方映像檔與標籤提供,更新較快 | 可固定 macOS、Xcode、SDK 和依賴版本 |
| 快取 | 依工作流程設定,節點通常不作長期保存 | 可保留 DerivedData、套件和模擬器資料 |
| 並發擴充 | 受團隊方案與可用容量限制 | 透過增加節點,但要自行處理排程與故障 |
| 私有資源 | 需設計安全連線方式 | 可直接放入指定私有網路,但風險由你承擔 |
| 維護責任 | 主機替換和基礎映像由平台處理 | 你負責更新、清理、監控、隔離和復原 |
並發與隊列:用尖峰容量反推 Runner 數量
月度總分鐘只能告訴你用了多少,不能告訴你為何每天排隊。容量估算至少要記錄三個欄位:
- 尖峰時段每個時間窗口新增多少建置任務。
- 每項任務的平均執行時間,以及偏慢任務的百分位時間。
- 你接受的目標等待時間,例如 Pull Request 檢查和夜間發版可設定不同目標。
可以用一個簡化模型開始:
所需並發 ≈ 尖峰期間每個時間單位的任務量 × 平均建置分鐘 ÷ 同一時間單位的可用分鐘。
然後再用實際排隊紀錄校正。平均值不夠時,應看第九十五百分位建置時間,否則一個大型測試工作就會讓估算失真。
GitHub 的限制文件列出工作執行時間、並發和其他 Actions 限制;單一工作最長執行時間是 6 小時,但你的團隊方案、工作類型和 Runner 可用量仍可能帶來額外限制,應以官方 Actions 限制文件為準。選擇 Runner 時,也要確認工作流程的標籤與作業系統要求是否相符:官方 Runner 選擇說明。
若只有發版日出現排隊,先採混合方案通常比全年維持大量自託管節點更合適。若每次提交都需要 macOS 建置,且排隊時間在整個週期持續偏高,再評估常駐自託管容量。
固定環境與快取:速度差異不等於穩定性差異
托管映像檔的優勢是取得環境快,缺點是映像版本會持續更新。官方 Runner Images 專案會記錄映像檔變更;因此,標籤、預裝工具、Xcode 和 SDK 更新都應納入你的變更追蹤:Runner Images 更新記錄。
遷移到 Xcode 27 時,請在建置日誌和工作流程中固定記錄:
- macOS 與 Xcode 版本。
- SDK、Swift 工具鏈及主要套件版本。
- CocoaPods、Swift Package Manager 或其他依賴的鎖定檔。
- DerivedData、套件下載和模擬器快取的策略。
- 簽名設定、Export Options 與建置產物雜湊。
這樣才能判斷「程式碼改動」還是「映像改動」造成結果不同。不要只寫 macos-latest 就認為環境永久一致。
快取也有兩面。依賴下載、DerivedData、模擬器和建置產物都會影響任務時間,但快取內容過期或被污染,也會造成難以重現的錯誤。GitHub 官方文件說明了依賴快取的鍵值、還原鍵和使用方式:Actions 依賴快取文件。
自託管節點的持久硬碟可保留快取,卻把清理責任交給你。你需要設定容量警報、定期刪除舊模擬器和過期產物,並在每次工作完成後清理敏感資料。否則「快取節省的分鐘」可能換來磁碟不足或憑據外洩。
想進一步比較固定 macOS 環境和雲端設備的取捨,可參考Apple Mac 雲端設備評估方法,再把你的 CI 快取和 Xcode 版本要求放進評估表。
經驗提醒: 先把快取命中率、下載時間和清理失敗次數寫入 CI 指標。沒有這些資料,就不能把自託管的較短單次建置時間直接當成長期節省。
簽名、私有網路與權限要分開設計
iOS CI/CD 最敏感的部分通常不是編譯,而是簽名。托管 Runner 適合在工作結束後丟棄環境,使用短期憑據和受限權限完成必要工作。自託管 Mac 若保留 Keychain、Provisioning Profile 或私有套件憑據,則必須當成高敏感度節點管理。
建議按以下順序落地:
- 建立專用 Runner Group,只讓發版工作流程使用。
- 為 Runner 設定清晰標籤,例如作業系統、Xcode 版本和是否具備簽名能力。
- 把簽名節點和一般測試節點分開,避免所有 Pull Request 都能接觸憑據。
- 僅允許受保護分支或已核准工作流程使用簽名環境。
- 將證書、私密金鑰和 Profile 放進受保護 Keychain,不寫入程式庫或日誌。
- 設定證書輪換、撤銷、備份和故障替換流程。
- 為自託管節點限制出站連線,並監控工作完成後是否仍有程序或檔案殘留。
GitHub 建議在新增自託管 Runner 時審慎評估不可信工作流程,因為 Runner 可能接觸程式碼和工作流程權限:新增自託管 Runner 的安全提醒。你也可以用 Runner Group 控制哪些儲存庫能使用特定節點,並以標籤避免工作被派到錯誤環境:Runner Group 官方文件。
決策條件:符合哪一邊就先選哪一邊
- 若每週任務量低、建置時間短,而且沒有人能處理 macOS 更新,就選托管 Runner。
- 若任務量穩定、快取可明顯保留,且你能安排節點監控與證書輪換,就評估自託管 Mac。
- 若私有網路或內部套件是必要條件,就優先測試自託管安全架構;若無法隔離不可信分支,先回到托管 Runner。
- 若只有發版尖峰排隊,就採混合模式:日常檢查使用托管 Runner,固定環境或內網工作使用自託管節點。
- 若自託管節點故障後不能在無人值守情況下恢復,就不要把全部 CI 遷移過去。
FAQ:把選型問題轉成可驗證的資料
以上方法可先協助你建立基準。若團隊同時處理 AI 或自動化工作,應把非 CI 任務與建置工作分開核算,避免混淆資源需求;相關的低成本軟體與雲端運作評估也可用相同思路拆分固定成本、用量成本和維護時間。
試運行與驗收:先用同一批工作測試
不要用某一次最快建置結果下結論。準備一個固定試運行週期,使用相同提交、相同測試集合和相同簽名流程,在托管與自託管兩邊各自記錄:
- 任務成功率與失敗重跑次數。
- 平均及第九十五百分位排隊時間。
- 平均建置時間、快取命中率和依賴下載時間。
- 失敗後恢復所需的人力與時間。
- Xcode、SDK、依賴和建置產物是否可重現。
- 憑據是否只在指定工作流程和指定 Runner Group 中可見。
- 每個成功建置的有效成本,而不是單次任務的分鐘價格。
若自託管的速度優勢只在快取未清理、節點沒有故障時出現,就不能把它當成正式成果。相反,若托管 Runner 的排隊時間才是團隊真正的瓶頸,增加固定自託管容量也未必能處理短暫尖峰;混合模式可能更貼近實際工作量。
目前使用托管方案的缺點是:尖峰時段可能排隊、映像更新需要重新驗證,而且持久快取與私有網路整合受工作流程限制。完全自託管則會增加硬體或租賃費、節點維護、證書安全和故障替換責任。若你需要固定的 macOS、Xcode 27 測試環境,又不想自行準備實體設備,可以把 Hashvps 的雲端 Mac Runner 作為試運行選項;先用上述指標驗收,再決定是否擴大使用,而不是先承諾長期遷移。
開始前,請先整理月度任務、尖峰並發、平均建置時間、私有網路需求和簽名風險。只有當自託管的總成本與恢復能力都通過驗收,才值得把它從備援方案提升為主要 Runner。
FAQ
為 macOS CI/CD 選擇更靈活的執行環境
Hashvps 提供遠端 Mac 租用,讓團隊按需取得穩定的 macOS 建置與測試資源。
無需自行採購硬體或處理日常維護,即可快速部署適合自託管流程的 Mac 執行節點。