[Astro #20] GitHub ActionsによるNetlifyデプロイの自動化とメモリ不足・二重ビルドの回避策
はじめに
Astroプロジェクトのデプロイメントにおいて、Netlify標準のビルド環境ではメモリ制限(約3GB)がボトルネックとなり、ビルドが失敗するケースがある。
本稿では、CI/CD環境をGitHub Actions(ubuntu-latest)へ移行し、潤沢なリソースを用いてビルドを実行した後、成果物のみをNetlifyへデプロイする自動化パイプラインの構築手順、およびその過程で発生する特有のエラーへの対処法を記録する。
前回の記事:
[Astro #19] Windows の EPERM エラー対策と WSL2 への開発環境移行 // PROTOCOL.LAIN
Windows ネイティブ環境でのファイルロックに起因する EPERM エラーを回避するため、WSL2 (Ubuntu) への移行、Git/SSH の再設定、Node.js (fnm) の構築、および VS Code の WSL 連携手順をまとめました。
lain-lab.com1. ワークフロー定義ファイル (deploy.yml)
.github/workflows/deploy.yml に以下の設定を記述する。Node.jsのバージョンは環境に合わせて変更すること。
環境変数(DBトークンやAPIキー)はGitHubのSecretsで管理する。
環境変数
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)
症状:
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 エラー
症状:
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)のインデックス生成もパイプラインに統合され、デプロイごとの手動操作は完全に不要となった。