FirebaseFunctions へのデプロイを GitHub Actionsを使って自動化する

# はじめに
Cloud Functions for Firebaseへ自動デプロイを行うときにfirebase login:ciが非推奨になっていて困ったためまとめます。

# 問題
GitHub ActionsからCloud Functions for Firebaseへ自動デプロイした際に以下の記事にたどりついたのですが、
https://qiita.com/yudai2929/items/afb993858d7ca12f34f1

以下の警告が出来ました。
この認証方法は非推奨なようですので、サービスアカウントで今回Github Actionsからデプロイを行ってみました。

```bash
⚠  Authenticating with a `login:ci` token is deprecated and will be removed
in a future major version of `firebase-tools`.
Instead, use a service account key with
`GOOGLE_APPLICATION_CREDENTIALS`: https://cloud.google.com/docs/authentication/getting-started
```

# 解決方法
1. サービスアカウント作成
サービスアカウント権限の管理から移動
![スクリーンショット 2024-12-09 161051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835870/0c144154-e3da-885e-32a9-dd22f01de48e.png)
サービスアカウントを作成
![スクリーンショット 2024-12-09 161605.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835870/9fa952ef-e324-cd4b-5e5d-62048f81d278.png)
記載して作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835870/bdfa6f6f-3d06-0863-f21a-8a7c660ee9b5.png)
2. キーを追加
鍵を管理
![スクリーンショット 2024-12-09 162114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835870/50e02341-56dd-ee20-86d3-9f73b62e1beb.png)
新しい鍵を作成・jsonファイルダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835870/d526d3fd-94e0-7577-f403-e791981d0376.png)

3. IAMを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835870/ce6f7c53-c677-cf6a-479e-026ec2f257b5.png)

ロールを割り当てる
- Cloud Functions 開発者
- Firebase Admin SDK 管理者サービス エージェント
- Firebase Extensions デベロッパー
- サービス アカウント ユーザー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835870/c8c4d756-d6f1-f31c-e063-badd75fd71bb.png)
プリジンバルはサービスアカウントのID
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835870/38c4505d-f721-9f2a-11d5-060dd1fa11ae.png)


4. keyをgithub secretsへ登録
ダウンロードしたjsonをbase64へ変換
```bash
cat ダウンロードしたjson名.json | base64
```
出力された値をActions secretsへ登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835870/9ac4b717-9cdc-8697-9641-f19774421527.png)

4. .github/workflows/yml記載
```yaml
name: firebase-ci-cd

on: 
  push:
    branches: ['master']
  workflow_dispatch:

jobs:
  firebase-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: 20
          cache: 'npm'

      # Functions用の依存関係をインストール
      - name: Install Functions Dependencies
        run: cd functions && npm ci

      # Firebase CLIのインストール
      - name: Install Firebase CLI
        run: npm install -g firebase-tools

      - name: Create SA Key File
        run: echo "${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY }}" | base64 -d > ${{ github.workspace }}/sa-key.json

      - name: Deploy to Firebase
        run: |
          export GOOGLE_APPLICATION_CREDENTIALS="${{ github.workspace }}/sa-key.json"
          firebase deploy --only functions

```

# おわりに 
自分のアプリ構成では上記の手順でうまくいったのですが、何か環境の違いなどでうまくいかないことがあると思いますので、ご指摘あればコメントください

# 参考
https://zenn.dev/9sako6/scraps/bf05311bce1ce1