くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

firebase initのSet up GitHub Action deploysを試してみる&Hosting以外でもデプロイできるようにする

Firebase CLIfirebase initにある、
「Set up GitHub Action deploys」をちょっと試してみたときの備忘録(*´ω`*)

実行すると

  • サービスアカウントの作成
    • github-action-<project-no>@<project-id>.iam.gserviceaccount.com
  • GitHub ActionsのSecretsの作成
    • FIREBASE_SERVICE_ACCOUNT_<PROJECT_ID>
    • 中身はサービスアカウントのキーファイルのダンプ
  • workflow fileの作成
    • developへのpush時にLive chanelへのデプロイ
      • firebase-hosting-merge.yml
    • PRマージ時にReleseへデプロイ
      • firebase-hosting-pull-request.yml

をしてくれるっぽい。

実行してみる

「Hosting: Set up GitHub Action deploys」を選択すると、
利用するアカウントを聞かれ、いろいろ作成される。

$ firebase init
...
? Which Firebase features do you want to set up for this directory? Press Space to select features, then Enter to confirm your choices. (Press <space> to select, 
<a> to toggle all, <i> to invert selection, and <enter> to proceed)
 ◯ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys
❯◉ Hosting: Set up GitHub Action deploys

サービスアカウントの作成

作成されたサービスアカウントはこんな感じ。

権限は以下が設定されている。

  • API キー閲覧者
  • Cloud Functions 開発者
  • Cloud Run 閲覧者
  • Firebase Authentication 管理者
  • Firebase Hosting 管理者

GitHub ActionsのSecretsの作成

作成されたGitHub ActionsのSecretsはこんな感じ。

なにが入っているか確認するために、
secrets.FIREBASE_SERVICE_ACCOUNTの中身をファイルに出力してみると、

- run | 
    echo '${{secrets.FIREBASE_SERVICE_ACCOUNT}}' > $HOME/gcloud-service-key.json
    cat $HOME/gcloud-service-key.json

こんな感じの形式で入っているっぽい。

***
  type: service_account,
  // ... 略
  universe_domain: googleapis.com
***

workflow fileの作成

作成されるworkflow fileはこんな感じ。
FirebaseExtended/action-hosting-deployを使ってデプロイするよう。

firebase-hosting-pull-request.yml

### .github/workflows/firebase-hosting-pull-request.yml

# This file was auto-generated by the Firebase CLI
# https://github.com/firebase/firebase-tools

name: Deploy to Firebase Hosting on PR
'on': pull_request
jobs:
  build_and_preview:
    if: '${{ github.event.pull_request.head.repo.full_name == github.repository }}'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: npm ci && npm run build
      - uses: FirebaseExtended/action-hosting-deploy@v0
        with:
          repoToken: '${{ secrets.GITHUB_TOKEN }}'
          firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_<PROJECT_ID> }}'
          projectId: <project-id>

firebase-hosting-merge.yml

### .github/workflows/firebase-hosting-merge.yml

# This file was auto-generated by the Firebase CLI
# https://github.com/firebase/firebase-tools

name: Deploy to Firebase Hosting on merge
'on':
  push:
    branches:
      - develop
jobs:
  build_and_deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: npm ci && npm run build
      - uses: FirebaseExtended/action-hosting-deploy@v0
        with:
          repoToken: '${{ secrets.GITHUB_TOKEN }}'
          firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_<PROJECT_ID> }}'
          channelId: live
          projectId: <project-id>

FirebaseExtended/action-hosting-deployを使わずにデプロイする

FirebaseExtended/action-hosting-deployはhosting専用のため、
functionsとかのデプロイはできない。

ソースやissueを探していると、secrets.FIREBASE_SERVICE_ACCOUNTを使って、
Firebase CLIを使えるようにできるっぽい。

- name: Deploy to Firebase
  run: |
    echo '${{secrets.FIREBASE_SERVICE_ACCOUNT}}' > $HOME/gcloud-service-key.json
    export GOOGLE_APPLICATION_CREDENTIALS="$HOME/gcloud-service-key.json"
    firebase deploy --only hosting,functions

FirebaseExtended/action-hosting-deployの中でも、

  • secrets.FIREBASE_SERVICE_ACCOUNTjsonファイルに吐き出して、
  • env.GOOGLE_APPLICATION_CREDENTIALSjsonファイルのパスを設定し、
  • Firebase CLIenv.GOOGLE_APPLICATION_CREDENTIALSを使って認証する

という形を取っているのをうまく利用できるよう。

ただ、作成されたサービスアカウントはhositingようなので、
必要な権限が足りずにデプロイが失敗するので、必要なロール(役割)を追加しないといけない。
(Cloud Functions 開発者/Artifact Registry 書き込み/Firebase ルール管理者などなど)


以上!! サービスアカウントとかの自動作成は便利だけど、
ゴニョゴニョするといろいろデプロイできるようになるのでよさそう(´ω`)