GitHub Actions で Firebase の Deploy をする

# はじめに

こんにちは！

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

https://qiita.com/advent-calendar/2020/gamewith

# GitHub Actions

https://github.co.jp/features/actions

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

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

https://github.com/marketplace/actions/github-action-for-firebase

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

```yml
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 ができます。

# 詰まった点

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

https://www.npmjs.com/package/canvas

エラーログ

```
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` では動かないようです。

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

```yml
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 をします。

# 終わりに

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