四組事實把 2026 年 GitHub CI/CD 的臨界點說清楚
在把焦慮量化之前,先看 GitHub 官方與公開資料披露的四組關鍵數字:提交量方面,COO Kyle Daigle 與 CTO Vlad Fedorov 在四月確認 AI Agent 每週向 GitHub 推入約 2.75 億次 commit,全年預估 140 億次,相當於 2025 全年 10 億次的 14 倍;請求量方面,AI Agent 提交的 PR 從 2025 年 9 月的 ~400 萬/月,攀升至 2026 年 3 月的 1700 萬/月;算力方面,GitHub Actions 單週用量從 2023 年的 5 億分鐘,跳到 2026 年 4 月的 21 億分鐘;穩定性方面,僅 2 月就發生 37 次平台事故,4 月 9–13 日 agent 工作階段等候時間從正常的 15–40 秒一度拉到 54 分鐘,請求失敗率高峰 97.5%;5 月 6 日 Copilot Cloud Agents 離線期間 Actions Runner 整體失敗率約 17.1%。這些數字並非個案,而是官方 availability 報告與第三方觀測一致認領的現象。
GitHub 自己也承認問題:Fedorov 把容量規劃從 10x 改寫為 30x、把效能敏感的 Ruby 路徑改寫成 Go、隔離 Git 與 Actions 服務、推出 Stacked PRs 把大型 agent 提交拆成可審閱的小塊、甚至評估讓維護者一鍵關閉 PR 入口。但供應端擴容是遠水救近火,對正在用 GitHub 託管 macOS Runner 跑 iOS 流水線的團隊而言,2026 年下半年「佇列尾延遲與零星失敗就是預設狀態」,不再有「撐過這波」的合理期待。
每週 275M commit:AI Agent 寫入壓力是 2025 全年的 14 倍,每條 PR 同時牽動 Actions、合併檢查、Webhook 與快取,連鎖效應明顯。
每月 17M agent PR:半年成長 4 倍。4 月 23 日單一合併佇列事件影響 658 個儲存庫、2092 個 PR。
每週 21 億 Actions 分鐘:運算與 Runner 池在 AI agent 自動化下被幾何級吞噬,macOS 池壓力遠高於 Linux。
17.1% 失敗率事件:5 月 6 日 Copilot Cloud Agents 故障期間 Runner 分配子系統跟不上 burst,是「中心化 CI 已達臨界點」的典型樣本。
30x 容量目標:從 10x 改 30x 僅花 4 個月,意味著體感壅塞至少持續到 2027 年新資料中心上線。
2 月 37 次事故:SLA 思維須從「機率極低」改為「平均每兩天踩一次」。
四組數字加總在一起,對所有依賴 GitHub 託管 Runner 的 iOS 與 macOS 團隊只有一句話:把流水線穩定性綁死於單一中心化 Runner 池的成本,正被 AI agent 時代重新定價。下兩節分別從 macOS 與「人 vs Agent」兩個維度繼續拆解。
為何託管 macOS Runner 首當其衝:池量、單價與 retry 風暴疊加
GitHub 託管的 Linux Runner 多半跑在通用 x86_64 池內,容量基數大、調度自由度高。macOS Runner 受限於 Apple Silicon 實體機供給與軟體授權,池規模遠小於 Linux,每分鐘單價亦約為 Linux 的十倍。在沒有 AI agent 大量參與的 2024–2025 年,這套架構靠佇列感知與 retry 邏輯可吸收波動。進入 AI agent 時代後,同一儲存庫一次大型重構就可能在數小時內提交數十個 PR,每個 PR 依序觸發 lint/unit/integration/archive/notary 多個工作流,macOS Runner 利用率 ρ 接近 1,排隊論告訴我們等候長度遠在 ρ 達到 1 之前就會爆炸,P50 從分鐘級直接被推到十分鐘以上。
更難處理的是 retry 風暴疊加冷啟動。測試常見的 flaky case 失敗一次,agent 配置的自動重試立刻再次申請 macOS Runner,多個 agent 同時進入「申請—失敗—再申請」迴圈,對分配服務形成 thundering herd。GitHub 託管 macOS Runner 冷啟動需 60–120 秒,對短工作(PR 校驗、lint)成本巨大,對長工作(歸檔、上傳 TestFlight、notary)則因排隊已等十幾分鐘而把 timeout 頂到上限。下表把 Linux、託管 macOS 與獨佔自管 macOS 在 AI agent 流量下的差異列出,可直接貼進 RFC 或採購說明。
| 面向 | GitHub 託管 Linux Runner | GitHub 託管 macOS Runner | 雲端獨佔自管 macOS Runner(KVMNODE) |
|---|---|---|---|
| 池容量 | 大、跨多區 | 小、Apple 硬體供給受限 | 獨佔機器,依訂單可控 |
| 單價 | 低(約 $0.008/min) | 高(約 10x Linux) | 按日/週/月固定,重負載更划算 |
| AI agent 佇列尾延遲 | 分鐘級波動 | 常見 5–10 分鐘以上抖動 | 自家 Runner,依業務安排 |
| 冷啟動 | 10–30 秒 | 60–120 秒 | 常駐 Runner,秒級 |
| 憑證隔離粒度 | workflow 級 | workflow 級 | 帳號、Keychain、Profile 三級 |
| 歸檔/notary 受擾 | 低 | 高(長工作被排隊疊加) | 獨佔節點固定窗口排程 |
2026 年 macOS Runner 的痛點不是「跑得慢」,而是「不知道何時開始變慢」。
若你的 iOS 儲存庫已依 GitHub Actions 自管 Runner 完成組織級 Runner 與並發群組的拆分,下一步就是「按 Agent PR 與人工 PR 分別貼標籤」。若仍是全託管,§4 給出遷出閾值與決策樹。
AI 時代的 CI/CD 安全新維度:Mini Shai-Hulud、Megalodon 與「審 PR」失效
2026 年 5 月,兩起針對 CI/CD 與 AI 工具鏈的供應鏈攻擊,把「自動化提交即審計豁免」的隱性假設徹底擊穿。Mini Shai-Hulud 是 npm 蠕蟲,竊取 GitHub Actions OIDC 權杖以偽造合法的 SLSA/Sigstore provenance,並透過修改 ~/.claude/settings.json、.vscode/tasks.json 等 AI 編輯器/Agent 信任的設定檔 將惡意 hook 寫成「看似合規的開發體驗擴充」;在 Linux 上同步安裝 gh-token-monitor.service,於開發者輪換 GitHub Token 時觸發自毀以拖延應變。Megalodon 則更直接:5 月 18 日 11:36–17:48 UTC 共 6 小時內,攻擊者以偽造的 build-bot、auto-ci、ci-bot、pipeline-bot 身分對 5,561 個 GitHub 儲存庫推入 5,718 個惡意 commit,注入或替換 GitHub Actions 工作流,將 OIDC 權杖、SSH 私鑰、Docker 憑證與雲端密鑰外洩至 216.126.225.129:8443。兩起攻擊的共同特徵:commit 訊息與 author 欄位與正常 CI 維護幾乎一致,且刻意挑「低訊號活動」時間窗。
對 iOS/macOS 團隊意味著什麼?簽章金鑰(Match keychain)、App Store Connect API Key、notary 憑證、profile 與 provisioning,全部集中於 macOS Runner 與 keychain,恰是攻擊者最想用 OIDC 權杖與工作流注入觸及的資產。「PR 讓 reviewer 看一下」這條防線在 AI agent 流量下幾近失效:審閱者每週面對數百個 agent PR,注意力被稀釋,且合法 agent 本就會修改 workflow 檔(升 actions 版、調 cache key),與惡意行為視覺難以區分。以下六條改動方向是把防線下沉的最小集合,建議寫入平台工程季度路線圖。
workflow deny-by-default:儲存庫預設 permissions: {},依工作明確宣告最小 OIDC scope;停用 pull_request_target 或加上必審查設定。
AI agent author 強制驗證:所有 agent commit 必須帶 verified GPG/SSH 簽章 + author email 落在企業 SSO 網域;CI 拒絕匿名 author 觸發 macOS 歸檔與 notary。
憑證沙箱:macOS Runner 上的 keychain、App Store Connect Key、Match 私鑰與 agent PR Runner 完全分離;高敏工作走獨立 self-hosted Runner 標籤,禁止 fork PR 觸發。
OIDC scope 與 PAT 時效:PAT 全面切換為 fine-grained 並縮短 TTL;OIDC subject 收斂至 repo:org/repo:environment:prod,撤銷寬鬆的 workflow_dispatch 權限。
workflow 稽核基線:把 .github/workflows/*.yml 列為受保護檔案,agent 變更須走 protected branch + 雙人覆核;本機 IDE/agent 設定檔(~/.claude/settings.json、.vscode/tasks.json)納入終端 EDR 監控。
出網最小化:自管 macOS Runner 對外白名單僅放行 GitHub、Apple 與模型 API;封鎖未知 IP 的 TCP 8443/443 上行,避免 Megalodon 同款 C2 通道。
這些動作單獨看都不新,但 AI agent 時代首次成為「不做就吃事故」的強制項。繼續依賴 GitHub 託管 Runner 時,憑證沙箱與出網粒度受限於平台預設;獨佔自管節點上,上列六條都能落實到 macOS keychain、launchd、pf 防火牆與 Actions Runner 標籤層。
遷出託管 Runner 的逃生決策樹與 KVMNODE 六區 × M4/M4 Pro 選型
並非所有專案都得立刻遷出 GitHub 託管 macOS Runner。先依四個量化閾值評估「是否該動」:① 每月 macOS Runner 帳單是否已超過等值獨佔 Mac Mini 月租;② P95 佇列等候是否在工作日早晚高峰超過 10 分鐘並阻塞合併節奏;③ 憑證集中度——是否仍有多個 workflow 共用同一 keychain 與寬鬆 OIDC scope;④ AI agent PR 佔比——agent 發起的 PR 是否已超過儲存庫總量 30%。任意命中兩條以上,就把「獨佔自管 macOS Runner」列入下一季技術規劃。下方決策樹可直接複製到規劃文件。
評估閾值:對照月帳單、P95 等候、憑證集中度、agent PR 佔比;命中 ≥ 2 條進入遷移流程。
選區:依 Git 儲存庫與製品倉主區挑 KVMNODE 節點(新加坡/日本/韓國/香港/美東/美西),優先與 Git 同區以降低 clone/cache 拉取尾延遲。
檔位試跑:第一週以 M4 16GB·256 或 24GB·512 同時擔任夜間 spike + 白天 PR runner;週報對照同一批 PR 的 P50/P95。
雙 Runner 佇列:同一獨佔節點上跑兩個 actions-runner 實例,分別貼標籤 self-hosted, macos, human 與 self-hosted, macos, agent,依 PR author 類型路由 workflow。
憑證沙箱:agent Runner 使用獨立 macOS 帳號 + 獨立 keychain;簽章/notary/TestFlight 上傳工作強制限定於 human 標籤 Runner 並啟用 environment 手動核可。
升檔觸發:當夜間出現並行 ≥ 3 個 xcodebuild、模擬器矩陣 + AI agent 回歸測試同窗口衝頂時,升 M4 Pro 64GB·2TB 或並聯第二台節點。
name: ios-ci
on: [pull_request]
permissions: {}
jobs:
lint-and-unit:
runs-on: [self-hosted, macos, agent]
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- run: ./scripts/lint.sh
- run: ./scripts/test-unit.sh
archive-and-notary:
if: github.event.pull_request.user.type != 'Bot'
runs-on: [self-hosted, macos, human]
permissions:
id-token: write
contents: read
environment: prod-signing
steps:
- uses: actions/checkout@v4
- run: ./scripts/archive.sh
- run: ./scripts/notarize.sh
上述最小骨架在二十多行內展示三條核心策略:頂層 permissions: {} deny-by-default、以 Runner 標籤分離 lint/unit 與歸檔/notary、歸檔工作以 if: github.event.pull_request.user.type != 'Bot' 拒絕 AI agent 直接觸發生產簽章。這套隔離在託管 Runner 上亦可表面實作,但只有獨佔節點能與 macOS keychain/launchd/pf 出網白名單同步落地。把這套規範與 多人共用節點 SSH 治理 文的席位與佇列命名約定併用,就能得到「人 + Agent + 多人開發者」三方共享同一獨佔節點的完整 Runbook。
關於檔位與租期:僅 PR 校驗、少量 AI agent + 少量人工開發者的中小型 iOS 儲存庫,M4 16GB·256 或 24GB·512、按月基線 + 高峰按日 spike 通常足夠;帶模擬器矩陣 + AI agent 自動跑回歸 + 同機 OpenClaw 常駐的混合負載,建議直接升 M4 Pro 64GB·2TB。涉及多區分發或全球團隊,依 六區選區與租期 文的 RTT 與同區原則挑選 Git 主區節點;預算允許時在另一區布署第二節點作為 fallback,避免單區故障停擺。
三條寫進採購說明的口徑與方案對比
把前四節抽象成可貼進採購說明與平台工程季度文件的三條硬口徑:① AI agent runner 獨立標籤 + 獨立 keychain/帳號,與人工開發者 Runner 分艙;② OIDC scope 與 PAT 強制短 TTL、最小權限、自動輪換,並以 environment 保護把生產簽章工作與開發工作物理隔離;③ AI agent commit 強制 verified author + workflow 檔加入 protected files,所有 .github/workflows/*.yml 修改走 protected branch + 雙人覆核 + 必跑 lint。任意一條缺失,下一波 Mini Shai-Hulud/Megalodon 級攻擊命中的機率都會被幾何級放大。
4 月 9–13 日 agent session:等候 54 分鐘、失敗率高峰 97.5%——任何把發版窗口固定在工作日的團隊都需要備援路徑。
5 月 18 日 Megalodon:6 小時內 5,561 儲存庫被注入工作流,憑證沙箱與 deny-by-default 是唯一可規模化的阻斷面。
macOS Runner 冷啟動 60–120 秒:與歸檔/notary 長工作疊加後體感等於「PR 半小時不動」;常駐獨佔 Runner 是直接解。
注意:遷出託管 Runner 後,macOS 升級節奏、Xcode 版本、命令列工具與簽章 profile 的維運由你自行承擔。建議固定每週一個升級窗口、對照 Xcode beta release notes 做基線,並把 診斷梯子 的腳本骨架移植成 Runner 健康探針。
替代方案放在一起對比也很必要:繼續 100% GitHub 託管,帳單與佇列尾延遲隨 AI agent 流量呈線性甚至幾何成長,憑證沙箱僅能做到 workflow 級,遇到 Megalodon 同款攻擊只能被動等公告;合蓋 Mac mini 或本機改裝跑 Runner,實體穩定性差、缺乏 launchd 與遠端管理工具鏈,假日斷網即停擺;放在通用雲 VM(非 Apple 硬體)跑 macOS,違反 Apple 授權且效能損耗顯著。對 iOS/macOS CI/CD 與 AI Agent 自動化共存的生產環境,KVMNODE Mac Mini 雲端租用通常是更優解——獨佔 Apple Silicon、7×24 在線、六區可選、按日/週/月彈性下單,並能把人/Agent 雙佇列、憑證沙箱與 OIDC 收緊寫進同一份變更單。檔位見 定價頁、操作見 幫助中心、節點下單見 訂購入口。