VPSSpark ブログ
← 開発日記に戻る

CI は死んだが GitHub はまだ気づいていない

サーバーメモ · Agent & CI #1 · 2026.06.08 · 約 12 分

よく検索:CI 死んだ · GitHub Actions agent loop · macOS runner queued

CI パイプライン警告と Agent retry loop の文脈
2026年、CI の痛みは queue・Xcode ブレ・flaky retry に先に出る——パイプライン全赤より。

探している答え

  • GitHub Actions の macOS runner が遅い / Queued のまま動かない
  • iOS CI が落ちる、または何度も retry している
  • Xcode build が CI ではタイムアウトするがローカルでは通る
  • Cloud Mac と GitHub Actions、どちらを選ぶべきか
  • CI pipeline の結果が不安定で再現できない

GitHub Actions や macOS セルフホスト Runner を運用しているなら、2026 年に耳にする不満はかなり具体的です:キューが長い、Xcode のビルド時間がブレる、同じ PR で retry が続く、CI が緑と赤を行き来する。本稿は 4 層で整理します——まずその症状に名前を付け、次に Agent が CI をどう「ループ化」するか、最後に Cloud Mac がどこに効くか。タイトルの「CI は死んだ」は文末 FAQ で扱います。本文は、あなたのチームが今まさに見ている障害から書き始めます。

1 · 第一層:2026 年、GitHub Actions が「遅い・ブレる・flaky になる」理由

ここ半年、VPSSpark が話を聞いた iOS / Flutter / macOS チームの声は驚くほど重なります。問題は「CI という概念が古くなった」ではなく、次の 4 類が同時に増えていることです。

Queued
macOS job が長時間待機
±40%
同一ブランチの Xcode wall time 変動
3×+
1 PR あたりの workflow 起動回数

1.1 macOS runner のキュー(Queue)

ホスト macos-latest では、Queued 時間が実ビルド時間を上回ることが珍しくありません。job のタイムラインを開くと、待ち 40 分・実行 12 分——なのにチームは xcodebuild の引数をいじり続けています。診断式は今も wait time >> run time。手順の詳細は macOS runner キュー Runbook を参照してください。2026 年にキューが伸びた背景には、macOS 同時実行 cap に対して repo 内の job 数が追いついていないこと、そしてArchive など重い job がスロットを占有し PR の速報フィードバックまで巻き込むことがあります。

1.2 Xcode ビルド時間のブレ

同一 commit を再実行しても、CI 上の Xcode コンパイルは 18 分のときと 31 分のときがある。ローカル Mac では 15 分前後で安定している、というパターンです。よく重なる要因は runner のコールドスタート、DerivedData ミス、CocoaPods の再 resolve、ランナーイメージの Xcode パッチとローカルの不一致。単体では「キャッシュ設定の問題」に見えますが、retry のたびに cold 環境だとブレは「CI が信用できない」という体感に増幅されます。

1.3 retry 回数の暴走

workflow 内の retry-on-failure 以外に、暗黙の retry が増えています。Agent や bot がログを読み、patch を出し、push し、再び Actions を起動する。1 PR が「人が 2 回 push」から「マシンが 8 回 push」になり、minutes 課金とキュー圧力が同時に上がります。flaky テストのせいに見えて、実態は同じ PR に対して CI が異なるコードで何周も回っていることです。

1.4 Flaky CI:緑と赤が入り混じり、再現しない

古典的な flaky は、テストの偶発タイムアウト、シミュレータ起動失敗、署名キーチェーンの一時ロックです。2026 年はさらに一層:Agent が各ラウンドで出す diff が違うため、「テストが flaky なのか、Agent が別の箇所を壊したのか」を切り分けにくい。リリース担当がいちばん苦しむ一文:「昨夜 CI は緑だったのに、今朝同じ tag で赤になった。」

画面に出るもの よくある誤解 先に確認すること
Job が長く Queued GitHub の障害 macOS 並列度、Archive が PR に入っていないか
Xcode 時間がブレる プロジェクトが肥大化 キャッシュ、イメージの Xcode 版、cold start
同一 PR で複数 run 開発者が乱 push Agent / bot retry、concurrency 未設定
緑と赤が交互 テストの書き方が悪い 各ラウンドの commit が一致しているか、環境ドリフト

2 · 第二層:原因は「CI が劣化した」ではなく、CI がループ化した

上の 4 類は、キューだけ、キャッシュだけ、テストだけを直しても一巡分しか効きません。並べて見ると共通の筋が見えます:CI が一度きりの検証ではなく、「失敗 → 修正 → 再実行」のループになったこと。Agent 普及前はそのループはエンジニアの頭の中(直して push)にありました。今はインフラに書き込まれています——モデルがログを読み、patch を出し、workflow を自動起動します。

