• #github-actions
  • #build-optimization
  • #prompt
  • #ci-cd

ビルド効率化実装プロンプト

このドキュメントは、次回セッションで生成AIに渡すためのプロンプトです。


実施状況

タスク状態実施日
pnpmキャッシュ追加⚠️ 無効化2025-12-30
WAV変換ローカル化✅ 完了2025-12-30
Nitroログレベル変更❌ 取消2025-12-30
OGイメージ Workers化⏸️ 見送り2025-12-30

コンテキスト

プロジェクト概要

  • Nuxt 3 + @nuxt/content のブログサイト
  • Cloudflare Pages にデプロイ
  • GitHub Actions で CI/CD

現在の問題

GitHub Actions でのビルドに約4分かかっている。主なボトルネック:

  1. OGイメージの静的生成(約100秒、55MB)
  2. FFmpegインストール(32秒)- 毎回同じWAVファイルを変換 ✅ 解決済み
  3. pnpmキャッシュなし(22秒) ⚠️ キャッシュはプリレンダリングエラーを引き起こすため無効化

関連ドキュメント

  • /2025-12-29/build-optimization-analysis.md - 詳細な分析結果
  • /2025-12-30/og-image-workers-migration.md - OGイメージ Workers 化計画

タスク1: GitHub Actions キャッシュ追加 ⚠️ 無効化

実施内容

.github/workflows/deploy.yml を編集して、pnpm のキャッシュを追加したが、プリレンダリングエラーを引き起こすため無効化

問題

pnpmキャッシュを有効にすると一部のJリーグクラブページ(parceiro等)でSSRプリレンダリング時に500エラーが発生。

原因: キャッシュに古い/不整合な依存関係が残り、SSR時のランタイムエラーを引き起こした。

現在のファイル

- name: Setup Node.js
  uses: actions/setup-node@v4
  with:
    node-version: '22'
    # cache: 'pnpm' # プリレンダリングエラーを引き起こすため無効化

変更点

  • FFmpeg インストールステップを削除
  • pnpm setup を Node.js setup より前に移動
  • cache: 'pnpm' オプションを追加 → 無効化

詳細

.claude/issues/2025-12-30-prerender-jleague-500.md を参照


タスク2: WAV→WebM 変換のローカル化 ✅ 完了

実施内容

  1. ローカルで6つのWAVファイルをWebMに変換
  2. WebMファイルをGitにコミット
  3. WAVファイルを削除
  4. nuxt.config.ts のWAV変換処理を削除
  5. .github/workflows/deploy.yml からFFmpegインストールを削除

変換結果

ファイルWAVサイズWebMサイズ
boki3_ch4_0_00377KB115KB
boki3_ch4_0_01989KB290KB
boki3_ch4_0_021.3MB387KB
boki3_ch4_0_031.6MB479KB
boki3_ch4_0_042.3MB685KB
boki3_ch4_0_051.2MB352KB
合計7.4MB2.3MB

約70%のサイズ削減を達成。

nuxt.config.ts の変更

削除したコード:

  • import { execSync } from "node:child_process"
  • import { unlink } from "node:fs/promises"
  • WAV変換処理(convertWavToOpus 関数)

タスク3: Nitro ログレベルの変更 ❌ 取消

実施内容

nuxt.config.ts で Nitro のログレベルを warn に設定したがエラー発生時に詳細が見えなくなるため取消

取消理由

プリレンダリングエラーのデバッグ時、ログが抑制されて原因特定が困難になったため。

現在の設定

nitro: {
  preset: "cloudflare-pages-static",
  prerender: {
    crawlLinks: true,
    routes: ['/blog', '/'],
    concurrency: 10  // CI環境での安定性向上のため追加
  }
}

タスク4: OGイメージの Cloudflare Workers 化(見送り)

結論

検討の結果、見送りとした。現在の静的生成方式を維持する。

見送りの理由

  1. 現在の構成で十分機能している
    • ビルド時間100秒は許容範囲
    • 55MBのdistサイズもCDN配信なら問題なし
  2. OGイメージへのアクセスは実際少ない
    • SNSシェア時のクローラーのみがアクセス
    • 1日1万アクセス程度のサイトでは影響軽微
  3. 複雑さを増やすより、シンプルな構成を維持
    • Workers化は「やれば速くなる」けど「やらなくても困らない」最適化
    • メンテナンスコストを考えると現状維持が妥当

例外

日本語クイズのOGイメージは動的パラメータ(正解数/問題数)が必要なため、既にWorkers化済み。 このように動的にパラメータが変わるケースではWorkers化が有効。

詳細

/2025-12-30/og-image-workers-migration.md を参照


優先順位

順番タスク難易度効果状態
1pnpmキャッシュ追加20秒短縮⚠️ 無効化(エラー発生)
2WAV変換ローカル化32秒短縮✅ 完了
3Nitroログレベル変更ログ削減❌ 取消(デバッグ困難)
4OGイメージ Workers化100秒短縮⏸️ 見送り

alt text

実施後の結果

ビルド時間

項目変更前変更後
FFmpegインストール32秒0秒
pnpm install22秒22秒(キャッシュ無効)
Generate static site3分14秒3分14秒
Deploy17秒17秒
合計4分30秒約4分

結果

  • FFmpegインストール削除で32秒短縮
  • pnpmキャッシュは問題発生のため無効化(効果なし)
  • 合計で約30秒の短縮を達成

補足情報

ディレクトリ構造

mdx-playground/
├── .github/workflows/deploy.yml
├── apps/
│   ├── web/
│   │   ├── nuxt.config.ts
│   │   ├── public/audio/boki3/chapter4_0/*.webm  ← WAV から変換済み
│   │   └── app/components/OgImage/
│   │       ├── OgImageTemplate.vue
│   │       └── JLeagueOgImage.vue
│   └── workers/
│       └── og/src/index.ts