在 GitHub Actions 上跑 macOS CI,慢到讓人懷疑人生——這正常嗎?
若你用託管 macos-latest,慢,而且往往先慢在 queue,不是慢在 CPU。 週一上午 push 後 job 在「Queued」掛 20–40 分鐘,iOS 團隊太常見了。
本篇是 L1 專題第二篇:從「排隊到底有多嚴重」出發,對照 self-hosted runner vs macos-latest 的佇列、CI cost 與 xcodebuild,並回答 Cloud Mac 自建 runner 值不值得。執行層為何必須存在:GitHub Runner 為什麼是執行引擎。
直接回答
託管 runner 上的 macOS CI「很慢」通常是正常的——最大瓶頸往往是 build queue,而不是 Apple Silicon 算力。
- 託管
macos-latest:高峰 queue time 20–40 分鐘 不罕見,牆鐘時間波動大 - Cloud Mac self-hosted runner:獨享節點,基本不排隊,
xcodebuild更穩定 - 是否划算:看每月 macOS CI 頻率——每週 <5 次可先託管;日更 iOS CI 且討厭排隊 → 考慮自建
帶著這些問題點進來的?
如果你是因為下面某個具體疑問找到這篇,不用從頭讀——點連結直接跳到對應段落:
- GitHub Actions self-hosted runner macOS 值不值得? → Cloud Mac 真實 TCO + 決策樹
- Cloud Mac 跑 CI 會不會更快? → queue 比 CPU 更傷人
- macos-latest 為什麼總是在排隊? → iOS CI 為何卡在排隊
- self-hosted runner 是不是免費 CI? → 誤判:self-hosted ≠ 免費
- iOS CI 為什麼 build 時間很不穩定? → 效能差異 + 三種方案對照表
三個詞先對齊
macOS CI = 需要 Xcode / Apple Silicon 的 job · Cloud Mac = 常駐 macOS 底座(L0) · self-hosted runner = 在這台 Mac 上接 GitHub Actions 任務的行程(L1)
租 Cloud Mac 不會自動有 runner;裝了 runner 也不等於 CI 免費——只是把 GitHub Actions billing 換成 Cloud Mac 月租 + 維運。
self-hosted runner vs macos-latest:三種 macOS CI 方案對比
效能指牆鐘時間與 queue time 穩定性,非 Geekbench:
| 維度 | 託管 macos-latest |
Cloud Mac self-hosted runner | 本地 Mac self-hosted runner |
|---|---|---|---|
| CI cost 模型 | 按分鐘計費(GitHub Actions billing) | Cloud Mac 月租 + 維運 | 硬體一次性 + 電費 |
| build queue / 等待 | 高峰常排隊 20–40+ 分鐘 | 獨享節點,基本不排隊 | 不排隊(機器在線時) |
| xcodebuild 穩定性 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Apple Silicon CI | 共享池,環境每次可能不同 | 固定 Xcode / 憑證 / DerivedData | 同 Cloud Mac |
| 適合誰 | 低頻 archive、能接受 queue | 日更 iOS CI、討厭排隊 | 已有 Mac mini 且 24/7 在線 |
為什麼 macOS CI 最大成本不是 CPU,而是 queue time?
很多人打開 Actions 日誌,看到 xcodebuild 跑了 18 分鐘,就以為「機器不行」。更傷人的往往是日誌之前——job 狀態一直是 Queued。
對 iOS 團隊來說,牆鐘時間 = queue time + build time + 偶發重試。託管 macos-latest 的 queue 在工作日高峰不可控;你付 macOS 分鐘費,但人等 PR 變綠的時間沒法開票,卻真實消耗研發節奏。
所以判斷「CI 慢」要先拆開:是排隊慢,還是編譯慢? 前者換 self-hosted runner(Cloud Mac 或本地 Mac)收益最大;後者才值得查 Xcode 版本、快取與依賴。
iOS CI 為什麼在 GitHub Actions 上經常「卡在排隊」?
macos-latest 跑在 GitHub 的共享 macOS runner 池裡,供給有限、需求集中:
- iOS CI 只能 macOS:不能像 Node 專案那樣丟給
ubuntu-latest,所有 Apple 生態 job 擠同一類池子 - 高峰疊加:美東/歐洲上午 + 亞洲下午,全球 push 撞在同一時段
- 並發也排隊:workflow 開 3 個 macOS job,不是 3 倍快——往往 3 倍等
- 分鐘費照收:排隊結束後,
xcodebuild每分鐘仍計入 GitHub Actions billing
典型體感:PR 已 review 完,Checks 還黃著——不是程式有問題,是 runner 還沒輪到。 這就是「macOS CI 很慢是正常的嗎」裡「正常」的含義:在託管池上,慢是結構性問題,不是你没配好。
兩個常見誤判
誤判 ①:「上了 Cloud Mac,CI 自然就好了」
Cloud Mac 解決的是有一台常駐 macOS。Claude Code SSH 改程式,和 Actions 在 Linux 上跑測試,可以同時發生——於是「終端裡 Agent 很歡,PR 裡 xcodebuild 報錯」。要消滅 queue,你得註冊 self-hosted runner 並寫對 runs-on 標籤。
誤判 ②:「self-hosted runner = 免費 CI」
GitHub 對 self-hosted 不收每分鐘算力費,但機器錢、Cloud Mac 月租、憑證、值班都是你的。只是把帳單從 GitHub 換成自己的 TCO——沒有誰白嫖 macOS CI。
Cloud Mac self-hosted runner 的真實 TCO 計算方式
別只比標價。真正要算的是:macOS 分鐘數 × 單價 + queue 造成的人等成本 + 維運時間。
① 託管 macos-latest
按實際運行分鐘計費(macOS 單價顯著高於 Linux,以 GitHub 當前價目為準)。零維運,但 build queue 不可控。
粗算:倉庫 Actions → Billing,看 30 天 macOS CI 分鐘數。每月 <200 分鐘且能接受偶發排隊 → 託管往往最省事。
② Cloud Mac + self-hosted runner
成本 = Cloud Mac 月租 + 註冊人力(約 1–2 小時)+ workspace 清理。換來的是接近零 queue time 的 Apple Silicon CI 專機。
經驗閾值(與 L1-Q01 一致):每週 macOS job ≥10 次,且討厭排隊,固定 Cloud Mac 節點的 TCO 往往低於「託管分鐘費 + 等待損耗」。租價見 方案說明。
③ 本地 Mac mini + self-hosted runner
成本 = 硬體 + 電費 + 24/7 在線保證。對照 Mac mini vs 雲端 Mac:本來就要買 Mac 做 iOS 開發,順帶掛 runner 很順;只為 CI 買一台,很多人選 Cloud Mac 更靈活。
託管月成本 ≈ macOS CI 分鐘數 × 每分鐘單價 + queue 造成的人等時間 Cloud Mac 月成本 ≈ 月租 + 輕量維運(換來穩定 queue time) 當 託管月成本 持續 > Cloud Mac 月租 → 考慮 self-hosted(Cloud 或本地)
self-hosted runner vs macos-latest:佇列與 xcodebuild 效能差異
self-hosted 不一定 CPU 更快,但牆鐘時間通常更短、更穩——因為砍掉了 queue:
- queue time:託管共享池 vs 自建獨享 → 最大差異在這裡
- xcodebuild:獨享節點冷啟動與磁碟狀態一致,iOS CI build 時間方差更小
- 並發:一台 self-hosted 預設 1 job;託管可多 job,但 macOS 並發仍要排隊
- 環境:自建固定 Xcode、鑰匙圈、DerivedData;託管每次可能是乾淨但陌生的映像
若 Runner 與 Ollama / Claude Code 搶記憶體導致 Swap,見 AI 工作負載調度——有時「慢」是記憶體,不是 queue。
什麼時候 Cloud Mac 自建 self-hosted runner 更值?
- 每天至少 1 次 iOS CI workflow,且受夠了 build queue
- workflow 含
xcodebuild、簽名、notarize、TestFlight - 希望 push 後 5–15 分鐘內看到 Checks 變綠/變紅(Fact 層不遲到)
- 想在同一 Cloud Mac 跑 Claude Code + CI,減少「SSH 綠了、Actions 紅了」
到這一步,問題不是「要不要 self-hosted」,而是 Cloud Mac 還是本地 Mac 掛 runner。
什麼時候繼續用 macos-latest 更聰明?
- 每月只 archive 一兩次,能接受偶發 queue
- 主倉庫 Linux runner 已全綠,macOS job 很少
- 團隊還在驗證要不要做 iOS——先託管跑通比先租固定節點划算
- 沒人維護 runner 升級、token 輪換、磁碟清理
同一台 Cloud Mac:Claude Code + Runner 現實嗎?
可以。白天 Claude Code 改程式,夜間或錯峰跑重 xcodebuild。16GB 統一記憶體若 Ollama + Runner + Agent 同時滿載會 Swap——CI 反而變慢。系列 Slogan:Claude Code 生產 Diff,GitHub Runner 生產 Fact。
決策樹:queue 忍不了之後怎麼辦?
workflow 需要 macOS / Xcode 嗎?
↓
否 → 繼續 Linux 託管
是 → build queue 能接受嗎?(20–40 分鐘)
↓
能 → 繼續 macos-latest
否 → 每月 macOS job > ~10 次?
↓
否 → 仍可先託管,觀察 Billing
是 → 需要 24/7 在線?
↓
是 → Cloud Mac self-hosted runner
否 → 本地 Mac 自建(保證開機)
務實做法:保留託管,同時租 Cloud Mac 試跑兩週,對比 queue time、GitHub Actions billing 與 xcodebuild 牆鐘時間。
常見問題
GitHub Actions macOS CI 很慢是正常的嗎?
在託管 macos-latest 上很常見。慢往往先發生在 queue,高峰 20–40 分鐘不罕見。
macos-latest 為什麼總是在排隊?
共享 macOS runner 池供給有限,iOS CI 只能擠這一類資源,全球高峰疊加。
GitHub Actions self-hosted runner macOS 值不值得?
日更 iOS CI、無法忍受 queue 時通常更值;低頻 job 先用託管。
Cloud Mac 跑 CI 會不會更快?
不一定 CPU 更快,但基本不排隊,Apple Silicon 上 xcodebuild 更穩定。
self-hosted runner 是不是免費 CI?
不是。GitHub 不收分鐘費,但 Cloud Mac 月租與維運是你的。
iOS CI 為什麼 build 時間很不穩定?
queue 波動 + 託管映像每次可能不同;自建可固定環境與快取策略。
能和 Claude Code 同機嗎?
可以,但要錯峰。見調度文。
macOS CI 慢,不一定是你的 pipeline 寫錯了——先看清是 queue 還是 build,再決定要不要上 Cloud Mac self-hosted runner。
受夠了 build queue?
租 Cloud Mac,對照兩週 queue time 與帳單
Apple Silicon 獨享 macOS,適合掛 self-hosted GitHub Actions runner,把 iOS CI 從 macos-latest 佇列裡撈出來。對照 GitHub Actions billing 與 xcodebuild 牆鐘時間,再決定要不要固定節點。