すでに現場でよく見るチェーンは次のとおりです。

  • PR オープン → CI が赤(テスト / コンパイル)
  • Agent が Actions ログを読み → fix commit を生成
  • push → 新 workflow → また赤の可能性 → 再 fix
  • 緑になるか、human が止めるか、token が尽きるまで

名前は GitHub Actions / CI のまま、挙動はすでに Agent retry loop です。ここで扱うのは「ある 1 回の build 失敗」ではなく、複数ラウンドが重なったあとの確率結果——だから第一層の症状が出ます。キューは多周 job で埋まり、Xcode 時間は各ラウンドの cold start でブレ、flaky はコードと環境の組み合わせが毎回変わるからです。

少し抽象ですが実務に効く言い方があります。古典的 CI は決定的(deterministic)を仮定します——同 commit・同環境なら結果は再現するはず。Agent ループ後は経路が確率的(probabilistic)に——何回目で緑になるか、途中で何版コードを経たか、Archive を誤って踏んだか、にランダム性が乗ります。すぐにプラットフォームを替えろ、という話ではなく、「キャッシュを足すだけ」では全部は直らない理由の説明です。

観点 従来 CI(単発検証) ループ化 CI(Agent retry loop)
起動回数 人の push 駆動、少ない 失敗で自動再実行、×N
コード版 PR 先端が固定 ループ中に commit が連続変化
失敗の意味 現コードに問題がある 「まだ試行回数が足りない」可能性
コスト minutes × 単価 minutes + token + 環境 cold start

GitHub は workflow、runner、キャッシュを改善し続けています——対象は単発の決定的 jobです。repo がすでに Agent loop を前提にしていると、それらの改善は有効でも、「job 数 × retry 回数」の乗法効果は止められません。タイトルが「GitHub はまだ気づいていない」と言うのはここを指します。プロダクトの語りは CI/CD のまま、使われ方は自動修復ループ装置へドリフトしています。

3 · 第三層:構造の変化——CI パイプラインから retry loop + 実行基盤へ

第一層の症状と第二層の原因を揃えると、構造変化は一文で言えます:CI が直線パイプラインから、フィードバック環を持つ実行システムになった

図 1 · ループ化 CI:Agent 判断 + Runner 実行 + フィードバック環

Developer intentionテスト · lint · リリース境界
AI Agentログ読取 · patch · 再トリガ
Execution substrateRunner / Cloud Mac · コンパイル · 署名
Retry loop失敗 → 修正 → 再実行

旧モデル:Code → Build → Test → Result。一歩失敗すればライン全体が止まる。新モデル:Code → Agent → Modify → Execute → Retry → … → Result。失敗は終点ではなく環の一部。GitHub 上の緑チェックは依然安心材料ですが、意味は変わりました——4 回目でようやく緑で、途中の commit はもう別物かもしれません。

ここで実務向けの用語:execution substrate(実行基盤)。Agent はコードをいくら書き換えても、コンパイル・署名・アップロードは安定して再現可能な macOS 実行面に落ちる必要があります。Serverless job は短すぎて状態を持ち越せない。ローカル Mac は sleep し、Xcode が勝手に上がる。ホスト runner はキューし、スペックがドリフトする。Cloud Mac が埋めるのはこの層——リモートデスクトップではなく、retry loop の中でできるだけ deterministic に保つべき唯一の層です。

実行権も移っています。以前は人が workflow を書き、マシンが従う。今は人が境界を書く(PR に何を入れるか、Archive をどこで許すか、retry の上限)、Agent が境界内で経路を試し、人が最終結果を受け入れる。macOS / iOS チームがいちばん敏感なのは、署名と Archive を retry 環で無限に回すべきではないという点——緑が出てもリリース可能とは限りません。

核心(第三層の収束)
CI は消えたのではなく、「一度きりの検証ツール」から「ループ実行空間」に変わった。Agent は何を変え、何回試すかを担い、Runner / Cloud Mac はどこで、環境がドリフトしないかを担う——二層を分けて初めて、キュー・Xcode ブレ・flaky が説明できます。

4 · 第四層:Cloud Mac で実行面を固定する(今すぐできること)

GitHub の narrative が変わるのを待つ必要はありません。Actions を捨てる必要もありません。ループ化 CI に対して VPSSpark 側で繰り返し効果が確認されているのは次の 4 点——Cloud Mac がホスト runner と差が出やすいところです。

4.1 プール分離:retry の被害半径を限定

PR では L0/L1 のみ(analyze、単体テスト、シミュレータビルド)、Archive を PR に入れない。リリース・IPA・公証は main / tag 専用の隔離プールだけ。Agent ループが激しくても、35 分の Archive が fast プールを占有し、全員 Queued にはしません。ハードルールと事例は CI Hard Rules、Flutter の二重プール構成は Cloud Mac 2 台で fast / archive 分離 を参照してください。

4.2 Warm environment:retry のたびに cold start させない

