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をまとめる。

クロスプラットフォームモバイルCIとMacクラウドRunner

目次

1. iOSをLinux扱いする三つの代償

モバイルとバックエンドを同一K8s感覚で見ると、キュー待ちやAPFS枯渇が「ネットワーク不安定」や「キャッシュ破損」に見える。次の三点をRunbookに書き切ると、Mac分の予算説明が一気に楽になる。

  1. 段階ミスマッチでトリアージが膨張:Ubuntuでxcodebuild一歩手前まで進むスクリプトを回すと無関係ログが増え、証明書調査とイメージ差分の往復で有償macOS枠が空振りする。
  2. artifact契約欠如:Hermes成果物やcodegen出力に最低Xcode版やスライス情報が無いとarchiveで初めて不一致が出て、Linuxで緑だったパイプライン全体の信頼を壊す。
  3. 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 testESLint、ネイティブ無しJestLinux高並列で安価
Pods/Xcodeprojビルド前プラグイン登録bundle exec pod installmacOSXcode解釈が必要
アーカイブ/IPAflutter build ipaxcodebuild+FastlanemacOS真の署名チェーン
Simulator UI統合テストDetox iOS、XCUITestmacOSヘッドレスでもSimulator必須
Androidパッケージflutter build appbundleGradleLinux/コンテナタグをiOSと分離
タグ設計linux-mobilemac-ios-onlyの二系統に分け、汎用mobileを廃止する。

3. 七つの導入手順

SSH到達可能なMacクラウドRunnerがある前提。ゴールデンイメージ未整備なら複数Xcode記事のヘッダ3点セットから先に固定する。

  1. ツールチェーン固定:Xcode/Flutter期待値を文書化し、macOSジョブ冒頭でxcodebuild -versionflutter --versionを必ず出す。
  2. Linuxジョブのガード:環境変数でpod installをスキップし、署名ホストを装わない。
  3. Mac入力の最小化:lockfileと中間バンドルのみLinuxから取得し、workspace全体の再アップロードを避ける。
  4. DerivedData分離DERIVED_DATA_PATH=$CI_WORKSPACE/dd/ios/$CI_COMMIT_SHORT_SHAのようにブランチ単位で切り、キュー記事と同じ閾値で掃除する。
  5. HermesとXcodeの直列化:同一ノードでキャッシュディレクトリを分け、APFS競合スパイクを抑える。
  6. 軽量/夜間の二段階:MRはbuild-for-testingまで、本番相当はmain夜間のみarchive
  7. Runbook信号:YAML変更後にmacOSキューp95・壁時計・空き容量を記録し、ノード手直しより先にYAMLロールバックを優先する。
stages: [lint_linux, ios_mac] lint: tags: [linux-mobile] script: ["flutter test --exclude-tags=ios-integration"] ipa: tags: [mac-ios-only] script: ["xcodebuild -version", "flutter build ipa --release"]

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記事と一直線に揃えられる。