DevOps / CI・CD 2026年5月8日

2026-05-08 xcbeautify構造化 xcodebuild ログ:レンタル Apple Silicon クラウド Mac の CI ゲートHK/JP/KR/SG/US

MacXCode エンジニアリングチーム 2026年5月8日 読了時間 約22分

コンパイラが「コンパイルし忘れた」から 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 層と考えてください。

アンカー:xcbeautify のセマンティック バージョンXcode のピン横に置く—Mint を全世界アップグレードしてパイプを再演習しなかったチームは火傷を負っています。

リモート ビルダーのノイズとシグナル

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}"

pipefailxcodebuild 失敗時もパイプラインが非ゼロを継承—xcbeautify はゼロ終了しがちです。明示的な RESULT_BUNDLE_PATH を付け、junit ステップが stdout の化粧とは独立して .xcresult を読みます。集中ログ ベンダーへはを上流に、GitHub Actions サマリーには整形を送ります。

SSH ヒント:CI で疑似 TTY(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 日。
  • 圧縮 — リージョン横断アップロード前に zstd tarball。

空き容量が運用閾値を下回るなら、コンプライアンス チケットに紐づく .xcresult より先に古い pretty を削ります。

9 ステップ展開チェックリスト

  1. xcbeautify をピン留めしチェックサムまたはパッケージ版を記録。
  2. CI ラッパに pipefail+tee 配線を追加。
  3. xcresult パスを構造化メタデータ JSON へ出力。
  4. grep ゲートと Slack 重大度ルーティングを追加。
  5. ログを消費する Windows/Linux ビューワで UTF-8 デコードを検証。
  6. プレフィックス付きレーンで並列ソークを実施。
  7. 予算のため raw と pretty の gzip サイズを比較。
  8. インシデント時に xcbeautify と raw の読み方をオンコールへ訓練。
  9. インフラ 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 アクセスガイド を併用してください。

ログが NVMe を食い尽くす前にビルダーを追加

HK/JP/KR/SG/US · SSH/任意の VNC