2026 リモート Mac の再現可能ビルド
Xcode フィンガープリント · DerivedData · キーチェーン境界

プラットフォーム/iOS リードがつまずくのは SSH ではなく、専用のリモート Mac上で同一コミットが週やセッションをまたいでドリフトするときです。本稿は再現可能ビルドXcode フィンガープリント複数バージョン共存DerivedData 方針キーチェーン分離に分解し、比較表・シェル断片・事前チェックリストを示します。ランナーSSH/VNCXcode Cloud 比較の各記事とあわせて読んでください。

01

「再現可能」の意味:ツールチェーンのフィンガープリントと「コンパイルできた」

「コンパイルできた」は一点の観測です。再現性ツールチェーン状態依存解決署名素材の見え方を監査可能なベースラインに固定します。リモートノードでは、プロバイダーイメージ更新、複数利用者の残留物、無人ジョブと対話デバッグの混在といった変数が加わります。

レビューを正直に保つための 6 つの痛点:

  1. 01

    フィンガープリントがチャットだけ: xcodebuild -versionswift --version がビルドログに残らず、どのツールチェーンが走ったか証明できない。

  2. 02

    xcode-select のドリフト: OS 更新や手動切替でナイトリージョブが別の Xcode を指し、コンパイラと署名の境界挙動が変わる。

  3. 03

    DerivedData のクロストーク: ブランチがキャッシュ接頭辞を共有し、増分ビルドが文脈をまたいでマクロ状態を運ぶ。

  4. 04

    キーチェーンの見え方の不一致: 同一ホスト上の対話ユーザーと CI ユーザーで署名パスが異なる。SSH は通るがランナーは通らない。

  5. 05

    権限ノイズ: TCC ダイアログがヘッドレスジョブを明確なプライバシーエラーではなくタイムアウトで止める。

  6. 06

    過剰なクリーンアップ: スクリプトが「キャッシュっぽい」フォルダを削除し、比較不能なコールドビルドを強いる。

2 週間以内に 2 つ以上が再発するなら、パイプラインのステップ 1 でフィンガープリントを記録し、DerivedData とキーチェーン方針を Runbook に書く。これはノード統治であり、CI ベンダー談義ではありません。

02

リモート Mac のベースライン:ユーザー、ディレクトリ、ディスク、権限境界

マシンを契約上の CI ノードとして扱い、ランタイム同一性(CI ユーザー、ホーム構成、ツールルート、ログパス)を凍結します。ディスク階層は早めに計画:複数 Xcode とシミュレータは CPU 議論より速く肥大化します。

次元共有の対話開発マシン専用リモート Mac(CI 優先)
ランタイム同一性個人セッションや GUI 状態と混在しがち専用 CI ユーザーを推奨。SSH/ランナーと手動デバッグを分離
ツールチェーン固定アップグレードが個人の習慣に従う組織承認の Xcode マイナーをピン留め。変更は変更管理で
DerivedDataデフォルトパスに複数プロダクトが混ざるリポジトリまたはパイプラインごとにルート分割。クリーンアップは監査可能に
署名素材証明書がログインキーチェーンに散在別キーチェーン/ユーザーまたはノードで分離。リリースと実験を切り離す
可観測性記憶頼みになりがちすべてのビルドログ先頭にフィンガープリント用コマンドを出力

再現性は「アップグレード禁止」ではなく、「すべてのアップグレードに前後のフィンガープリントとロールバック経路を添える」ことです。

03

DerivedData とキャッシュ:共有する場合と隔離する場合