PUB_CACHE、DerivedData、Pods ダウンロードキャッシュを永続化。Runner は起動時自動登録、7×24 オンライン。Agent の 2 回目の retry で 15 分の pod install をやり直す必要はない——そうでないと Xcode 時間のブレが「プロジェクトが重くなった」と誤読されます。Cloud Mac で買っているのは環境を維持するコストであり、単発 CPU 分だけではありません。

4.3 macOS execution substrate:ツールチェーン版を固定

イメージや fvm で Flutter / Xcode のメジャーを pin。Archive 機と fast プールは物理分離し、DerivedData を共有しない。retry の各ラウンドは同じ Distribution 証明書、同じ CLTで走るべき——iOS CI を監査可能にする前提です。セルフホストの境界は GitHub 公式ドキュメント を参照。

4.4 Retry isolation:ループに上限を設ける

workflow で concurrency を使い同一 PR の古い run をキャンセル。Agent トリガー専用の timeout と最大 push 回数を設定。署名機は release プールのみアクセス可。構文は workflow リファレンス 参照。目標は Agent を消すことではなく、ループを制御可能な境界内で回すことです。

PoC のすすめ(1~2 日)
まず Cloud Mac 1 台で macos-fast 快池を立て、Archive はホスト runner に残す。3 日間 P95 キューと Xcode wall time の分散を観測。快池が安定したら 2 台目の Archive 機を追加——「2 台スタート」シリーズと同じ動機で、キュー対策から Agent retry 対策へ拡張します。

5 · FAQ

「CI は死んだ」は煽りすぎでは?

タイトルは大げさですが、指している現象は本物です。pipeline は緑のまま、PR もマージされている——それでも「同じコード・同じチェックなのに、走るたびに経路と結果が安定して再現しない」。ここで言う「CI は死んだ」は GitHub Actions が使えないという意味ではなく、古典 CI の前提——ビルドと検証が決定的なフローである——が、Agent がコードを何度も書き換え workflow を何度も起動する場面ではもはや成り立たない、ということです。より正確には:CI は残っているが、意味が変わった。「継続的インテグレーション」から「継続的トライ」へ滑っています。

GitHub はこの流れに製品を合わせるのか?

合わせますが、ペースは使われ方のドリフトに追いつかないかもしれません。近い将来も workflow 最適化、runner 拡張、キャッシュ改善は続く——いずれも従来型 CI向けです。Agent 関連(sandbox、呼び出し監査、token 課金)は段階的に足される可能性が高く、一夜で narrative を書き換えることは少ないでしょう。チームにとって公式の定義を待たずに動ける:既存 Actions 上で PR / Archive 分池、retry 制限、署名機ロック——これが Agent 時代の最低コストのガードレールです。

Cloud Mac とホスト macOS runner の違いは?

一言で:ホスト runner は「1 job 分の実行時間」を借りる。Cloud Mac は「長期安定した環境」を買う。たまにリリースし、キューは許容、job が短い——ホスト macos-latest で足りることも多い。Agent loop や高頻度 iOS CI では違います。Xcode / 証明書 / キャッシュの常駐、fast と Archive の物理分離、sleep やサイレントアップグレードで環境が切れないこと。Cloud Mac の価値は後者——署名・Archive・公証では、retry の各ラウンドが同じ鍵・同じツールチェーンで走るべきで、cold start の運任せにすべきではありません。

OpenClaw / ローカル Agent との関係は?

対立しません。層が違います。OpenClaw、Cursor Agent、ローカル Copilot などは「何を変えるか、タスクをどう編成するか」——Gateway とスケジューリング寄り。本稿の Runner / Cloud Mac は「どこで、どの環境で走らせるか」——コンパイル、テスト、署名、アップロード。Agent はローカルで patch しても CI でループしても、macOS ビルドは最終的に再現可能な実行面に着地する。編成層と実行層を分けて設計しないと、「Agent は賢いのに、毎回 CI が見知らぬ環境でゼロから」というズレが起きます。

第四層の次の一歩:Cloud Mac 1 台で実行面を固定

前三層に共感があるなら——キュー、Xcode ブレ、retry 暴走、flaky——第四層を一度に全部やる必要はありません。いちばん多い道筋は:まず Cloud Mac 1 台で warm 快池を立て、Agent retry でいちばん痛い cold start とツールチェーンドリフトを抑える。Archive と署名は必要に応じて隔離。Apple Silicon の低消費電力は常時オンラインに向き、iOS / macOS チームにとって GitHub minutes パックを足すより、ループ化 CI の課金構造に直撃します。

本稿を PoC のたたき台にするなら、VPSSpark Cloud Mac mini を macOS execution substrate の起点に——プランを確認し、環境を先に固定してから Agent の N 回目を回してください。

期間限定

CI の意味が変わった?先に実行環境を固定

Agent loop · Cloud Mac 基盤 · プール分離

ホームへ
期間限定 プランを見る