GitHub Actions で Firebase の Deploy をする


はじめに

こんにちは!

この記事は GameWith アドベントカレンダーの2日目の記事になります!

GitHub Actions

GitHub Actions は GitHub の CI/CD サービスです。

GitHub Actions にはマーケットプレイスがあり、他の人が作成した便利な Action が利用できます。

Firebase の Deploy は上記 Action を利用すれば簡単にできます。

name: Build and Deploy
on:
  push:
    branches:
      - master

jobs:
  build_and_deploy:
    name: Build&Deploy
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@master
      - name: Install Dependencies
        run: npm install
      - name: Install Functions Dependencies
        run: cd functions && npm install
      - name: Deploy to Firebase
        uses: w9jds/firebase-action@master
        with:
          args: deploy
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

上記のような yml ファイルで hosting, functions の Deploy ができます。

詰まった点

自分のサイトでは functionsnode-canvas を利用しているのですが、node-canvas を利用していると w9jds/firebase-action@master による Deploy が失敗します。

エラーログ

Error: Error occurred while parsing your function triggers.

Error: Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /github/workspace/functions/node_modules/canvas/build/Release/libpixman-1.so.0)
    at Object.Module._extensions..node (internal/modules/cjs/loader.js:1188:18)
    at Module.load (internal/modules/cjs/loader.js:986:32)
    at Function.Module._load (internal/modules/cjs/loader.js:879:14)
    at Module.require (internal/modules/cjs/loader.js:1026:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at Object.<anonymous> (/github/workspace/functions/node_modules/canvas/lib/bindings.js:3:18)
    at Module._compile (internal/modules/cjs/loader.js:1138:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
    at Module.load (internal/modules/cjs/loader.js:986:32)
    at Function.Module._load (internal/modules/cjs/loader.js:879:14)

どうやら w9jds/firebase-action@master では node-canvas の Install ができないようです。

https://github.com/w9jds/firebase-action/blob/master/Dockerfile

Action 毎に Dockerfile が用意されており Dockerfile を見てみると、 node:12.18.1-alpine では動かないようです。

ということで自前で書いていきます。

name: Build and Deploy
on:
  push:
    branches:
      - master

jobs:
  build_and_deploy:
    name: Build&Deploy
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@master
      - uses: actions/setup-node@v1
      - name: Install Dependencies
        run: npm install
      - name: Install Functions Dependencies
        run: cd functions && npm install
      - name: Install firebase-tools
        run: npm install -g firebase-tools
      - name: Deploy to Firebase
        run: firebase deploy --token $FIREBASE_TOKEN
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

actions/setup-node@v1 を追加し、firebase-tools をグローバルインストールします。

インストール後、firebase deploy --token $FIREBASE_TOKEN で Deploy をします。

終わりに

エラーログでかなりググって良い解決方法がわからず、何時間か溶かしたのでこの記事が誰かの助けになればと思います!