😇

nuxt@3.7.4 NITRO_PRESET=firebaseでデプロイに失敗する

2023/10/12に公開

概要

  • 無邪気に yarn upgrade ! とかして、動作確認のため、CI/CD叩くと落ちた
  • 調べてみるとデプロイに失敗していた
  • もっと調べてみると、Cloud Functionsのデプロイに失敗していたので調査した

パッケージのバージョン

NuxtとNitroだけに絞る

$ yarn list --depth=0 | grep nuxt
├─ @element-plus/nuxt@1.0.6
├─ @nuxt/devalue@2.0.2
├─ @nuxt/devtools-kit@1.0.0-beta.0
├─ @nuxt/devtools-wizard@1.0.0-beta.0
├─ @nuxt/devtools@1.0.0-beta.0
├─ @nuxt/eslint-config@0.2.0
├─ @nuxt/kit@3.7.4
├─ @nuxt/schema@3.7.4
├─ @nuxt/telemetry@2.5.2
├─ @nuxt/test-utils@3.7.4
├─ @nuxt/types@2.17.1
├─ @nuxt/ui-templates@1.3.1
├─ @nuxt/vite-builder@3.7.4
├─ @nuxtjs/eslint-config-typescript@12.1.0
├─ @nuxtjs/eslint-config@12.0.0
├─ nuxt@3.7.4

$ yarn list --depth=0 | grep nitro
├─ nitropack@2.6.3

$ npm list -g --depth=0
/usr/local/lib
+-- corepack@0.14.2
+-- firebase-tools@12.6.2
`-- npm@8.19.2

調査

エラーの内容を確認してみる

Firebase CLIの結果だけどだとなんもわからない

# ...
✔  functions: required API cloudfunctions.googleapis.com is enabled
i  functions: Loading and analyzing source code for codebase nuxt-server to determine what to deploy
Serving at port 8970

shutdown requested via /__/quitquitquit


Error: An unexpected error has occurred.
error Command failed with exit code 2.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

ので、 firebase-debug.logを確認する

$ cat firebase-debug.log
# ...
[debug] [2023-10-12T06:24:17.499Z] Got response from /__/functions.yaml {"endpoints":{"server":{"platform":"gcfv1","availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"serviceAccountEmail":null,"vpc":null,"region":[null],"httpsTrigger":{},"entryPoint":"server"}},"specVersion":"v1alpha1","requiredAPIs":[]}
[info] shutdown requested via /__/quitquitquit

[debug] [2023-10-12T06:24:17.653Z] TypeError: Cannot read properties of null (reading 'match')
    at resolveString (/usr/local/lib/node_modules/firebase-tools/lib/deploy/functions/params.js:31:27)
    at /usr/local/lib/node_modules/firebase-tools/lib/deploy/functions/params.js:47:36
    at Array.map (<anonymous>)
    at Object.resolveList (/usr/local/lib/node_modules/firebase-tools/lib/deploy/functions/params.js:47:21)
    at toBackend (/usr/local/lib/node_modules/firebase-tools/lib/deploy/functions/build.js:180:30)
    at Object.resolveBackend (/usr/local/lib/node_modules/firebase-tools/lib/deploy/functions/build.js:73:23)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async prepare (/usr/local/lib/node_modules/firebase-tools/lib/deploy/functions/prepare.js:68:62)
    at async chain (/usr/local/lib/node_modules/firebase-tools/lib/deploy/index.js:38:9)
    at async deploy (/usr/local/lib/node_modules/firebase-tools/lib/deploy/index.js:95:5)
[error]
[error] Error: An unexpected error has occurred.

すると、こんなエラーで落ちていた。なるほどわからん

簡単にするために、firebase.jsonのCloud Functionsの設定を1つだけにする

nuxt-serverのみにしました

それでも失敗するので、やっぱりエラー文でググった

Issueが立っていた

https://github.com/nuxt/nuxt/issues/23496

なるほど?Nitroの問題なのかしら

よくわかっていないですが、Nitroのドキュメントを確認してみると、Cloud Functionsの1st genと2st genについて書かれていました

https://nitro.unjs.io/deploy/providers/firebase

ちなみに、Cloud Functionsの第1世代?第2世代?について、は下記記事がわかりやすかったです(ありがとうございます)

https://zenn.dev/nori_maki/articles/c8aee95a442ad9

Issueのコメントにもあるが、Nitroの設定を足す&2stで指定することで、デプロイすることが確認できました

nuxt.config.ts
# ...
  nitro: {
    preset: 'firebase',
    firebase: {
      nodeVersion: '18',
      gen: 2,
      httpsOptions: {
        region: 'us-central1',
        maxInstances: 1
      }
    }
  }
# ...

Cloud Functions 第1世代を使いたい

第2世代への移行は考えていましたが、今移行するのはサービスに影響があるため、サクッと切り替えということができませんでした

  • 2stに切り替えるためには、既存の1stをCloud Functions上から削除する必要がある
  • 1stと2stで若干定義が違う

どうしようかなと考えながらNitroのPreset周りのコードを読んでいました

で、ここにたどり着いた

https://github.com/unjs/nitro/blob/ae253596a847f764e275f7e0450ffdfcdcd8957e/src/types/presets.ts#L60-L97

Union typeで1stと2stのInterfaceを用意していた点とfirebase-debug.logで確認していたエラーをよくよくみてみると

[debug] [2023-10-12T06:24:17.499Z] Got response from /__/functions.yaml {"endpoints":{"server":{"platform":"gcfv1","availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"serviceAccountEmail":null,"vpc":null,"region":[null],"httpsTrigger":{},"entryPoint":"server"}},"specVersion":"v1alpha1","requiredAPIs":[]}
[info] shutdown requested via /__/quitquitquit

region":[null] とあるので、これじゃなかろうかと思いました

さっそく修正してみる

nuxt.config.ts
# ...
  nitro: {
    preset: 'firebase',
    firebase: {
      nodeVersion: '18',
      gen: 1,
      region: 'us-central1'
    }
  }
# ...

これでデプロイコマンドを実行してみると、デプロイ成功しました!

ちなみに、regionを削除すると同じエラーになりました

おまけ

firebase.jsonをすべて戻して実行してみると、また落ちた

# ...
[error] Error: User code failed to load. Cannot determine backend specification

一部Cloud Functionsの package.jsonengineにまだnode:16がいたので修正して解消した

# ...
  "engines": {
    "node": "18"
  },
# ...

雑感

本当はNitroのドキュメントにPR投げたいんだけど、やり方がわからない(探している)

CBcloud Tech Blog

Discussion