microCMSからGitHub ActionsへWebhook通知し、Firebaseにデプロイする。


## はじめに
オウンドメディアをJAMStack構成（Gatsby.js + microCMS + Firebase Hosting）で作成しました。

microCMSで記事を投稿・更新・削除した際に、GitHub ActionsへのWebhook通知を用いて、自動でデプロイするように設定したので、その忘備録としてまとめました。
間違えている部分や「こうした方がいいよ！」とかあればコメント頂けると幸いです。

今回参考にした記事は以下の2つの記事です。ありがとうございました。

* [GitHub ActionsへのWebhook通知に対応しました](https://microcms.io/blog/webhook-for-github-actions/)
* [Nuxt × Firebase アプリケーションを GitHub Actions で自動デプロイ](https://qiita.com/ko_u_0402/items/ff9c2095b529463bcdf9#firabase-%E8%AA%8D%E8%A8%BC%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E8%A8%AD%E5%AE%9A)


## microCMS側の設定

microCMSとGitHub Actionsでの連携をするには、microCMSの管理画面から、API設定の「Webhook」を開きます。
![スクリーンショット 2020-11-12 18.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532380/34aeaed1-21b4-c3d8-9e80-7f0e87860299.png)

追加ボタンを押し、GitHub Actionsを選択します。
![スクリーンショット 2020-11-12 18.35.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532380/71c47a94-edea-fc83-335a-e7a5836b875f.png)

microCMSとGitHub Actionsと連携するために、以下の4つの情報を入力します。

* GitHub Token
* リポジトリユーザー名
* リポジトリ名
* トリガーイベント名 ※GitHubでyml設定ファイルに記載するtype属性の値を設定します。（今回はblog_postとしました。）

また、Webhookを通知するタイミングも合わせてチェックします。

![スクリーンショット 2020-11-12 18.37.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532380/c528c66c-70c1-4e54-6fef-0f4b35368b17.png)

GitHub Tokenについては、GitHub Docsの公式サイトを参考に作成してください。

* [Creating a personal access token
](https://docs.github.com/ja/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token)
![スクリーンショット 2020-11-12 18.43.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532380/7bdbe32c-ac5d-1051-5edd-8b0d852c473c.png)

## GitHub Actions連携

続いてGitHub Actionsの設定をしていきます。
該当のリポジトリページを開いて、Actionsのタブを選択します。
workflowが1つもない状態だと下記の画面が表示されます。
![スクリーンショット 2020-11-12 18.53.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532380/d659eb32-a487-8291-5773-1243946f8457.png)

今回は、Node.jsのworkflowを使用します。
![スクリーンショット 2020-11-12 18.56.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532380/ed2ef48c-5f48-9314-b083-e53a8039c104.png)

開くと、ymlファイルを設定できるページに遷移します。
![スクリーンショット 2020-11-12 18.58.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532380/af78ac09-b2c4-6835-cb1d-881a5e3e9144.png)

ymlファイルの中を以下の内容で記載します。

```
name: Node.js CI

on:
  push:
    branches: [ master ]
  repository_dispatch:
    branches: [ master ]
    types: [blog_post]
    
  
jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [10.x, 12.x, 14.x]

    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
    - name: yarn install, build
      run: |
           yarn install
           yarn build
    - name: deploy to Firebase Hosting
      uses: w9jds/firebase-action@master
      with:
        args: deploy
      env:
        FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
```

中身についてはまた別の記事でまとめて書きたいなーと思ってます。（自分ために）
ymlファイルについてはわかりやすく書かれている記事がたくさんありますしね…

### Firabase 認証トークン
デプロイの際に、Firebase認証トークンが必要になってきますので、それもお忘れないように。ymlファイル内の下記の部分ですね。

```
name: deploy to Firebase Hosting
      uses: w9jds/firebase-action@master
      with:
        args: deploy
      env:
        FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
```

Firebase認証トークンについては、下記のコマンドを打つと、Googleがアクセスリクエストしてくるので、許可して認証トークンをメモしておきます。

```
$ firebase login:ci
```

続いてGitHubのリポジトリのページで、Settingsを開き、サイドバーメニューからSecretsを選択します。
Nameに「FIREBASE_TOKEN」と入力し、Valueに先程メモした認証トークンを設定します。

![スクリーンショット 2020-11-12 19.12.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532380/fa73114b-1a89-becf-0709-af36111da8d8.png)


ここまで設定できたら自動でデプロイできているはずなので、試しにmicroCMSの画面から記事を作成して、GitHub Actionsが正しく動作しているかどうかを確認してみましょう。
正しく動作しているかどうかは、該当リポジトリのActionsページで確認ができます。

![スクリーンショット 2020-11-12 19.16.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532380/928b4e8b-865a-072d-93cb-42ec9654da5b.png)

## 最後に

まだメディア自体の記事数がそこまでないので、ビルド自体にそこまで時間はかかりませんが、記事数が増えたりするとその分時間がかかってしまうんですかね。SSGなどの特徴を踏まえてそのあたりもまた調査しておこうと思います。