複数 Mac mini M4 でビルドを分割しても、最終成果物は一本のストーリーに揃える必要があります。CPU より先に詰まるのは、成果物の一貫性・ディスク余裕・跨リージョン遅延の設計です。
ガードレールなしでは並列クラスタが詰まる理由
専有 Mac 2〜8台規模の CI 向けに、意思決定マトリクス・rsync フラグ表・flock ロック・1TB/2TB 水位・跨リージョン遅延チェックを一枚化しました。ノードは同型で揃えるほど再現性が上がります。
- 成果物分裂: 同一ツリーへの並行書き込みでフレームワークが半壊する。
- 同期ストーム: 跨リージョンのフルコピーが上行を食い、体感を落とす。
- ディスク崖: DerivedData が APFS を圧迫しキャッシュが途中失敗する。
意思決定マトリクス:トポロジと制約
| パターン | 向いている場面 | リスク |
|---|---|---|
| 単一ライター+昇格 | 厳格な出所管理や署名バンドルが必須。 | ライターがホットスポット化。 |
| ゴールデンノードからの rsync 扇展開 | 読み取り中心ワーカーと差分バイナリ。 | 下記キャップで挙動が読みやすい。 |
| オブジェクトストア前段 | 巨大成果物とマルチクラウド egress 契約。 | macOS 側の統合コストが高い。 |
POSIX 親和性から rsync 扇展開が多く、昇格(promote)だけ単一路にすると QA の引き取りが安定します。
今日から使えるパラメータ化 rsync
リージョン別プロファイルでフラグを固定化。ゴールデン BUILD_ROOT をチェックサム・部分再開・帯域上限付きで送る例です。
#!/usr/bin/env bash
set -euo pipefail
PROFILE="${1:-apac}"
case "$PROFILE" in
apac) BW="60000"; TIMEOUT="25m";;
amer) BW="45000"; TIMEOUT="35m";;
*) BW="30000"; TIMEOUT="40m";;
esac
/usr/bin/timeout "$TIMEOUT" rsync -azh --delete-delay --partial \
--checksum --bwlimit="$BW" --omit-dir-times \
"$GOLDEN_HOST:$GOLDEN_PATH/" "$LOCAL_ARTIFACT_ROOT/"
| フラグ | 目的 | メモ |
|---|---|---|
| --delete-delay | 同期成功まで削除を遅延。 | 長時間転送中のツリー欠損露出を抑える。 |
| --partial | 未完了ファイルを保持して再開可能に。 | timeout と併用しハングを切る。 |
| --bwlimit | ストリームあたり KiB/s でスロットル。 | 課金ティアに合わせ対話ビルドの体感を守る。 |
| /usr/bin/timeout | 壁時計ガードレール。 | 終了コード 124 でメトリクス送出。 |
共有ツリーを守るビルドロック
公開だけ flock で排他し、正規パスの同時書き換えを防ぎます。ロックはローカルか軽量 NFS メタのみ。SSHFS 上ではロックしないでください。
LOCK_FILE="/var/tmp/ci-artifact-promote.lock"
flock -n "$LOCK_FILE" bash -c '
./scripts/compile.sh
rsync -az --delete ./out/ "/Volumes/Artifacts/promote/"
' || { echo "lock busy"; exit 17; }
1TB と 2TB の容量水位(ウォーターマーク)
70%
DerivedData の積極削除とログローテーションを有効化。
80%
黄信号:アーカイブ退避か上位ディスクを計画。
90%
赤信号:空きが戻るまで新規扇展開を止める。
2TB もシミュレータ積み上げで再び崖に近づきます。90% はスナップショット等を踏まえたハードストップ。IO 飽和前に 料金・プラン比較 で段階を決めます。
跨リージョン遅延の受入チェックリスト
- SSH: VPN 経由往復中央値 70ms 未満を目安。
- rsync: 週次で dry-run+チェックサム成功を1回。
- Git fetch: 最大スライスが 5 分以内。
ASEAN と米西海岸を跨ぐなら近接リージョンに中継扇を置き脚を短く。日本拠点は 東京の購入ページ で台数と帯域前提を固められます。
HTTP も壁時計を切る例:
curl --max-time 8 --connect-timeout 3 -fsS \ https://status.example.internal/artifact-ready >/dev/null
ロールアウトは「ゴールデン確定 → プロファイル rsync → flock は昇格のみ → 80% アラート → VPN 変更後に再計測」。追加ノードは 購入・デプロイ で同型を揃えます。
FAQ:運用と調達の勘所
Git で足りないか: ソースは Git。大容量成果物は rsync が現実的。
flock が常に失敗: ロック範囲が広すぎ。昇格のみに絞る。
第二リージョン: チェックリスト遅延がスプリントで2回超えたら分割し、VPN 変更後に再計測。
運用目安。 本番へは dry-run で削除を検証。数値は経路依存の目標で SLA ではありません。
並列 Mac クラスタ
同型 Mac mini M4 で扇展開 CI
裸金属を足し、rsync プロファイルで成果物を揃え、黄信号前にストレージを上げましょう。