リモート Mac CI で rsync 転送面を絞り込む概念図

2026 年 リモート Mac CI で rsync 転送面を縮小:`--files-from`、マニフェスト層別化、sparse-checkout

リモート Mac に Xcode やモバイルビルドを載せたチームがつまずく典型は、ディスク不足ではなく「ワークスペース全体を rsync 対象にしてしまう」ことです。数万小ファイルとキャッシュが同居すると、越境 RTT のもとでメタデータ列挙が支配的になり、実際に必要な数百メガバイトよりも listing が時間を奪います。2026 年の現実的パターンは、パス・ハッシュ・サイズを並べたマニフェストを契約として公開し、--files-from で許可リストだけを転送し、staging で検証してから current を切り替える流れです。

1. 盲目同期がもたらす三つの損失

第一に列挙コストです。DerivedData や SwiftPM キャッシュが成果物と同じルートにあると、rsync はそれらすべてを踏査します。結果としてスキャンだけで数分を消費し、インクリメンタルの効果が相殺されます。

第二に誤転送リスクです。環境ファイルや詳細ログが SFTP 共有領域に混入すると、最小権限と監査の両方が崩れます。

第三にリリース整合性です。タイムスタンプ頼みでは部分失敗を検知できません。マニフェストがあれば転送前に期待値が固定されます。

  1. スキャン爆発:無関係ファイルが増えるほど CPU と RTT が浪費されます。
  2. 帯域浪費:変更のない素材パックまで繰り返し送られることがあります。
  3. 運用衝突:並列ジョブが単一共通ディレクトリへ書き込むと上書き競合が起きやすくなります。

2. アーカイブ同期とマニフェスト同期の比較表

以下はリモート Mac が SSH/rsync または SFTP 相当のアップロードを提供し、QA が releases ツリーから取得する前提です。

観点 再帰アーカイブ マニフェスト + files-from tarball + ハッシュ
パス制御 低い 高い 高いが展開が必要
スキャン負荷 ツリー幅に比例 マニフェスト長に追従 単一ファイル転送が軽い
監査 別ツールが必要 マニフェストが証跡 サイドカー摘要
適合例 小規模静的サイト iOS/macOS 成果物 巨大クリエイティブ素材

3. 七ステップの実装手順

層別出力→マニフェスト生成→files-from 出力→dry-run→staging 同期→ハッシュ突合→current 切替、の順をテンプレ化します。

rsync -avh --files-from=manifest.txt --checksum --partial \
  -e "ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=4" \
  ./build/ ci@remote-mac:/srv/releases/staging/build-123/
  1. CPU アーキテクチャとチャネルごとにディレクトリを分離します。
  2. CSV か JSON Lines で sha256 とサイズを記録し、失敗時は最大ファイルを表示します。
  3. .env や署名作業ディレクトリを明示除外します。
  4. テンプレ変更後の最初の週は必ず -n を通します。
  5. --delete は staging の葉だけに適用し、共有キャッシュは読み取り専用マウントにします。
  6. ServerAlive と必要なら --bwlimit で帯域をフェアに配分します。
  7. リモート spot-check がマニフェストと一致したらカットオーバーします。

4. sparse-checkout でワークスペースを事前に絞る

巨大モノレポでは取得対象を絞るだけで中間生成物の混入確率が下がります。checkout 後に git sparse-checkout list をログへ残し、Xcode workspace の参照欠落が無いか確認します。sparse-checkout はマニフェストの代替ではなく、マニフェストを短く保つための前処理です。

5. 計測すべき数値とロールバック

エントリ件数・マニフェスト合計バイト・rsync 送信バイトを毎ビルドで記録します。エントリが数万から数百へ落ちると、越境でも listing が分単位から数十秒帯へ縮むことが多いです。ロールバックは「旧マニフェストポインタへ戻せるか」を検証します。

並列ジョブには別 staging 接頭辞と job id を埋め込み、依存キャッシュは別ボリュームに隔離します。

6. FAQ

Q: 隠しファイルは? A: ジェネレータ側で明示し dry-run 件数で検証します。

Q: GUI SFTP と共存? A: 権威ディレクトリを一本化するか手動用サブツリーを分離します。

Q: xattr? A: 受け側 FS が許容するなら -E を検討しサンプル署名を確認します。

7. マネージド remote Mac を選ぶ判断

マニフェストファーストは帯域と時間を「意味のあるバイト」へ集中させますが、安定した上り・予測可能な IO・常時オンラインという前提は変わりません。

住宅回線や単一共有アカウントではスクリプトが完璧でも運用が崩れがちです。ディレクトリ分離とバックボーン接続を備えた SFTPMAC のリモート Mac は、アップロード契約をインフラとして維持しやすくします。