GitHub Actions macOS CI 很慢是正常的嗎?排隊時間到底有多嚴重

push 後 workflow 黃著等半小時?多數時候不是 xcodebuild 慢,是 macOS runner 在排隊。

Cloud Mac AI Stack · L1  ·  2026.06.08  ·  約 12 分鐘閱讀

GitHub Actions macOS CI 排隊時間與 self-hosted runner 對比

在 GitHub Actions 上跑 macOS CI,慢到讓人懷疑人生——這正常嗎?

若你用託管 macos-latest慢,而且往往先慢在 queue,不是慢在 CPU。 週一上午 push 後 job 在「Queued」掛 20–40 分鐘,iOS 團隊太常見了。

本篇是 L1 專題第二篇:從「排隊到底有多嚴重」出發,對照 self-hosted runner vs macos-latest 的佇列、CI costxcodebuild,並回答 Cloud Mac 自建 runner 值不值得。執行層為何必須存在:GitHub Runner 為什麼是執行引擎

帶著這些問題點進來的?

如果你是因為下面某個具體疑問找到這篇,不用從頭讀——點連結直接跳到對應段落:

三個詞先對齊

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 timeApple 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 更靈活。

TCO 簡化公式
託管月成本 ≈ 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 忍不了之後怎麼辦?

macOS CI 慢 → 下一步
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 timeGitHub Actions billingxcodebuild 牆鐘時間。

常見問題

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 CImacos-latest 佇列裡撈出來。對照 GitHub Actions billingxcodebuild 牆鐘時間,再決定要不要固定節點。

查看 Cloud Mac 方案
macOS CI Cloud Mac 定價