2026 年跨端 Flutter/React Native:哪些 CI 階段必須 macOS 雲節點、哪些可留在 Linux——混合流水線決策表與參數清單
熟悉 Linux VPS 的團隊做 Flutter 或 React Native 時,常把「整條移動端流水線」誤當成可均勻攤到 Ubuntu Runner 上的普通 Job:Android 與靜態分析確實能留在 Linux,但 iOS 真機級簽名、Xcode 工具鏈與部分引擎產物仍硬繫結 macOS。本文先編號拆解三類痛點,再給 Linux 與 Mac 階段對照表,隨後給出不少於五步的落地順序、可寫進評審的併發與磁碟閾值,並以 FAQ 說明與站內 Linux iOS 構建邊界及 多 Xcode 並存長文如何互補;讀完你能像擴容 VPS 一樣只給 iOS 段加 Mac 雲槽位。
本文要點
1. 三類痛點:把 iOS 當 Linux Job 的隱性成本
跨端倉庫存量指令碼多在 Linux 驗證,容易預設 iOS 也能共享 Runner;2026 年 Xcode 與 SwiftPM 仍預設 macOS,邊界不清會把失敗偽裝成網路或快取問題。
- 階段錯配導致排障發散:在 Linux 上反覆嘗試接近但仍需
xcodebuild的步驟,會製造與根因無關的長日誌,On-call 在證書與映象缺庫間空轉,浪費 Mac 分鐘同量級的人力。 - 產物傳遞缺少契約:Flutter iOS 引擎、RN Hermes 與 codegen 若未在 artifact 寫明 Xcode 下限與架構,
archive才爆不匹配,回滾牽連已透過 Linux 檢查,形成假安全。 - 佇列與磁碟只在 Mac 側爆炸:
mobile標籤混跑 Android 重任務會佔 macOS 槽位;無獨立DERIVED_DATA_PATH時多分支並行易把 APFS 打到個位數,被誤讀為「蘋果不穩」。
下表分開 Linux 與必須 macOS 階段,便於只擴 iOS 預算。
2. Linux 與 macOS 階段矩陣(Flutter / RN)
矩陣以 2026 常見 CI 為基準;自研容器預編譯請先對照站內 Linux 邊界 FAQ。
| 階段 / 產出 | Flutter 典型命令或目錄 | React Native 典型命令或目錄 | 推薦執行 OS | 備註 |
|---|---|---|---|---|
| 依賴安裝與靜態分析 | dart analyze、flutter test(純 VM) | eslint、tsc、Jest 純 JS 用例 | Linux | 與 iOS 簽名鏈無關的可並行階段 |
| iOS 側 codegen / 預構建 | flutter build ios 前外掛註冊、部分 Pod 準備 | bundle exec pod install(需 Xcode 解析) | macOS | 涉及 Xcodeproj 解析與 Swift 標頭檔案生成 |
| 真 archive / IPA / TestFlight | flutter build ipa、xcodebuild archive | xcodebuild + gym / ASC API | macOS | 與 真機級簽名鏈強繫結 |
| Simulator 錄屏 / UI 快照 | 整合測試需 iOS Simulator | Detox iOS 或 XCUITest | macOS | 無頭模式仍依賴 Simulator 棧 |
| Android 全套 | flutter build apk/aab | Gradle 鏈路 | Linux 或容器 | 可與 iOS 並行獨立佇列 |
linux-mobile 與 mac-ios-only,避免「一個 mobile 標籤打天下」造成 macOS 槽位被 Android archive 佔滿。
3. 七步落地:標籤、產物傳遞與驗收
假設已有可 SSH 的 Mac 雲 Runner;缺基線時先按多 Xcode 文采集首部三元組再拆分。
- 凍結 iOS 工具鏈版本:根目錄寫明 Xcode/Flutter 期望;Mac Job 入口列印
xcodebuild -version與flutter --version,與 Android 解耦。 - Linux 顯式排除 iOS:用環境變數短路
pod install;Android artifact 獨立命名並帶 Gradle 快取鍵。 - Mac 最小輸入:只拉鎖檔案與業務包,避免整倉重複 tarball 浪費傳輸與 NFS。
- 獨立 DerivedData:如
DERIVED_DATA_PATH=$CI_WORKSPACE/dd/ios/$CI_COMMIT_SHORT_SHA,尾部按站內閾值清理。 - 序列 bundler 與 xcodebuild:RN 同機打 bundle 與 archive 時分目錄,降低 Hermes 與 Xcode 爭盤。
- 輕/重兩檔:MR 只做
pod install --deployment與最小build-for-testing;main 夜構建才 archive。 - Runbook 驗收:改 YAML 後記錄 Mac 佇列 p95、job 牆鍾、盤可用率;連續異常先回滾 YAML。
4. 可引用引數與閾值(2026 評審用)
① iOS archive 建議峰值預留約 90~120 GB 可用盤,系統可用低於約 12% 即 fail-fast 停新 archive。② Mac 槽位與佇列深度長期高於約 1:4 時,等待 p95 常超單測牆鍾三倍,應擴 Mac 段。③ 2026 預設無 Bitcode,典型 archive 約 18~35 分鐘(視 Pods/Swift 宏)。④ Hermes 場景 Mac CPU 均值常比 Linux JVM 高約 1.4~1.8 倍,需單獨限制 mac-ios-only 並行。⑤ 單 pipeline iOS artifact 宜控在約 2~6 GB,過大拆符號與 IPA,避免拉取反噬分鐘計費。
5. 常見問題
能否把 pod install 完全放在 Linux 上省 Mac 分鐘?
僅當 Podspec 無 Xcode 指令碼且接受解析差異;多數 RN 仍建議 macOS,否則 archive 集中爆。
Flutter 的 linux 桌面目標與本文關係?
無關;桌面目標用獨立 Runner 池。
與「多 Xcode 並存」長文如何分工?
多 Xcode 文管 xcode-select;本文管跨 OS 階段與標籤;升級需同步兩份 Runbook。
6. 混合拓撲下的 Mac 底座選擇
筆記本或偶發遠端桌面能短期發版,但夜間關機、盤與 Xcode 難入 SLO、企業代理難複製到 CI,會讓 iOS 段不可預測。Linux 扛通用算力、可替換 macOS 節點扛蘋果鏈才是主流;無原生 macOS 硬湊產物只會堆無效日誌與重試。要把 iOS 段做成可預期、可擴容、可 SSH 的池,租賃 VPSMAC 的 M4 Mac 雲主機通常優於混雜桌面:映象、磁碟與佇列可與 Linux 段寫入同一 Runbook,並鏈到站內 SSH 遷移、多 Xcode 與可觀測性長文。