CloudFunctionsをデプロイするとGCP上でビルドが走るためにビルドエラーになってしまってデプロイできない問題の解決策

こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[@mogmet](https://twitter.com/mogmet)です。

本日はトラブルシュート記事になります。

結論からいうと、**package.jsonのscriptsに空のgcp-buildを追加する！** ことで問題が解決できます。

## エラー内容

```log
i  functions: updating Node.js 16 function xxx(us-central1)...
i  functions: updating Node.js 16 function xxx(us-central1)...
i  functions: updating Node.js 16 function xxx(us-central1)...
i  functions: updating Node.js 16 function xxx(us-central1)...
Build failed with status: FAILURE and message: > @app/functions@1.0.0 build
> tsc

error TS2688: Cannot find type definition file for '@types/jest'.
  The file is in the program because:
    Entry point of type library '@types/jest' specified in compilerOptions. For more details see the logs at https://console.cloud.google.com/cloud-build/builds;region=us-central1/d07d35e3-9dc0-48e0-bbdc-1184bf0ed04f?project=103424089072.
Build failed: > @app/functions@1.0.0 build
> tsc

error TS2688: Cannot find type definition file for '@types/jest'.
  The file is in the program because:
    Entry point of type library '@types/jest' specified in compilerOptions; Error ID: 1a2262f3
Build failed: > @app/functions@1.0.0 build
> tsc

...

Error: There was an error deploying functions:

...

- Error Failed to update function xxx in region asia-northeast1
- Error Failed to update function xxx in region asia-northeast1
Error: Process completed with exit code 2.
```

## 原因

エラーが起こったプロジェクトはyarnによるmonorepo構成でプロジェクトを構成しておりました。
cf:

https://qiita.com/mogmet/items/fafe7c58cb7649cf1b36

事前にローカルでビルドを実施し、成果物のみをアップロードしている形になります。
それが、ある時を堺にGCP上でビルドが走るようになり、devDependencyのものはないためエラーが起こるようになりました。

調べてみるとどうやら原因と思わしきbreakingな変更があることを発見しました。

https://cloud.google.com/functions/docs/release-notes#April_11_2023


> All 1st and 2nd gen Google Cloud Functions using the Node.js runtime now automatically run the npm run build command during deployment if they define an npm build script in their package.json file. This feature is rolling out over the next few days.

つまり、要約すると、**デプロイ時にnpm run buildコマンドを自動的に実行します。** ということになります。
キイテナイヨーーー！！！
（情報収集不足なだけ？）

## 対策

buildコマンドを動かさないようにすれば解決できるため、release notesにも記載がある2つの方法のうち、一つを実施するだけになります。

### 方法1

functionsのpackage.jsonのscriptディレクトリに`"gcp-build":""`を追加すると今まで通りデプロイ時に何も実行しなくなります。

```package.json
{
  "name": "@app/functions",
  "scripts": {
    ...
    "gcp-build": ""
  }
}
```

今回もぐめっとはこちらの方法で対策させていだきました。

### 方法2

環境変数としてGOOGLE_NODE_RUN_SCRIPTSを空でセットしてあげまると今まで通りデプロイ時に何も実行しなくなります。
`gcloud functions deploy`を使っている場合は`--set-build-env-vars=GOOGLE_NODE_RUN_SCRIPTS=""`のオプションをセットしてあげます。


## まとめ

**package.jsonのscriptsに空のgcp-buildを追加する！** ことでデプロイ時のビルドが走らなくなり、問題が解決できます。

最後に、スノボの楽しく滑るコツを掴める [cotsume](https://cotsume.page.link/blog) というアプリを作ってます！よかったらDLしてみてね！

https://cotsume.page.link/blog

また、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)、問い合わせ対応が簡単にできる[CSmart](https://csmart.jp/lp)、フリーランスのコミュニティの[NextFreelance](https://next-freelance.net/)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

https://csmart.jp/lp

https://next-freelance.net/

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/

ラグナロクでもエンジニアやデザイナーのメンバーを募集しています！！楽しくぶち上げたい人はぜひお話ししましょう！！

https://ragna-rock.com