くちたと計算記

プログラミングのことを書きます

GitHub Actions で Nuxt3 製の Web サイトを GitHub Pages にデプロイする

モチベーション

Nuxt3 で構築した Web サイトを GitHub Actions で GitHub Pages にデプロイするのに、ハマるとは思わなかったので記事にしました。

結論

GitHub 上で選択できる Starter Workflow を使うと上手くいかないので、以下のような仕様のワークフローを自分で書く必要がある。

  1. ソースコードをチェックアウトする。 --> Starter Workflow と同じように書ける。
  2. Node.js と パッケージマネージャーをセットアップする。 --> npm または yarn1.x を使うならStarter Workflowと同じように書ける。
  3. Nuxt3 で構成した Web サイトを SSG する。 --> Starter Workflow は参考にならない。
  4. SSG した静的サイトを成果物としてアップロードする。 --> Starter Workflow と同じように書ける。
  5. アップロードした成果物を GtiHub Pages にデプロイする。 --> Starter Workflow と同じように書ける。

Starter Workflow が動かない原因

actions/configure-pages が静的サイトジェネレータ(今回の場合は Nuxt)に応じて、動的に設定ファイルを書き換えている。 しかし、この処理は TypeScript を使った設定ファイルに対応しておらず、設定の内容も古い。

return {
  configurationFile: generatorConfigFile || detectOrDefaultConfigFile('nuxt.config'),
  blankConfigurationFile: `${__dirname}/blank-configurations/nuxt.js`,
  properties: {
    // Configure a base path on the router
    'router.base': path,

   // Set the target to static too
   // https://nuxtjs.org/docs/configuration-glossary/configuration-target/
   target: 'static'
  }
}

https://github.com/actions/configure-pages/blob/main/src/set-pages-config.js より

Nuxt3 で構成した Web サイトを GitHub Pages 用に生成する

以下のような steps をワークフローに組み込むと、 GitHub Pages 用に静的サイトを生成できる。

jobs:
  # Build job
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Configure GitHub Pages
        uses: actions/configure-pages@v5
        id: configure-pages

      - name: Static HTML export with Nuxt
        run: npm run generate
        env:
          NUXT_APP_BASE_URL: ${{ steps.configure-pages.outputs.base_path }}

プロジェクトのサイトをデプロイしたかったので、 baseURL環境変数で設定した。 nuxt.config.ts や app.config.ts で設定するなら環境変数は不要。また、ドメイン直下にデプロイするときも環境変数は不要。 設定値にはactions/configure-pages の outputs を流用した。

おまけ

Nuxt の公式サイトGitHub Pages にデプロイするためのワークフロー例が掲載されていた。 npx nuxt build --preset github_page では、 GitHub Pages 用に nitro が提供しているビルドの設定を利用していることが分かる。 ビルドの設定 を見てみると、baseURL を設定しているように見えない。 おそらく app.config.ts などで設定している前提なのだと思う。 nuxt.config.ts や app.config.ts で baseURL を設定しないなら、環境変数で baseURL を設定する必要がある。

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
     - run: npx nuxt build --preset github_page
        env:
          NUXT_APP_BASE_URL: ${{ steps.configure-pages.outputs.base_path }}

最後に

簡単にできるかなと思っていたことが、思ったよりも大変で驚いた。GitHub Pages や Nuxt3 のことを分かっている人にとっては、ワークフローを自分で定義すればいいだけなので、あんまり躓くポイントはなかったかもしれない。

参考にしたサイト