SSH / VNC ガイド 2026年4月25日

貸出 Mac mini:VM スナップショットなしの DerivedData & iOS シミュレータ並列 QA レーン 2026(VmMac 版)

VmMac エンジニアリングチーム 2026年4月25日 約 22 分

モバイル QA リーダが VmMac から Apple Silicon Mac mini を借りるとき、多くのチームは頭の中に 仮想マシン(VM)の常識を持ち込みます。ビルドの匂いが違うと、いったんスナップショットへ戻す。しかし ベアメタルの macOS には差分ディスクの巻き戻しがありません。本稿の 2026 年版は、並列の DerivedData 根CoreSimulator 用のホストホーム、そして数分で終わる スクリプト掃除によって、無菌室に近い分離を作り直す手順をまとめたものです。比較マトリクス、9 段の導入、数値上の枠、そして 香港・日本・韓国・シンガポール・米国 のホスト横断チェックを用意しました。成果物をシステム巻から完全に退避させる設計は APFS セカンダリボリュームと CI 分離と、セッション単位の衛生は 使い捨て QA ラボと SSH / VNCと併読してください。

接続のしやすさのため、接続手順を常に同じ場所に置き、シミュレータ画面が必要な担当には任意で VNC レーンを文書化します。ホストを「コンパイル専用」と「UI 重め」に分けるときの費用感は、料金ページでリージョンとプランを揃えて比較すると議論が速いです。

本物の iOS パイプラインでは、いつ VM スナップが通用しなくなるか

スナップショット巻き戻しは、一見美しい解ですが、Metal の実機に近い性能熱の挙動、あるいは ゴールデンイメージに乗らない新版 Xcodeを求めた瞬間、設計の前提が揺れます。チームは三枚の壊れかけイメージの間を「スナップの縄跳び」し、CocoaPods のキャッシュと watchOS コンパニオンの取り扱いがイメージごとに違います。VmMac 上では 物理の Apple Silicon 上で動かすのが正なので、勝ち筋は 名前空間の分離、つまり一つの巨大ディスクの写しではなく、多数の小さな世界(ディレクトリ+環境変数)の束です。

  • デフォルトの DerivedData に混ざると、部分クリーンのあとも 古いモジュールマップが残る。
  • UI テストで MDM や SSO のクッキーを入れたあと、シミュレータのキーチェーンがスープ化する。
  • 共有のホームから Fastlane match やプロビジョニングを読むと、レーン境界なしでプロジェクト横断の染み出しが起きる。
数にした痛み:場当たり的な xcodebuild clean だけに頼るチームは、一事件あたり 28〜40 分のスループット損失を計測しています。一方、レーン木のフォルダ削除は、インデックスを盲断削除から外す前提で、M4 世代では多くの場合 6 分未満に収まります。

マトリクス:並列レーンとハイパーバイザのスナップ、そして第 2 巻

手口 巻き戻しの速さ 影響範囲 オペレータの要求
VM スナップショット戻し 1〜3 分 OS 全体 ハイパーバイザとイメージ統治
並列 DerivedData + シミュレータ用ホーム 4〜8 分(スクリプト) 一レーン分の木 Bash と Xcode CLI の読み書き
APFS セカンダリ CI 巻 巻消しポリシーに依存 巻の範囲 diskutil とマウント規律

真ん中の行は、日々のフィーチャブランチ向けのスイートスポットです。PR ごとに安く回せ、昨日の DerivedData が今日の UI スナップショット比較を汚染しない強さを持ちます。1 レーン当たり 18GBを超えた二進や、消去の意味論に暗号消去の監査条項をかけたい場合は、三行目の巻分離に寄せます。

自動化のあとも破綻しない DerivedData レーンの掛け方

CI では Xcode のデフォルト頼みにしないでください。明示パスにして SSH セッションと launchd エージェントの双方が同じ文字列を踏みます。

xcodebuild -scheme 'App' -destination 'platform=iOS Simulator,name=iPhone 16' -derivedDataPath '/Volumes/VmMacWork/lanes/lane-pr-4821/DerivedData' build test

フォルダ名に PR 番号かコミット短縮子を焼き、72 時間より古い木を消すジョブが Git へ問い合わせずに動くようにします。人間用に lane-current の一つのシンボリックリンクを置いてもよいのですが、自動化は常に 絶対パスへ。初級のスクリプトが相対辿りで上の階層の木を消す、という事故はシンボリックリンク周辺で起きがちです。

Swift Package Manager を Xcode と併用するなら、同じレーン根の下に SWIFT_PACKAGE_CACHE_PATH を合わせ、モジュールキャッシュが交差しないようにします。ここを抜かすと「クリーン Mac を借り直したら通る」テスト失敗、つまり EXC_BAD_ACCESS の揺れが戻ります。並列レーンの思想そのものを打ち砕く典型です。

CoreSimulator 名前空間、ディスク圧、UI テスト

シミュレータは Library/Developer 配下に大量のバイトを書きます。使用している Xcode 版の文書に従い、CORESIMULATOR_HOST_HOME など、レーン専用ディレクトリを高速なストレージ上へ向けてください。破壊的削除の前に xcrun simctl shutdown all で止め、ファイルロックに掃除が引っかからないようにします。

