DevOps / CI·CD
2026年3月31日
在雲端 Mac mini M4 上部署 GitHub Actions 自託管 macOS Runner(2026 實戰指南)
MacXCode 技術團隊
2026年3月31日
約 12 分鐘閱讀
GitHub 託管的 macos-latest Runner 很方便,但 iOS 團隊常遇到瓶頸:冷快取、發版週排隊、或必須把專有工具鏈留在磁碟上。在租用的 Apple Silicon Mac上部署自託管 Runner可獲得持久 DerivedData、可預期效能與區域選擇——尤其當機器位於港/日/韓/新/美且靠近開發者時。本文預設你已讀過Mac mini M4 租購 TCO,並準備把 GitHub Actions 接到可 SSH 的硬體上。
2026 年何時該用自託管 macOS Runner
- 長時間
xcodebuild流水線 — 熱快取每次都能省下數分鐘。 - 自訂 SDK 或內部框架 無法上傳到 ephemeral Runner。
- 合規 — 作業不離開合約約束下你控制的 Mac。
- 並行發布線 — 每應用獨立 Runner 與隔離鑰匙串。
現實提醒:自託管 Runner 會執行儲存庫中的任意程式碼。請依生產伺服器標準加固——專用系統使用者、防火牆、輪換權杖與監控。
執行 ./config.sh 前的安全清單
| 控制項 | 建議 |
|---|---|
| SSH 暴露面 | 僅金鑰登入、非預設埠、盡量 IP 白名單。 |
| Runner 使用者 | 非管理員自動化帳號;僅在必要時 sudo。 |
| 金鑰 | 生產部署類 Job 使用 GitHub Environments + 必選審批人。 |
| 工作區 | 敏感儲存庫定期清理 _work 或每 Job 使用可丟棄目錄。 |
在 MacXCode 節點上的安裝流程
- SSH 登入 — 依租約郵件中的埠與使用者連線;確認已裝 Xcode CLT 或完整 Xcode。
- 建立目錄 —
mkdir ~/actions-runner && cd ~/actions-runner。 - 下載 Runner — 在 GitHub「Add runner」介面複製 macOS arm64 壓縮包位址(Settings → Actions → Runners)。
- 設定 — 使用短效權杖執行
./config.sh --url https://github.com/ORG/REPO --token RUNNER_TOKEN。 - Labels — 新增如
macxcode-m4、ap-sg、xcode16等唯一標籤,便於runs-on命中正確池。 - 服務化 —
./svc.sh install後./svc.sh start,保證重啟後仍線上。
涉及 GUI 的步驟(如首次鑰匙串彈窗)可暫時使用 VNC,再回到無頭 GitHub Job——與雲端 Mac 上 SSH 與 VNC一文中的模式一致。
Workflow 片段範例
runs-on: [self-hosted, macxcode-m4]
在 setup 步驟用 DEVELOPER_DIR 或 xcode-select 固定 Xcode。簽章資源放在 Runner 使用者的登入鑰匙串,並對 CI 使用 security set-key-partition-list。更完整的 Archive 流程見Xcode 遠端建置指南。
GitHub 託管 vs 租用 M4 上的自託管
| 維度 | GitHub 託管 | 自託管雲 Mac |
|---|---|---|
| 上線時間 | 零基礎設施 | 一次性安裝 Runner |
| 快取熱度 | 常冷啟動 | 持久磁碟 |
| 區域 | 選擇有限 | 可選港/日/韓/新/美節點 |
| 安全責任 | GitHub 代管 | 需自行加固 SSH 與系統 |
常見問題
| 問題 | 回答 |
|---|---|
| 一個 Runner 能服務多個儲存庫嗎? | 組織級可以,但請隔離金鑰;生產與實驗儲存庫建議分機。 |
| GitLab 或 Jenkins 呢? | 思路類似——仍是裸金屬 M4 + SSH;更換對應 Agent 安裝方式即可。 |
| 網路拓撲示意圖在哪? | 見 MacXCode 說明中心 的 SSH/VNC 範例。 |
為何 GitHub Actions 宿主仍選 Mac mini M4
Runner 長時間編譯 Swift;M4 效能核心與高速 NVMe 讓佇列延遲保持穩定。相較 oversized VM,Mac mini 閒置功耗低——工作流程夜間暫停但 Runner 仍需線上時尤其重要。MacXCode 在全球提供帶 SSH 與可選 VNC 的物理 Apple Silicon,與 GitHub 標籤預期一致,由你的自動化帳戶持有。
從定價頁開通節點,完成安全清單並註冊 Runner,然後發出首個 workflow_dispatch——第二次建置你就能感受到差異。