普段は 16GB の MacBook Air で iOS を触っています。Swift の編集は快適ですが、⌘B でフルビルドするとすぐファンが上がり、SourceKit とコンパイラが同じ SSD を奪い合い、カーソルが半秒止まる——この状態ではもうコードが書けません。MacBook Pro を買えば楽ですが、本当に欲しいのは ビルドが手元の唯一のマシンを占有しないこと です。
いろいろ試した末、続いている構成は単純です。軽量 Mac で編集と Git、クラウドの Mac mini M4 で xcodebuild だけ。Xcode 全体を VNC で一日動かすのはやめました(太平洋横断だとローカルよりつらい)。リモートは常時オンのビルド専用機です。
まず切り分け:ビルドか、インデックスか
アクティビティモニタで swift-frontend や XCBBuildService が CPU を食っているならビルドが犯人。SourceKitService だけが常に高いなら、リモートビルドは効きません。Derived Data の肥大や build/ のコミット漏れを先に疑ってください。私は 40GB の古い Derived Data を消したらローカルの増分ビルドが戻りました。リモート化は「重い処理をノートから追い出す」話で、万能薬ではありません。
役割分担
- ローカル: 編集、
git commit、MR の diff、たまに Preview。フル⌘Uはしない。 - クラウド M4:
build/test/archive。証明書と match はこの Keychain だけ。 - 実機: 手元ならローカル接続。それ以外はビルド機。日常のデバッグで VNC はほぼ使わない。
動くまでの手順
1. Xcode バージョン一致。 クラウドが 15・手元が 16 だと Swift で即死、経験済みです。
2. 同期は Git のみ。 ビルド機で git clone。ディレクトリごと rsync しない。
3. Derived Data はリモート固定。 -derivedDataPath ~/Cache/DerivedData。ノートの Derived Data を上げない(Building your app)。
4. Makefile で SSH ビルド。
build-remote: git push origin HEAD ssh $(REMOTE) 'cd ~/workspace/$(REPO) && git pull --ff-only && xcodebuild -scheme $(SCHEME) -derivedDataPath ~/Cache/DerivedData build'
CLI は TN2339。
VNC を開くのはこのときだけ
p12 インポート、Keychain の許可、GUI 専用の Archive チェック。終わったら切断。Swift を VNC で書くのはコスパ最悪です。
3人以上なら同じ M4 を CI に
GitHub self-hosted runner(公式)に載せ、昼は SSH、夜は同じ Derived Data。詳細は runner 構築メモ。
ハマった点
- Derived Data の rsync → 両方のインデックスが壊れた。
Package.resolved未コミット → リモートだけ依存がズレる。- VNC 常時開発 → UI 作業が特につらい。
- 512GB 逼迫 → 長期ディスク を参照。
スペック(ビルドだけ)
M4 / 24GB / 512GB。ASC API や社内 proxy には固定 IP(1 機 1 IP)。
他の選択肢
MBP 14、Xcode Cloud、ハックintosh VM——それぞれトレードオフあり。Windows のみなら Windows + クラウド Mac。APAC→カナダ Release は 公証・Release。
よくある質問
ローカル Run・リモート compile? 公式には無理。VNC か build-for-testing + .xcresult。
太平洋 SSH の RTT? ビルド本体はリモート。ログ待ちなら 200ms 程度は許容。