nuxt@3.7.4 NITRO_PRESET=firebaseでデプロイに失敗する
概要
- 無邪気に
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が立っていた
なるほど?Nitroの問題なのかしら
よくわかっていないですが、Nitroのドキュメントを確認してみると、Cloud Functionsの1st genと2st genについて書かれていました
ちなみに、Cloud Functionsの第1世代?第2世代?について、は下記記事がわかりやすかったです(ありがとうございます)
Issueのコメントにもあるが、Nitroの設定を足す&2stで指定することで、デプロイすることが確認できました
# ...
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周りのコードを読んでいました
で、ここにたどり着いた
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]
とあるので、これじゃなかろうかと思いました
さっそく修正してみる
# ...
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.json
のengine
にまだnode:16
がいたので修正して解消した
# ...
"engines": {
"node": "18"
},
# ...
雑感
本当はNitroのドキュメントにPR投げたいんだけど、やり方がわからない(探している)
Discussion