Bitriseでだけfirebaseエミュレータ+jestを使ったテストがコケるときの対処法


経緯

  • Bitriseでfirebaseのfirestore rulesのテストを実行したところ、ローカル環境では動作するのにBitriseだと動かなくてどハマりした。(下記症状)
  • このIssueで議論されているが、みんな苦しんでいるようだった

症状

+ node --version
v10.23.0
+ yarn install
...(省略)
+ yarn test
yarn run v1.22.4
$ firebase emulators:exec --only firestore 'jest --env=node'
i  emulators: Starting emulators: firestore
⚠  It appears you are running in a CI environment. You can avoid downloading the Firestore Emulator repeatedly by caching the /Users/vagrant/.cache/firebase/emulators directory.
i  firestore: downloading cloud-firestore-emulator-v1.11.5.jar...
i  firestore: Firestore Emulator logging to firestore-debug.log
i  Running script: jest --env=node
TypeError: _gracefulFs(...).realpathSync.native is not a function
...(省略)
    at Module._compile (internal/modules/cjs/loader.js:1136:30)
    at Module._compile (pkg/prelude/bootstrap.js:1281:32)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1156:10)
    at Module.load (internal/modules/cjs/loader.js:984:32)
    at Function.Module._load (internal/modules/cjs/loader.js:877:14)
    at Module.require (internal/modules/cjs/loader.js:1024:19)
    at Module.require (pkg/prelude/bootstrap.js:1225:31)
⚠  Script exited unsuccessfully (code 1)
i  emulators: Shutting down emulators.
i  firestore: Stopping Firestore Emulator
Error: Script "jest --env=node" exited with code 1
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

原因(推測)

  • yarn testで実際に実行されているコマンドはfirebase emulators:exec --only firestore 'jest --env=node'
  • このときfirebaseコマンドは/usr/local/bin/firebaseを見ているため、どうやらこのfirebaseが叩こうとするjestがローカルディレクトリ(./node_modules/.bin/jest)とは別物なのでローカルと挙動が変わってしまう=CIで動かない
    • →Bitriseのnodeプリインストール環境だとfirebase emulator+jestがコケるってこと...

対処法

  • 手元環境でyarn add -D @types/jestしておく(package.jsonのdevDependenciesに追加される)
  • yarn add global firebase-toolsをWorkflowのScriptに追加する
    • firebasejestの2つのコマンドを、自前でインストールしたものを使うようにする。
node --version
yarn global add firebase-tools # 追加
export PATH=`pwd`/node-modules/.bin:$PATH # yarnで入れたコマンドにパスを通す
yarn install
yarn test