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-static→cloudflare-pages+pnpm generate→pnpm 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 が継続
試したこと(時系列)
- NODE_ENV の可視化
- Actions に
echoとnode -eを追加して確認 - 結果:
NODE_ENVは空、Nuxt が production に変更
- Actions に
- nuxt-og-image を CI で無効化
enabled: process.env.CI ? false : ...- 結果:
__og-image__のログが消え、プリレンダリング数が減少 - ただし OOM は継続
- workers-og の動的 import + CI 早期リターン
apps/web/server/api/og/japanese-quiz.tsを修正- 結果: 依然として
unwasmのログが出るケースあり(バンドル段階で読み込まれている可能性)
- 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-ogのunwasm警告が まだ出ている- その後、Nitro ビルド中に OOM 継続
Prerendered 732 routesまで進むが完走せず
最新ログ(log_2.txt)
- log_1.txt と同様に
unwasm警告が出て OOM 継続
方針変更(暫定)
- 動的OGP生成を Nuxt のビルド工程から外す
server/api/og/*とページ側の動的OGP/シェア機能は一旦ロールバックworkers-og依存は Nuxt から削除
Worker分離の実装プラン(ドラフト)
- Workerプロジェクト作成(
apps/workers/og) - OGP生成エンドポイント実装
- キャッシュ戦略(24時間)
- フォント/アセット最適化
- 公開URL:
https://og.eurekapu.com/japanese-quiz?...(専用サブドメイン推奨) - Nuxt側の og:image 更新
- CI/CD 分離
Claude の評価(参考)
cloudflare-pages-static→cloudflare-pagesへの変更で、Nitro が Cloudflare Functions 用のバンドルを生成するようになった- このバンドル処理自体がメモリを多く消費する可能性がある
workers-ogは Cloudflare Workers 向けに最適化されたライブラリだが、ビルド時の WASM 処理が問題を起こしている可能性
次に試すこと(プラン)
- スタブ差し替え後の CI を実行して検証
unwasm警告・OOM が消えるか確認
- まだ落ちる場合はプリレンダリング範囲の削減
- CI 時のみ
crawlLinks: falseや routes の絞り込み
- CI 時のみ
- OG 系エンドポイントの追加切り分け
- workers-og を使う API が他にもないか確認し、同様に CI で無効化
- ビルド工程の分割・軽量化
- 画像/音声変換やコンテンツ処理の CI 回避を検討
参考
- 直近ログ:
apps/web/content/2025-12-24/log.txt