Github ActionsでFirebase(Hosting)へのデプロイを行うところまでやってみた
はじめに
create-react-app でReactアプリを作り、Firebaseでのアプリ作成まで実施済みで、Github ActionsでFirebaseへのデプロイをするところまでの備忘録。
ちなみにパッケージマネージャは yarn を使っていて、 package.json では、以下のスクリプトを用意している状態。
{
"scripts": {
"build": "react-scripts build",
"deploy": "firebase deploy",
}
}
この他にLintかけてたりもするんだけど、その辺りは省略。
Github Actions の設定ファイルを作成
リポジトリのページのActionsタブから、「New workflow」で作成。
いくつかテンプレートが用意されているので、ここからNode.jsのものを選んで進めた。テンプレートから作成できるのありがたい。
作成時点で、
ブランチの指定と最低限のジョブの指定(OSの指定からNode.jsのバージョン、依存パッケージのインストールやビルドの実行など)がされているので、ここに書き足していく形で進んだ。
依存パッケージ部分の書き換え
yarn を使っているので、 npm ci
部分を yarn --frozen-lockfile
yarn.lock の更新をかけないようにするため --frozen-lockfile
を付けている。
- name: Install node_modules
run: yarn --frozen-lockfile
Firebase へのデプロイを実施
firebase-tools を入れておく
$ yarn add -D firebase-tools
GitHub ActionsでFirebaseにデプロイする - きり丸の日記
ほとんどこの記事の通りなんだけど、
CLIでログインコマンドを叩いてブラウザからログイン、CLI上に表示されたトークンをGithubのリポジトリでSecretsに追加。
デプロイ用のジョブを追加。
- name: deploy to Firebase Hosting
run: |
yarn deploy --token=${{ secrets.FIREBASE_TOKEN }}
あとはイベントに応じてやってくれるようになる
キャッシュ改善
何もキャッシュしていない状態だと yarn install
にかなり時間を取られて (2ms) それはちょっとってなったのでキャッシュさせることに。
キャッシュの保存先を定義するときにIDを付けておく
- name: Get yarn cache directory path
id: yarn-cache
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: Cache node_modules
uses: actions/cache@v2
env:
cache-name: cache-node-modules
project-name: project-name
with:
path: ${{ steps.yarn-cache.outputs.dir }}
key: ${{ runner.OS }}-${{ env.project-name }}-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.OS }}-${{ env.project-name }}-${{ env.cache-node-modules }}
${{ runner.OS }}-
- name: Install node_modules
if: steps.yarn-cache.outputs.cache-hit != 'true'
run: yarn --frozen-lockfile
with.path
で上で定義したpathを指定すること。またIDを付けておくことでキャッシュヒットしたか確認する際にたどりやすくなる。
これで結果的にキャッシュが効いている間はキャッシュからの呼び出しになるのでインストールしない分、数sくらいで処理が終わるようになった。
イベント発火タイミングを調整
PRのマージのタイミングだけデプロイしたら良いんだけど、マージのイベントは無いらしいので、以下の記事を参考にPRのクローズイベントとPRがマージされていることを条件に設定。
GitHub Actions でプルリクのマージでワークフローを実行する - Qiita
ブランチの指定箇所に types: [closed]
をつけること、
jobs の上の方で、ブランチの状態確認を挟むことで対応。
if: github.event.pull_request.merged == true
やってみて
先駆者の記事参考にしつつ結構さっと組めたし感謝。
これまでCircleCIでやってたんだけど、この雰囲気で進められるなら CircleCIから移行してみてもいいかなー