2026-05-08 xcbeautify と 構造化 xcodebuild ログ:レンタル Apple Silicon クラウド Mac の CI ゲート(HK/JP/KR/SG/US)
コンパイラが「コンパイルし忘れた」から CI が止まることは稀で、ログが読めないから死にます。香港・東京・ソウル・シンガポール・米国のレンタル Mac mini M4では、並列レーンごとに xcodebuild 出力が数十 MB を超えます。生のまま投げると、Xcode の段落長いバナーを grep するあいだにキューだけが燃えます。xcbeautify はその洪水を1 行ずつ grep しやすいレコードにし、失敗を隠しません。tee と組み合わせれば、法務保持用の生トランスクリプトと自動化用の正規化ストリームの両方を残せます。本 2026-05-08 ガイドは、インストールのピン留め、パイプ構成、result bundle の整合、失敗分類を順に扱い、並列 xcodebuild レーン、DerivedData 分離、セルフホスト runner、カバレッジ ゲート、ディスク衛生の横でゲートを決定論的に保ちます。
2026 年も読めるログがリリースを止める
Apple ツールチェーンの診断は折り返しが読めないほど不安定です。CI ベンダーは HTML ビューワで補いますが、SSH のみのリース機は監査向けのプレーンテキスト証跡と diff しやすい成果物が依然必要です。xcbeautify は .xcresult の真実を置き換えません—xcresulttool を開く前に人と正則に猶予を与えます。整形ログを第 1 層、junit エクスポータが参照する構造化バンドルを第 2 層と考えてください。
リモート ビルダーのノイズとシグナル
MacXCode ノードで慢性化する 3 点:
- ラッパーがストリームを誤結合すると stderr の順序が失われる。
- ローカライズされた clang 診断の Unicode 境界—UTF-8 を端到端で。
- 並列扇出でレーン B の警告が集約ダッシュボードでレーン A の致命エラーを流し去る。
装飾の前に相関付け:各コマンド先頭へ RUNNER_TRACKING_ID やビルド行列座標を出し、Slack シャードを発生レーンへ戻せるようにします。
導入経路:Mint、Homebrew、セマンティック ピン
組織標準に合わせ再現可能な導入を優先:
- Mint — CI YAML 近くにコミットした
Mintfileでピン留め。 - Homebrew — ゴールデン ビルド後に
brew list --versionsをスナップショットするなら可。 - curl | bash — 共有署名ホストでは避け、再現性が速度に勝つ。
runbook にバイナリパスを明記し、launchd ジョブと対話シェルが同一バイナリを解決するように—PATH ルーレットで「東京ローカルは動くのにシンガポールで失敗」が起きます。
本番で生き残るパイプと tee
生ログを残さず xcbeautify だけへ流さないでください。骨格例:
set -o pipefail
xcodebuild … 2>&1 | tee "${RAW_LOG}" | xcbeautify > "${PRETTY_LOG}"
pipefail で xcodebuild 失敗時もパイプラインが非ゼロを継承—xcbeautify はゼロ終了しがちです。明示的な RESULT_BUNDLE_PATH を付け、junit ステップが stdout の化粧とは独立して .xcresult を読みます。集中ログ ベンダーへは生を上流に、GitHub Actions サマリーには整形を送ります。
ssh -t)を避け—バッチ モードと比べバッファリングと行順が変わります。
grep ゲート:正則と xcresult の真実を対に
早期捕捉すべき自動化失敗の基線:
| パターン族 | grep 例 | フォローアップ |
|---|---|---|
| Clang 致命 | grep -E "error: fatal error:" |
xcresulttool で issue summary |
| 署名 | grep -Ei "codesign|Provisioning profile" |
キーチェーン解放手順とレーン隔離を突合 |
| シミュレータ | grep -E "SimRuntime|CoreSimulator" |
シミュレータ保持方針を参照 |
整形ログはエラー行を予測可能な接頭辞へ畳み、grep を安定化—それでも stderr が嘘をつく不安定な UI テストは .xcresult で検証します。
並列レーン:レーンごとに xcbeautify 出力を相関
1 ホストで複数 xcodebuild が扇出するなら各行へレーン識別子を前置:
… | sed "s/^/[lane-${MATRIX}] /" | xcbeautify
前置がないと統合成果物が誤ったチームへ責任を転がします—特に統合メモリの圧力下で無関係レーンが遅延するとき。並列ジョブ調整の並行度指針と揃えます。
保持、NVMe、成果物予算
各 PR が raw と pretty の両方を蓄えるとログは急増します。
- DerivedData ガイダンスに従い隔離 TMPDIR 下にジョブごとのディレクトリ。
- 階層保持 — raw をオブジェクトストレージに 14〜30 日、pretty 要約を NVMe に 7 日。
- 圧縮 — リージョン横断アップロード前に
zstdtarball。
空き容量が運用閾値を下回るなら、コンプライアンス チケットに紐づく .xcresult より先に古い pretty を削ります。
9 ステップ展開チェックリスト
- xcbeautify をピン留めしチェックサムまたはパッケージ版を記録。
- CI ラッパに pipefail+tee 配線を追加。
- xcresult パスを構造化メタデータ JSON へ出力。
- grep ゲートと Slack 重大度ルーティングを追加。
- ログを消費する Windows/Linux ビューワで UTF-8 デコードを検証。
- プレフィックス付きレーンで並列ソークを実施。
- 予算のため raw と pretty の gzip サイズを比較。
- インシデント時に xcbeautify と raw の読み方をオンコールへ訓練。
- インフラ PR で変更を昇格しロールバック tarball を用意。
SLO 表:レンタル ビルダーのログ健全性
| シグナル | 閾値 | アクション |
|---|---|---|
| 生ログ成果物の欠落 | 失敗ビルドでいずれか | デプロイ停止、tee パス修正 |
| grep の偽陰性 | スプリントあたり > 2 | パターン調整+ xcresult アサーション |
| ディスク使用率の傾き | 週次 > 18% の勾配 | 保持を調整しリース SKU を拡張 |
FAQ
| 質問 | 実務回答(2026-05-08) |
|---|---|
| Darwin 固有の xcbeautify ビルド? | OS ごとに aarch64 bottle をピン留め;Rosetta とネイティブをレーン横断で混ぜない。 |
| 生ログを省略できる? | いいえ—監査と Apple DTS エスカレーションは未加工のトランスクリプトを期待します。 |
ログ偏重 CI に Mac mini M4 ベアメタルが効く理由
順次ログ書き込みは APFS メタデータ更新と競合し、並列テストは IOPS を急伸させます。MacXCode リージョンのレンタル Mac mini M4 NVMe はテール遅延を予測可能に保ち、tee+xcbeautify パイプラインが不安定な赤を増幅しません。容量計画は 地域別料金、文字セット問題の対話デバッグは SSH/VNC アクセスガイド を併用してください。