DerivedData は速くする一方でドリフトを隠します。共有は単一メインラインと長寿命ホットキャッシュに合い、隔離は実験ブランチ、ABI 感受性モジュール、リリース週のクリーンビルドに合います。削除論争ではなく方針を文書化してください。

  1. 01

    重要パイプラインごとにルートを決める:~/DerivedData/$REPO/$BRANCH_SAFE。暗黙のデフォルトに頼らない。

  2. 02

    明示的に渡す: -derivedDataPath または CI 環境変数を注入。「さっきのデフォルトは何だったか」を残さない。

  3. 03

    リリース前にホットとクリーンを比較: 同一コミットは期待帯の範囲でのみ差が出るべき。

  4. 04

    クリーンアップを段階化: 「消してよい」と「巨大再取得を強制する」を所有者と頻度で分ける。

  5. 05

    ディスク閾値: 空き容量が赤線に触れる前に、保守的な保持かオブジェクトストレージキャッシュへ切り替える。

  6. 06

    ランナーラベルと整合: ラベルごとにキャッシュルートを分け、リリースと実験ジョブが衝突しないようにする。ランナー ガイド参照。

shell
# ログヘッダ:ツールチェーン・フィンガープリント(例)
xcodebuild -version
xcode-select -p
swift --version
/usr/bin/xcrun --show-sdk-path --sdk iphoneos

# 明示的 DerivedData(自組織の repo/branch 規約に置き換え)
DERIVED="$HOME/DerivedData/${REPO_SLUG}/${BRANCH_SAFE}"
mkdir -p "$DERIVED"
xcodebuild -scheme "App" -destination 'platform=iOS Simulator,name=iPhone 16' \
  -derivedDataPath "$DERIVED" build
info

ヒント: SwiftPM と Xcode を併用する場合は swift package resolve の出力やロックファイルのハッシュも記録し、「同一グラフ」がリゾルバキャッシュのドリフトを隠さないようにする。

04

キーチェーンと署名:ヘッドレスに必要最小限の構成

多くのヘッドレス署名失敗は「証明書が悪い」のではなく、キーチェーンの見え方アンロック方針が無人パスで一度も実行されていないことが原因です。必要最小限とは露出を狭める対話デバッグをクリティカルパスから外すリリースを分離することです。

GUI デバッグとランナーが同一ハードを共有する必要がある場合は、ラベルや時間帯で隔離し、一回限りの VNC 承認を文書化する。SSH/VNC チェックリストで VNC 面を絞るのと同じ発想です。

warning

警告: 共有リモートの世界読み取り可能な場所に配布用秘密鍵を置き続けない。別アカウント・別ノード・別キーチェーンファイルを優先し、人員異動時にローテーションする。

05

レビュー向けの目安とプリフライトの考え方

以下のレンジは公開ドキュメントと現場の慣行に基づきます。関係者の合意形成に使い、請求と実フットプリントは契約で検証してください。

  • 複数 Xcode とランタイム: 計画はしばしば数百 GBから。アプリだけでなく DerivedData とシミュレータデータの伸びを見込む。
  • フィンガープリントのオーバーヘッド: 先頭に xcodebuild -version を付けるのはコンパイル時間に対し通常数秒だが、トリアージの回収は大きい。
  • 並列度と IO: Apple Silicon 上の安定した並列ジョブ数はしばしばメモリ帯域とディスク IOで頭打ち。P95 を守るため Runbook で並列数を上限化する。

ノート PC や「借り物」の Mac は短期的なコスト削減になる一方、スリープ方針、アップデート促し、混在セッションでフィンガープリントとキーチェーン統制が崩れます。Linux VPS 上のネスト macOS は Metal と署名の安定性を犠牲にしがちです。iOS CI/CD と自動化エージェントで24/7 予測可能な環境、監査可能な隔離、契約可能なディスクが欲しければ、専用リモート Macの方が本番現実に近いことが多いです。NodeMini クラウド Mac mini レンタルはそのフットプリットに合います。リージョンとディスクを選び、自動化向けに SSH を固め、フィンガープリントとキャッシュ方針を引き継ぎ可能な運用資産として扱ってください。

FAQ

FAQ

ランナー記事はキュー、ラベル、ワークフローを扱います。本稿はノード内部を扱います。メインラインは ランナー ガイド でつなぎ、ここでのフィンガープリントとキャッシュ規則を適用してください。

料金ページで SKU を比較し、デュアル Xcode と DerivedData 保持の内部バッファを加えてください。

まず ヘルプセンター を参照し、xcode-select と署名アカウントは本チェックリストと突き合わせてください。