• #postmortem
  • #github-actions
  • #nodejs
  • #troubleshooting
開発完了

概要

2026年1月1日、GitHub Actionsのデプロイが連続2回失敗した。両方とも同一の原因:Node.js ヒープメモリ不足

失敗したRun

Run IDコミット失敗時刻
20632558839feat: URL構造の改善計画を文書化し、移行手順とテストコードを追加04:32:30 UTC
20631627161Add Deep Research prompt for FC町田ゼルビア...03:13:59 UTC

エラーメッセージ

FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory

<--- Last few GCs --->
[2158:0x3f6f0000]   161832 ms: Mark-Compact 2038.4 (2085.2) -> 2035.6 (2094.7) MB,
pooled: 0 MB, 1423.24 / 0.00 ms  (average mu = 0.245, current mu = 0.180)
allocation failure; scavenge might not succeed

発生状況

pnpm generate(Nuxt SSG)のプリレンダリング中に発生。

失敗直前に処理していたページ(両Run共通):

  • /2025-12-26/prompts/prompt-sanga
  • /2025-12-26/prompts/prompt-urawa
  • /2025-12-26/prompts/prompt-verdy

約2GB(2038-2043MB)のヒープメモリを使用した時点でクラッシュ。

2件目のRunでは追加でディスク容量不足の警告も発生:

##[warning]You are running out of disk space. Free space left: 85 MB

直近の成功したデプロイ

Run IDコミット完了時刻所要時間
20631294525feat: 各VueページにOGメタタグを追加し...02:38:32 UTC3m22s

成功時と失敗時の差分:

  • コンテンツ数の増加(338ファイル処理)
  • promptsページ(Jリーグクラブ用Deep Researchプロンプト)の追加

原因分析

直接の原因:大量のMarkdownファイル追加

成功したデプロイ(a4fb41c)と失敗したデプロイ(47d2d7f)の間で、+21,038行(24ファイル) が追加された。

主な追加ファイル(Jリーグクラブ用Deep Researchプロンプト):

ファイル行数
prompt-verdy.md1,305行
prompt-sanfrecce.md1,265行
prompt-vissel.md1,235行
prompt-gamba.md1,230行
prompt-jubilo.md1,225行
prompt-kawasaki.md1,225行
prompt-nagoya.md1,225行
prompt-sagan.md1,225行
prompt-fmarinos.md1,205行
prompt-consadole.md1,205行
prompt-sanga.md1,195行
prompt-reysol.md1,195行
prompt-zelvia.md1,116行

技術的な要因

  1. メモリ使用量の増加: SSGは全ページをメモリに読み込んでHTMLに変換するため、1ファイル1,200行超の巨大Markdownが13個追加されたことで2GBを超過
  2. GitHub Actions ubuntu-latestのデフォルト設定: Node.jsのmax-old-space-sizeがデフォルト値(約2GB)
  3. 大量の静的ページ生成: 338コンテンツファイル + Jリーグ62クラブ + コーディング規約158ルール

対策案

即時対応(推奨)

deploy.ymlGenerate static siteステップにNODE_OPTIONSを追加:

- name: Generate static site
  run: pnpm generate
  working-directory: apps/web
  env:
    NODE_OPTIONS: "--max-old-space-size=4096"
    OG_SECRET: ${{ secrets.OG_SECRET }}

これによりNode.jsのヒープ上限を4GBに拡大。ubuntu-latestは7GBのRAMを持つため、4GBは安全な値。

長期対応

  1. Nuxtの並列プリレンダリング設定: nuxt.config.tsnitro.prerender.concurrencyを調整
  2. インクリメンタルビルドの検討: 変更されたページのみ再生成
  3. キャッシュの活用: pnpmキャッシュを再有効化(現在一時的に無効)

適用した修正

1. Node.jsヒープメモリ拡大(deploy.yml)

- name: Generate static site
  run: pnpm generate
  working-directory: apps/web
  env:
    NODE_OPTIONS: "--max-old-space-size=4096"
    OG_SECRET: ${{ secrets.OG_SECRET }}

2. promptsディレクトリをプリレンダリングから除外(nuxt.config.ts)

nitro: {
  prerender: {
    ignore: [/\?/, /\/prompts\//],
  }
}

巨大なプロンプトファイル(各1,200行超)はSSGで事前生成する必要がないため、除外してメモリ消費を削減。

ステータス: 修正済み(2026-01-01)

参考リンク