信号 しきい値 行動
Data 巻の空き APFS 22GB 未満 古いレーン木を先に消す。24h 未満なら責任者にページ
シムランタイム起動失敗 時間あたり 3 回超 当該レーンの CoreSimulator ホームだけ再生成
CI ログに重複 UDID 1 件でも パイプラインを止める。二系統が一つのデバイス集合を共有

写真・連絡先・音楽周りの UI テストは、個人のノートPCからのコピーではなく、私設アーティファクト庫に入れた固定データ束から与える。そう初めて「僕のマシンでは通る」が、VNC 裏口から戻らなくなります。

再現性の高い「無菌室」を作る 9 ステップ

  1. 全リージョンで同名の、書き込み可能な作業用マウント、例 /Volumes/VmMacWork を用意する。
  2. ジョブ開始前に lanes/<id>/{DerivedData,CoreSim,spm-cache,logs} を作る。
  3. SSH ログインスクリプトでレーン限定の環境変数を export し、欠落ならビルドを拒否する。
  4. ホスト階層ごとに xcode-select パスを固定し、メジャー更新は 7 日の重畳期間を取る。
  5. シミュレータを止め、レーン木を消し、空ディレクトリを作り直し、du -sh の基準を 512MB 未満で確認する。
  6. 5 分のスモークで、拡張ターゲットの境界まで触る。
  7. xcresult をオブジェクトストレージに退避し、次レーンのディレクトリへ混ぜない。
  8. 署名のローテは、環境別キーチェーンを読む Fastlane レーンからだけ通す。
  9. 週次で、掃除スクリプトのチェックサムを HK / JP / KR / SG / US 各ホストで揃ったか点検する。
境界線:同時に二つの Jenkins か GitHub Actions ランナーに、同じレーンパスを指させない。ファイルロックは分離の代替ではありません。

VmMac 上の五リージョン規律(香港・日本・韓国・シンガポール・米国)

遅延は違うが、パスとスクリプトは違わせない。東京の開発者がシンガポールのコンパイル用ホストに SSH したとき、RTT より パスのドリフトの方が高くつく。レーン根は同じ相対位置のマウントに置き、掃除スクリプトは git のタグで揃え、sysctl hw.memsize の前提を確認したうえで、16GB SKU と 24GB SKU のどちらに三列 UI テストを載せるか判断します。

法務上データ所在地が絡むなら、顧客フィクスチャを含む DerivedData を承認巻方針に乗せる。それでも APFS 分離の表に沿いつつ、アプリ本体の YAML は 国ごとに分岐させない。

ダッシュボードに載せるべき数値予算としきい値

名案を Wiki に書いただけではインフラにはなりません。レーン破棄のたび 一行 JSONに所要ミリ秒、回収バイト、git SHA を出し、Grafana 側でマージ勢いとディスク急増を重ね合わせます。中央の破棄が 540 秒を越えたら、多くの場合、回転体か Spotlight のインデックスに負けています。NVMe 配下のマウントへ移すか、CI 専用巻に mdutil -i off(セキュリティレビュー後)を検討します。

  • レーン寿命 TTL:タグ KEEP=legal-hold 無しの lanes/ 下は、既定で 72 時間上限。
  • 並列コンパイル:各ジョブがインデックスを有効化するなら 5 本まで。純粋なコンパイル行列でインデックスを切るなら 8 まで。
  • UI テスト用:SpringBoard プラグイン走査があるなら 3 デバイス同時が目安。上げると、品質以前にウォッチドッグが鳴る。

codesign 失敗と entitlements キャッシュの残り物は相関が強い。一日のうち 2% を超えて killall com.apple.CoreSimulator.CoreSimulatorService が要るなら、ホスト監査の段階です。毎月、ライン別の中央レーンサイズ表を出し、週 6% 超の膨張は、LFS へ無圧縮で置いたバイナリ疑い、といった人間向けの警報にします。

FAQ:貸出 Mac mini の並列レーン

仮想マシンは完全に要らないのか? 多くの iOS ビルドとテスト自動化の範囲では要らない。Apple 以外のワークロード用に別途 VM を持つのは当然ありうる。

Xcode ベータは? ベータ専用のホスト群か、少なくとも XCODE_LANE_SUFFIX など、安定版と混ざる DerivedData インデックスを分ける接尾辞を付ける。

ディスク掃除のオーナーは誰? プラットフォームがスクリプトの責任。プロダクトがレーン ID の保持タグの責任。

なぜ Mac mini M4 と VmMac が、Apple 系 QA の「VM 感」を埋めるのか

Mac mini M4 はメモリ帯域が広く、デバイス上の小さな ML スモークを CPU 畑から奪いにくい。VmMac なら 香港・日本・韓国・シンガポール・米国で、同じ SSH ファーストの流儀のままレーン用ホストを置けます。ドット版が Xcode より遅れる脆い黄金イメージを維持しなくてよい。資本的支出の塊に縛られず、プロジェクトの盛衰に合わせ、毒のあるレーンはフォルダ消し、必要ならもう一機の mini を足して UI 同時本数のピークに応える。それが 2026 年の、裸金属上の iOS ファクトリー像です。

GUI シミュレータ専用ホストを一つ分ける

コンパイル専用レーンと、VNC 常駐のシミュレータ用を分け、お互いにメモリを奪い合わないようにする。