2026 Flutter/React Native:iOSジョブだけMacクラウドへ、Linuxと併用するCI分割マトリクスと閾値
Dart/TypeScript共有モノレポほど「AndroidがLinuxで回るならiOSも同じRunnerで」と誤配線しやすいが、署名・Xcodeproj・Simulatorは2026年もmacOS前提が強い。本稿は3つの痛み、Linux/macOS別の仕事分担表、Runnerタグとartifact契約を含む7手順、SLOレビュー用のディスクとキュー閾値、そしてLinux側のiOS限界FAQと複数Xcode運用との読み分けFAQをまとめる。
目次
1. iOSをLinux扱いする三つの代償
モバイルとバックエンドを同一K8s感覚で見ると、キュー待ちやAPFS枯渇が「ネットワーク不安定」や「キャッシュ破損」に見える。次の三点をRunbookに書き切ると、Mac分の予算説明が一気に楽になる。
- 段階ミスマッチでトリアージが膨張:Ubuntuで
xcodebuild一歩手前まで進むスクリプトを回すと無関係ログが増え、証明書調査とイメージ差分の往復で有償macOS枠が空振りする。 - artifact契約欠如:Hermes成果物やcodegen出力に最低Xcode版やスライス情報が無いと
archiveで初めて不一致が出て、Linuxで緑だったパイプライン全体の信頼を壊す。 - Mac側だけキューとディスクが爆発:
mobile単一タグだと重いAndroidアーカイブがmacOSスロットを奪い、DERIVED_DATA_PATH未分離の並列ブランチはAPFS空きを一桁GBまで削る。
下表はLinuxに残す処理とmacOS必須処理を切り分けるための2026年ベースラインである。
2. Flutter/RNのステージマトリクス
コンテナでmacOS代替を試す前にLinux限界FAQで違法ショートカットを排除する。
| ステージ | Flutter例 | React Native例 | 推奨OS | メモ |
|---|---|---|---|---|
| 静的解析・VMテスト | dart analyze、VMのみflutter test | ESLint、ネイティブ無しJest | Linux | 高並列で安価 |
| Pods/Xcodeproj | ビルド前プラグイン登録 | bundle exec pod install | macOS | Xcode解釈が必要 |
| アーカイブ/IPA | flutter build ipa | xcodebuild+Fastlane | macOS | 真の署名チェーン |
| Simulator UI | 統合テスト | Detox iOS、XCUITest | macOS | ヘッドレスでもSimulator必須 |
| Androidパッケージ | flutter build appbundle | Gradle | Linux/コンテナ | タグをiOSと分離 |
linux-mobileとmac-ios-onlyの二系統に分け、汎用mobileを廃止する。
3. 七つの導入手順
SSH到達可能なMacクラウドRunnerがある前提。ゴールデンイメージ未整備なら複数Xcode記事のヘッダ3点セットから先に固定する。
- ツールチェーン固定:Xcode/Flutter期待値を文書化し、macOSジョブ冒頭で
xcodebuild -versionとflutter --versionを必ず出す。 - Linuxジョブのガード:環境変数で
pod installをスキップし、署名ホストを装わない。 - Mac入力の最小化:lockfileと中間バンドルのみLinuxから取得し、workspace全体の再アップロードを避ける。
- DerivedData分離:
DERIVED_DATA_PATH=$CI_WORKSPACE/dd/ios/$CI_COMMIT_SHORT_SHAのようにブランチ単位で切り、キュー記事と同じ閾値で掃除する。 - HermesとXcodeの直列化:同一ノードでキャッシュディレクトリを分け、APFS競合スパイクを抑える。
- 軽量/夜間の二段階:MRは
build-for-testingまで、本番相当はmain夜間のみarchive。 - Runbook信号:YAML変更後にmacOSキューp95・壁時計・空き容量を記録し、ノード手直しより先にYAMLロールバックを優先する。
4. 2026年レビュー用の数値
中規模モノレポのアーカイブではDerivedDataとdSYMを含めピークで約90〜120GB空きを見込み、空き率約12%未満で新規archiveを止める。macOSスロット数が持続キュー深さの四分の一未満なら待機p95が単体テスト中央値の三倍を超えやすく、Lint削減よりMac増設が先である。Bitcode無し前提ならアーカイブ壁時計はPodsとSwiftマクロ次第で約18〜35分帯が多い。Hermes有効時はLinux JVM段の平均CPUの約1.4〜1.8倍をmacOS側に見込みmac-ios-only並列を別管理する。単一パイプラインのiOS artifactは約2〜6GBに抑え、シンボルとIPAを分割してダウンロード分の課金を食い潰さない。
5. FAQ
pod installをLinuxで済ませられるか
PodspecフックがXcode不要な稀ケースのみ。多くのRNアプリはmacOS実行が安全で、アーカイブ直前の集中失敗を防げる。
FlutterデスクトップLinuxターゲットは
本稿対象外。別Runnerプールを切る。
多Xcode記事との境界は
そちらはxcode-selectとSDK共存。本稿はOS分割とタグ衛生。アップグレード時は両Runbookを同時更新する。
6. ハイブリッド下でのMac基盤選定
ノート単体や臨時リモートデスクトップは短期リリースには使えるが、夜間電源・Xcode基線のばらつき・企業プロキシ再現性の三点で本番SLOを壊す。Linuxを高密度汎用計算に、置換可能なmacOSノードをApple専用スライスに割り当てるのが定石であり、ネイティブmacOS無しでiOS成果物をねつ造するとログ課金だけが積み上がる。予測可能なキューとSSH運用とディスク方針をLinux SLOと同じ表で管理したいチームにとって、VPSMACのM4 Macクラウドをレンタルする方が混在私物機より安定しやすい。イメージ・DerivedData・可観測性はSSH移行や多Xcode記事と一直線に揃えられる。