[Astro #20] GitHub ActionsによるNetlifyデプロイの自動化とメモリ不足・二重ビルドの回避策

[Astro #20] GitHub ActionsによるNetlifyデプロイの自動化とメモリ不足・二重ビルドの回避策

はじめに

Astroプロジェクトのデプロイメントにおいて、Netlify標準のビルド環境ではメモリ制限(約3GB)がボトルネックとなり、ビルドが失敗するケースがある。

本稿では、CI/CD環境をGitHub Actions(ubuntu-latest)へ移行し、潤沢なリソースを用いてビルドを実行した後、成果物のみをNetlifyへデプロイする自動化パイプラインの構築手順、およびその過程で発生する特有のエラーへの対処法を記録する。

前回の記事:

1. ワークフロー定義ファイル (deploy.yml)

.github/workflows/deploy.yml に以下の設定を記述する。Node.jsのバージョンは環境に合わせて変更すること。

環境変数(DBトークンやAPIキー)はGitHubのSecretsで管理する。

環境変数

[Astro #20] GitHub ActionsによるNetlifyデプロイの自動化とメモリ不足・二重ビルドの回避策 [Astro #20] GitHub ActionsによるNetlifyデプロイの自動化とメモリ不足・二重ビルドの回避策

deploy.yml

name: Deploy to Netlify

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'
          cache: 'npm'

      - name: Install dependencies
        run: npm install --legacy-peer-deps

      - name: Build Astro site
        run: npm run build
        env:
          # GitHub Actionsのリソースを最大限活用
          NODE_OPTIONS: "--max-old-space-size=8192"
          YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }}
          GOOGLE_SERVICE_ACCOUNT_EMAIL: ${{ secrets.GOOGLE_SERVICE_ACCOUNT_EMAIL }}
          GOOGLE_PRIVATE_KEY: ${{ secrets.GOOGLE_PRIVATE_KEY }}
          GSC_SITE_URL: ${{ secrets.GSC_SITE_URL }}
          ADMIN_PASSWORD: ${{ secrets.ADMIN_PASSWORD }}
          RESEND_API_KEY: ${{ secrets.RESEND_API_KEY }}
          MY_EMAIL: ${{ secrets.MY_EMAIL }}
          JWT_SECRET: ${{ secrets.JWT_SECRET }}
          ASTRO_DB_REMOTE_URL: ${{ secrets.ASTRO_DB_REMOTE_URL }}
          ASTRO_DB_APP_TOKEN: ${{ secrets.ASTRO_DB_APP_TOKEN }}
          ASTRO_DB_DATABASE_URL: ${{ secrets.ASTRO_DB_DATABASE_URL }}

      - name: Generate Pagefind Search Index
        run: npx pagefind --site dist

      - name: Deploy to Netlify
        uses: netlify/actions/cli@master
        with:
          args: deploy --dir=dist --prod --no-build
        env:
          NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
          NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}

2. トラブルシューティング

GitHub ActionsとNetlify CLIを連携させる際、以下の2つの致命的なエラーが発生しやすい。

2.1. メモリ不足エラー (JavaScript heap out of memory)

[Astro #20] GitHub ActionsによるNetlifyデプロイの自動化とメモリ不足・二重ビルドの回避策:2.1. メモリ不足エラー (JavaScript heap out of memory)

症状: npm run build 実行時、またはAstroのインテグレーション処理中(Shikiによるコードハイライト等)にプロセスがクラッシュする。

原因: Node.jsのデフォルトのメモリ使用量上限を超過している。Netlify環境では物理メモリの制約により拡張が困難だが、GitHub Actionsの ubuntu-latest は約7GBのRAMを提供しているため、Node.js側の上限を開放することで解決可能。

対策: ビルドステップの環境変数に NODE_OPTIONS: "--max-old-space-size=8192" を指定し、ヒープメモリの上限を8GBまで拡張する。

2.2. Netlify CLIによる二重ビルドと ENOENT エラー

[Astro #20] GitHub ActionsによるNetlifyデプロイの自動化とメモリ不足・二重ビルドの回避策:2.2. Netlify CLIによる二重ビルドと ENOENT エラー

症状: GitHub Actions上での npm run build は成功しているにもかかわらず、最終ステップの Deploy to Netlify において以下のエラーで失敗する。

Command failed with ENOENT: npm run build
spawn bash ENOENT

原因: GitHub Actions側ですでにビルドが完了しているのに対し、Netlify CLIが独自の設定を読み込み、リモートへのアップロード直前に再度 npm run build を実行しようとするため。

対策: netlify/actions/cli の引数(args)に --no-build フラグを追加し、Netlify側での自動ビルドを明示的に無効化する。これにより、生成済みの dist ディレクトリがそのまま転送される。 (※注意:--build=false という構文は無効であり Error: unknown option となるため、必ず --no-build を使用すること)

まとめ

本構成により、Netlifyの実行環境に依存せず、GitHub Actionsの潤沢なリソースによる安定したビルドとデプロイの自動化が実現した。また、静的ファイル検索エンジン(Pagefind)のインデックス生成もパイプラインに統合され、デプロイごとの手動操作は完全に不要となった。