2026 Macクラウド iOS CIの可観測性:キュー深さ・失敗クラスタリング・ディスクWebhook閾値

Xcode 26パイプラインをSSH可能なMacクラウドへ載せたあとも、末尾ログだけでは「午後遅い」「再実行で緑」といった不信を消せません。本稿はキュー待ち・APFS空き容量・SwiftPM再試行を束ねる4信号、ログ/メトリクス/Webhookの判断表、7ステップの実装順、SLOレビュー用の閾値、そしてDerivedDataとキュー運用との役割分担FAQまでをまとめます。

MacクラウドでのCIモニタリングとビルドキュー

目次

1. 末尾ログだけでは足りない理由

Linux Runner文化では最終200行で判断しがちですが、AppleシリコンMacクラウドでは統合メモリ・リンカ作業領域・肥大化DerivedDataが絡み、スタックトレースは署名やCDN問題に見せかけます。観測設計の前に、次の3つの失敗モードをRunbookに明文化してください。

  1. キュー深さが壁時計に埋もれる:GitLab RunnerやJenkinsがMacラベルで詰まると、xcodebuild時間だけ見ると待ち行列を過小評価し、ビジネス側の「午後遅い」を説明できません。
  2. 失敗クラスタが無いと非ゼロ終了が均一に見える:コード署名、プロビジョニング、ディスク満杯、SwiftPM、ロック競合は似た終了コードになります。failure_clusterとノードID、スキーム名を揃えないとインシデント橋が手作業になります。
  3. ディスクと並列の連動アラートが無いとWebhookが逆効果:DerivedData分離と12%未満fail-fastを済ませていないと、自動再試行や並列増幅がIO嵐を招き、分課金Runner予算を焼きます。

2026年の最低ラインは「待ち・実行・失敗署名・ディスク/並列スナップショット」の4分類です。次表でログのみで足りる規模と、Prometheus系+Webhookが必要な規模を切り分けます。

2. ログ・メトリクス・Webhookの判断表

数値は出発点です。p95待ち時間、最速テストジョブの中央値、Xcodeマイナー更新後のディスク減衰を四半期で見直してください。

段階Mac台数ベースラインWebhook用途欠けると起きること
小規模1〜2構造化ログ、ヘッダ3点、dfサンプル空き12%未満で新規archive停止ディスク事故をネットワーク誤認
成長期3〜8キュー深さ・待ち・成功率をノード別同一クラスタ3回/10分で再試行抑制アラート疲労と課金爆増
プラットフォーム8+スケジューラから成果物倉庫までトレースIDWebhookは並列削減やメンテ窓のみ設定ドリフトを自動化が隠蔽

ラベル標準化はAPI接続ガイドと併せ、SKU・マウント点・プール名を各ビルドイベントへ載せます。

3. 7ステップ:ヘッダ3点セットからサイレンスまで

Jenkins共有ライブラリやGitLabテンプレに順に埋め込みます。失敗ごとに「どのマシンで」「どれだけ待ち」「ディスク何%」「どのクラスタか」を必ず返します。

  1. sw_versxcodebuild -versionxcode-select -pを先頭固定:週次比較とXcodeドリフト検知に必須です。
  2. queue_wait_msを記録:シェル開始時刻とキュー投入時刻の差で近似します。
  3. failure_clusterを安定キーワードで生成Code SignNo space leftなど全文ハッシュは避けます。
  4. ビルド前後でdf -g /とDerivedDataルートdu -sh:キュー長文の12%方針と連動します。
  5. Webhook JSON最小セットnode_idjob_urlfailure_clusterdisk_avail_pctqueue_depthqueue_wait_ms
  6. サイレンスとバックオフ:同一クラスタは10分に1回まで「並列削減」、ディスク10%未満連続2回のみ自動停止。
  7. 自動操作の監査ログ:実行者・理由・ロールバックURLを残し、手動hotfixと競合させません。
{ "event": "ios_build_failed", "node_id": "mac-m4-03", "queue_depth": 7, "queue_wait_ms": 420000, "failure_cluster": "codesign_identity_mismatch", "disk_avail_pct": 11, "derived_data_gb": 186, "job_url": "https://ci.example/job/8842" }
注意DERIVED_DATA_PATHのジョブ分離が済むまで破壊的Webhookを有効化しないでください。並列archiveが参照中のディレクトリを掃除すると稀なロック障害が増えます。

4. レビューに貼れる閾値

財務・プロダクトとSLOを握るための箇条書きです。①並列スロットの4倍を30分超えて維持するキュー深さは容量事故とみなし、弾性Macクラウド拡張かマージ抑制を選びます。②空き約12%未満では新規archiveを止め軽量テストのみ許可し、APFS一桁台の長尾I/Oを避けます。③同一failure_clusterが1時間に5回以上なら直近3回分のヘッダ差分を添付しxcode-selectドリフトを疑います。④queue_wait_msのp95が最速テスト中央値の3倍を超えたらラベル枯渇やarchive独占を先に調べます。⑤Webhookの並列削減は1スロットずつ、20分のディスク回復曲線を見てから次判断です。加えてderived_data_gbのヒストグラムをジョブ種別で匿名化し、Webhookを冪等化するdedupキー(node_id+分バケット)を文書化します。人手確認なしに全並列を戻すポリシーはプロビジョニング不具合を隠すので禁止リストに入れます。

5. FAQ

DerivedData自動クリーニングがあってもWebhookは必要?

必要です。クリーニングは空きを作り、Webhookは悪化中に新ジョブ投入を止めます。

クラスタは誤結合しうる?

はい。ヘッダ3点と併記し、人間のRCAは生ログへ戻します。

マルチXcode記事との違いは?

マルチXcodeはDEVELOPER_DIR選択。本稿はキューとディスク閾値。アップグレード時は両方を同時監視します。

6. 説明可能なMac CIへ

ノートPCや小さなMacに無理やりキューを載せると、観測フィールドが無いまま属人化し、ディスク・並列問題が「Appleのせい」に見え、分課金と無サイレンス再試行で予算を焼きます。高価なAPMだけでは「当時何GB空いていたか」に答えられません。ディスクとメモリが読みやすく、SSHとAPIで伸縮できるMacクラウドに観測を載せれば、Linuxビルドファームと同じ辞書でiOSを運べます。説明責任とWebhookによる一時停止を両立したいチームには、VPSMACの専用Macクラウドが現実的です。基線が明確なら「キュー停止」が開発者ノートPCではなく本番Runnerにだけ当たります。