痛み:キャッシュ同期は二級問題ではない
痛み1:DerivedData を静的フォルダ扱い。中間インデックスやモジュールキャッシュ、Swift フロントの一時状態は rsync 成功中でも半整合のままになり、再コンパイルのランダム成功が構造レースを隠します。
痛み2:コンパイラキャッシュとワークスペース全体を同一プロファイルで扱う。ccache/sccache は形が読みやすい一方、DerivedData は Xcode マイナー、Swift ツールチェーン、プラグイン、フラグに強く結びつき、アップグレード後に一つの rsync 設定が突然壊れます。
痛み3:同一ボリューム上で CI マトリクスが重なる。sqlite とロックディレクトリで衝突します。SSH 転送層の健康はコンパイル層の健康を意味しません。
痛み4:APFS 意味論を無視。xattr と権限はコピーでも噛む。APFS マトリクス を先に。
痛み5:汚キャッシュのプレイブック欠如。毎時全削除か永遠に温存かの極端に寄りがちです。番号付きロールバックカードを 成果物マニフェスト と整合させ、キャッシュはボリューム差分で扱います。
痛み6:GUI SFTP を本番同期にする。スポット向き。鍵ピン と OIDC とセットで。
痛み7:成果物昇格とキャッシュウォームを混線。署名ツリーは揮発キャッシュと同一ルートを共有しない。
脅威モデル:二つの信頼鎖
成果物は監査と暗号検証、原子リリース ロールバックを要求します。キャッシュは失敗してよいが署名バンドルを汚してはいけません。
ボリュームや SSH アカウントで物理分離すると調査が速いです。WAN はスキャンコストを増幅するためレーン別に帯域を見積ります。驱逐は権限とチケットを明文化し、partial 残骸は容量監視します。
四半期にロールバックカードを演習し、可観測性でコールド/ウォーム/劣化をラベルします。
測れる基線:議論を終わらせる
クリーンとウォーム、ccache 命中率、sccache キュー、DerivedData 傾き、終了コード、partial 残骸、並行数、フレーク密度を追跡します。
Xcode 更新後はゴールデンプロジェクトと rsync --version をログに紐付け、時間をスキャン・デルタ・ネット・fsync に分解します。
キャッシュ異常が鍵ローテと同週なら設定変更の重複を疑います。キャッシュDIRを状態機として扱い、FinOps は egress と ingress を分勘定にします。
決定マトリクス:コールド、コンパイラのみ、剪定 DerivedData、フルミラー、専用ボリューム
| モデル | 向くケース | 利点 | リスク |
|---|---|---|---|
| 同期なし、リモート単体ビルド | 小規模・低頻度 | 最も単純 | コールドスタートが遅い |
ccache/sccache ルートのみ | Clang 重視で驱逐許容 | 境界が明確 | アップグレード後の衛生が要る |
選定 DerivedData サブツリー | SPM 解決の痛み、除外管理 | 再フェッチ削減 | レイアウト結合が高い |
| フル DerivedData ミラー | 単一ライターのメンテ窓 | 最大増分再利用 | ロックと索引衝突が最大 |
| ジョブ/チーム専用 SSD | 共有プール | 隔離とクォータ | コストと自動化負荷 |
キャッシュ汚染が署名成果物に届き得るならアカウント分割を即実行し、codesign Runbook のチェックポイントで削除範囲を演習します。
手順:貼り付けて調整するコマンド骨格
# Per-job cache root (example)
# export CACHE_ROOT=/Volumes/cache/job-${CI_JOB_ID}
# mkdir -p "$CACHE_ROOT/ccache" "$CACHE_ROOT/DerivedData"
# rsync compiler cache only
# rsync -a --partial --partial-dir=.rsync-partial \
# ./ccache-dir/ user@remote-mac:"$CACHE_ROOT/ccache/"
# Trimmed DerivedData with aggressive excludes (verify paths)
# rsync -a --partial --partial-dir=.rsync-partial \
# --exclude '**/ModuleCache.noindex/**' \
# ./DerivedData/SubTree/ user@remote-mac:"$CACHE_ROOT/DerivedData/SubTree/"
# Artifact lane still runs checksum manifests
# shasum -a 256 -c manifest.sha256
# Dirty-cache rollback for one job
# ssh user@remote-mac "rm -rf \"$CACHE_ROOT\""
スニペットは再利用アクションに包み、除外と CI 鍵ピン を同じレビューで見直します。
読む順番と CTA の揃え方
この記事の後に APFS、整合性、並行 SFTP、署名、原子リリース、最後に ホーム で容量計画へ。
飛ばし読みは偽のトレードオフを生みます。キャッシュルート・除外・ロールバック ID を明示し、オンロールはキャッシュ事故をネットと同格の Runbook に載せます。
FAQ と SFTPMAC のホスト型リモートMac
毎晩フル DerivedData は合理的か
専用窓と単一ライターのみ。日中のマトリクス重複は衝突リスクが残ります。
Redis は必須か
いいえ。ただし集中バックエンドの方がメトリクス化しやすく、分断時の降格を定義してください。
キャッシュ失敗でリリース停止か
成果物はチェックサムと署名で止める。キャッシュはコールドへ落としラベルで劣化を示す。
IDE ウォッチャとの関係は
本稿はコンパイラキャッシュ整合性が焦点。エディタ通知は別記事の範囲です。
まとめ:2026 年のリモートMacリンクで Xcode キャッシュを動かすにはジョブ隔離、信頼鎖分離、明示ロールバックが要です。フルミラーよりコンパイラルートを優先してください。
限界:自前フリートはボリュームと口座と監視と掃除を常に調整し、人員交代で方針が静かに漂流します。
SFTPMAC:ホスト型リモートMacは安定した Apple ビルド面と運用可能な転送レーンを束ね、署名成果物の出荷に集中させます。
アカウントレベルでキャッシュと成果物を分離すると、クォータと監査と回帰サンプルが揃えやすくなります。
