• #CI
  • #GitHub Actions
  • #Nuxt
  • #Cloudflare Pages
  • #OOM

CI OOM 調査メモ(Nuxt / Cloudflare Pages)

背景

  • GitHub Actions の pnpm build で Node.js の heap OOM が発生
  • 発生箇所は Nitro サーバーのビルド中
  • 直近ログは apps/web/content/2025-12-24/log.txt に保存

なぜ pnpm build が必要になったか

  • 目的: 日本語作文クイズの結果シェア機能で動的OGP画像を生成したい
  • 制約: 動的OGP(/api/og/japanese-quiz?correct=8&total=10)にはサーバーAPIが必要
  • 変更: cloudflare-pages-staticcloudflare-pages + pnpm generatepnpm build
  • 結果: サーバーAPIは動くようになるが、ビルド時にOOMが発生

詳細: /2025-12-24/nitro-preset-change

ログで確認できたこと(要点)

  • NODE_ENV は build 前は空、Nuxt が自動で production に変更
  • NODE_OPTIONS=--max-old-space-size=4096 は build step に設定済み
  • OOM は ~2GB 付近で発生(GC ログから確認)
  • workers-og の WASM 読み込み失敗([plugin unwasm])が出るケースあり
  • nuxt-og-image を CI 無効化後、プリレンダリング数は 1089 → 730 に減少
  • それでも Nitro ビルド中に OOM が継続

試したこと(時系列)

  1. NODE_ENV の可視化
    • Actions に echonode -e を追加して確認
    • 結果: NODE_ENV は空、Nuxt が production に変更
  2. nuxt-og-image を CI で無効化
    • enabled: process.env.CI ? false : ...
    • 結果: __og-image__ のログが消え、プリレンダリング数が減少
    • ただし OOM は継続
  3. workers-og の動的 import + CI 早期リターン
    • apps/web/server/api/og/japanese-quiz.ts を修正
    • 結果: 依然として unwasm のログが出るケースあり(バンドル段階で読み込まれている可能性)
  4. CI で workers-og をスタブに差し替え(現在の変更)
    • apps/web/server/og/workers-og-stub.ts を追加
    • nuxt.config.ts で CI 時のみ alias
    • 目的: ビルド時の WASM 読み込みを完全回避

現状の評価

  • nuxt-og-image の静的生成は主因ではなさそう
    (無効化しても OOM が継続)
  • workers-og の WASM/バンドルが怪しい
    unwasm 警告が出る、OOM が Nitro ビルド中で発生)
  • スタブ化による効果は 未解決
    (CI ログで unwasm 警告が継続)

最新ログ(log_1.txt)

  • workers-ogunwasm 警告が まだ出ている
  • その後、Nitro ビルド中に OOM 継続
  • Prerendered 732 routes まで進むが完走せず

最新ログ(log_2.txt)

  • log_1.txt と同様に unwasm 警告が出て OOM 継続

方針変更(暫定)

  • 動的OGP生成を Nuxt のビルド工程から外す
  • server/api/og/* とページ側の動的OGP/シェア機能は一旦ロールバック
  • workers-og 依存は Nuxt から削除

Worker分離の実装プラン(ドラフト)

  1. Workerプロジェクト作成(apps/workers/og
  2. OGP生成エンドポイント実装
  3. キャッシュ戦略(24時間)
  4. フォント/アセット最適化
  5. 公開URL: https://og.eurekapu.com/japanese-quiz?...(専用サブドメイン推奨)
  6. Nuxt側の og:image 更新
  7. CI/CD 分離

詳細: 動的OGP画像生成 Worker 実装計画

Claude の評価(参考)

  • cloudflare-pages-staticcloudflare-pages への変更で、Nitro が Cloudflare Functions 用のバンドルを生成するようになった
  • このバンドル処理自体がメモリを多く消費する可能性がある
  • workers-og は Cloudflare Workers 向けに最適化されたライブラリだが、ビルド時の WASM 処理が問題を起こしている可能性

次に試すこと(プラン)

  1. スタブ差し替え後の CI を実行して検証
    • unwasm 警告・OOM が消えるか確認
  2. まだ落ちる場合はプリレンダリング範囲の削減
    • CI 時のみ crawlLinks: false や routes の絞り込み
  3. OG 系エンドポイントの追加切り分け
    • workers-og を使う API が他にもないか確認し、同様に CI で無効化
  4. ビルド工程の分割・軽量化
    • 画像/音声変換やコンテンツ処理の CI 回避を検討

参考

  • 直近ログ: apps/web/content/2025-12-24/log.txt

切り分けフローチャート(仮説)