2026年独占リモート Mac iOS/macOS CI:xcodebuild -showBuildTimingSummary と XCLogParser で SSH ヘッドレスのビルド時間回帰──比較表・閾値スクリプト・パイプライン手順+FAQ
SSH だけで触れる独占リモート Mac上の CI でも、「この PR でコンパイルが遅くなったか」に誠実に答える必要があります。Apple 側のレバーは補完的に二つ:xcodebuild -showBuildTimingSummary によるビルド全体の粗いロールアップと、.xcactivitylog/xcresult から構造化スライスを吐く XCLogParser です。本稿は貼り付け用の比較表、閾値パターン、ヘッドレスでも崩れにくいパイプライン手順と FAQ です。バックグラウンド実行や SSH の落とし穴は
OpenClaw と SSH 自動化の実践記事、独占 Mac 上のセッション境界の感触は
複数インバウンドを SSH で載せる際のセッション分離の記事
と併読すると、Runner のログイン文脈とジョブの単一ライター規律が揃いやすいです。
1. TL;DR — まず配線する順序
- 常に本番相当の
xcodebuild呼び出し末尾に-showBuildTimingSummaryを付ける。壁時計が気になるならログ末尾のテキスト追加コストは小さい。 - パース:ターゲット別 Swift コンパイルやリンカ段階をダッシュボードに載せるなら XCLogParser。Xcode メジャーアップ後はサマリー行の表記揺れに強い。
- 保存:(ブランチ種別、Xcode のビルド ID、スキーム、宛先)ごとに署名付きベースライン JSON。ヘッドレスのジッタが残るホストでは単発ではなく p95 などを見る。
- ゲート:回帰が予算を超え、かつ「統計的につまらない」ときだけジョブを落とす小さなスクリプト(例:連続二回緑になるまでアラートをミュートしない、など)。
2. SSH ヘッドレスがタイミングをノイジーにする理由と手当て
専用ベアメタルは速い一方、独占 Mac CI は前日ジョブと熱設計・APFS の断片化・Simulator サービスを共有しがちです。ベースライン無しでは +12% のコンパイル増も「火曜日」に見えます。閾値の前に可観測性:DEVELOPER_DIR 固定、sysctl hw.model と xcodebuild -version のログ、ジョブ冒頭の空きディスク記録を揃えてください。
3. 計測 A — -showBuildTimingSummary
ビルド成功時、Xcode はコンパイル/リンク/コード生成などの集計バケットを末尾に出します(ラベルはツールチェーン依存)。安いスモーク信号として扱い、grep 向きのブロックを 1 回の呼び出しにつき 1 つ、追加依存なし。
- 利点:インストール不要、「リンクが爆発したか」のトリアージに十分、素の SSH ログで完結。
- 欠点:機械可読 JSON ではない。単一 SPM ターゲットの責任追及は難しい。Apple が行名を変えるとパーサが壊れる。
例(フラグはスキームに合わせて調整):
xcodebuild \
-scheme YourApp \
-destination 'platform=iOS Simulator,name=iPhone 16' \
-derivedDataPath "$CI_DERIVED_DATA" \
-resultBundlePath "$CI_RESULT_BUNDLE.xcresult" \
build \
-showBuildTimingSummary
4. 計測 B — XCLogParser
XCLogParser は Xcode の activity log を読み、JSON/HTML などを出力します。CI では巨大 HTML より JSON をオブジェクトストレージへ送る方が運用しやすいです。
- 導入:リリースバイナリをピン留めするか Runner イメージでソースビルド。成果物はツールチェーン別パスにキャッシュ。
- 典型コマンド:
xclogparser parse --file path/to/LogStoreManifest.plist --reporter jsonなど。ビルドと同時に生成したxcresultを指す運用を一つに決め、ジョブ間でパス規約を混ぜない。 - 利点:ターゲット/コマンド単位で Grafana/BigQuery 向けに構造化。遅いファイルのハッシュをスナップショットして差分に耐える。
- 欠点:サプライチェーン上の追加部品。Xcode の大きな更新ではパーサ更新が要ることがある。
5. 比較表(どちらの信号が何に効くか)
| 観点 | -showBuildTimingSummary |
XCLogParser |
|---|---|---|
| クリーン Runner での立ち上げコスト | なし(Xcode のみ) | インストール+バージョン固定 |
| 粒度 | ビルド全体のバケット | ターゲット/コマンド/ノート |
| Xcode ドットリリース間の安定性 | テキストがドリフトし得る | パーサが Apple 変更を追う必要 |
| 回帰検知に最適な領域 | リンク/コード生成の崖 | どのターゲットが予算を食ったか |
| 保持する成果物 | CI 標準出力+任意 JUnit | JSON+薄い xcresult |
6. 閾値スクリプトの型(bash 風、CI 非依存)
方針はデータに置き、人間の目に頼らない。baseline.json をツールチェーン指紋でキー化。スクリプトは (1) XCLogParser JSON かサマリーブロックから総コンパイル秒を抽出、(2) ベースライン読込、(3) 増分%計算、(4) 増分が閾値超えかつコールドスタート検知(ディスク、サーマル抑制フラグ)が緑のときだけ失敗、が読みやすいです。
# 擬似ロジック — フィールド名は XCLogParser の reporter 版に合わせて調整
TOTAL_NEW=$(jq '.compileCommandDuration // 0' metrics.json)
TOTAL_BASE=$(jq '.compileCommandDuration // 0' baseline.json)
DELTA=$(python3 - <<PY
new, base = float("$TOTAL_NEW"), float("$TOTAL_BASE")
print((new - base) / base * 100 if base else 0.0)
PY
)
test "$(printf '%.0f' "$DELTA")" -lt 15 # 例:コンパイル +15% 超で失敗
数値は GitHub Actions の $GITHUB_STEP_SUMMARY、GitLab の metrics レポートなどに載せ、インフラとプロダクトチームが同じ真実を見るようにする。
7. パイプライン落とし込み(ハッピーパス)
- 環境の正規化:固定
DEVELOPER_DIR、非対話シェル、文書化したLANG/LC_ALL。 - DerivedData の単一ライター:ジョブごとディレクトリ。並行ジョブ間で汚れたツリーを再利用しない。
- 一度ビルドし二度解析:同一
xcresultを XCTest レポートと XCLogParser の時間抽出の両方に流す。 - 成果物アップロード:生サマリー、パーサ JSON、失敗時のみ
xcodebuild.logの末尾 200 行(マスク済み)——帯域節約。 - ベースライン更新方針:main のナイトリーがヘルスチェック緑のあと昇格ベースラインを再生成。feature は最後に昇格した基準と比較。
- アラート経路:JSON で遅いターゲットが判明したら CODEOWNERS から責任スカッドへルーティング。
8. FAQ
Q1: Xcode を上げたらサマリー文言が変わり grep が壊れた。
サマリー行のパースはベストエフォートに留める。正規メトリクスは XCLogParser(または該当箇所で xcresulttool)へ昇格し、サマリー grep は人間可読ログ向けに限定する。
Q2: Simulator 起動が壁時計を支配している——計測対象を間違えていない?
メトリクスを分割:コンパイル/リンクとテストオーケストレーション。Simulator はウォームプール段で先に起動するか、起動が安定するまで回帰ゲートはコンパイル相のみに適用する。
Q3: DerivedData 全体を SSH でコピーせず XCLogParser を回せる?
xcresult バンドル、または内包する activity log マニフェストだけを指す。数百 GB のワークスペースではなくそのパスだけ rsync する。
Q4: 警告を消してメトリクスを誤魔化しているチームがいる。
時間ゲートに警告予算とバイナリサイズチェックをペアで載せる。財務レベルの CI は一本のレバーでは足りない。
タイミング敏感な Apple CI ではなぜ Mac mini が強いか
ビルド時間の回帰は、信号が再現できるときだけ意味を持ちます。Apple Silicon の Mac mini は Swift コンパイル向けのユニファイドメモリ帯域が読みやすく、Simulator と署名のための macOS ネイティブスタックが揃い、ベースライン Runner を常時ウォームにしても待機電力がデータセンター請求のように読みにくいクラスです。macOS の Gatekeeper、SIP、FileVault は、長寿命 Runner に署名アイデンティティが残る状況でのマルウェアリスクを抑えやすく、xcodebuild を SSH で素直に回したあと XCLogParser の後処理を載せるにも、クロス OS のファイル変換バグを踏みにくいです。
上の比較表が「ノイズだらけ」ではなく「退屈なほど安定」と感じられるハードウェアを探しているなら、Mac mini M4 は 2026 年時点でも有力な錨です。プラン比較は下のホームへの導線から進め、本 runbook をプラットフォーム ADR に添付してください。