どこにでもいるTSコーダーの忘備録

プログラミングに関する忘備録を自分用に残しときます。マサカリ怖い。

GitHub ActionからFirebase Functionsに デプロイできない問題

Firebase FunctionsのデプロイはGitHub Actionsで自動化している。

いつものように、デプロイ用のアクションをトリガーしたところ、⚠ functions: failed to update function xxxと表示されてしまい、他の関数のデプロイまでもが止まってしまう現象が起きた。

念の為、失敗した対象の関数を一度削除した。

そして、もう一度トリガーしてみることに。

今度は⚠ functions: failed to create function xxxと表示された。

ちなみにこの関数はPub/Subに関連しているである。

調べていたら、以下のコメントを見つけた。

github.com

試しにCloud Scheduler APIを無効にしてみる。

再度、有効にしてみる。

試しにPub/Sub APIも無効にしてみる。

しかし、怖い注意画面がでたので余計なことはしないでおく。

ダミーのcronジョブを作成してみる。

作成方法はこちらを参照。

cloud.google.com

トピックは適当に「dummy-topic」という名前をつけて作成した。

もう一度トリガーしてみた。

結果はまた失敗。。。

もう一回Firebase Functionsのログを見に行った。 そしたらなんか出てた。

Invalid function service account requested: default. Please visit https://cloud.google.com/functions/docs/troubleshooting for in-depth troubleshooting documentation.

よくみるとオーナー権限でCI用のトークンが発行されていたぽい。 なので、サービスアカウントをCI用に準備してそのアカウントを使用してトークンを発行する。

ログに表示されていたトラブルシューティングのページにそれっぽい内容を発見した。

cloud.google.com

まず、サービスアカウントを用意して、必要な権限を与える。

必要な権限

  • roles/iam.serviceAccountUser
    • サービス アカウント ユーザー
  • roles/cloudfunctions.admin
    • Cloud Functions 管理者
  • cloudscheduler.jobs.update
    • Cloud Scheduler 管理者

IAMのページにアクセスして、付与したいサービスアカウントの一番右にある鉛筆マークをクリックする。

表示されたメニューからロールを追加を選択する。別のロールを追加をクリックして、サービス アカウント ユーザー権限を付与して保存する。

次に、鍵を発行する。

サービスアカウントのページで、対象のサービスアカウントのメールアドレスをクリックする。

キーをクリックする。

鍵を追加をクリックして、新しい鍵を作成をクリックする。 鍵はJSONで発行する。

ダウンロードしたJSONファイルをBase64エンコードする。

cat service-account.json | base64

出力された文字列をGitHub Actionsのsecretsに保存する。

続いて、設定したsecretをワークフローファイル内で使用できるようにする。

--projectを使ってプロジェクト名を付与するのを忘れずに行う。

//  .github/workflows/deploy_functions.yml

...
- name: シークレットの内容をデコードする
  run: echo ${{ secrets.FIREBASE_SERVICE_ACCOUNT }} | base64 --decode > ./service-account.json
  working-directory: ./packages/functions
- name: functionsをデプロイする
  run: |
    firebase deploy --only functions --project ${{ secrets.FIREBASE_PROJECT_ID }}
  env:
    GOOGLE_APPLICATION_CREDENTIALS: "./service-account.json"
  working-directory: ./packages/functions

そしてトリガーを実行するも、また失敗。。。。

もうこなったらと思い、ローカルからデプロイしてみた。

firebase deploy --only functions --project project-name

結果はあっさり成功した。

今度はサービスアカウントを指定してローカルで実行してみる。

firebase logout
export GOOGLE_APPLICATION_CREDENTIALS=./service-account.json
firebase deploy --only functions --project project-name

これも成功した。

なぜかGitHub Actionsからはデプロイできない・・・

そんな中、こんなIssueが最近立っていた。

github.com

github.com

firebase-toolsのバージョンが11.2.0で同様の問題が起きているらしい。

そこで、firebase-toolsをインストールする際に@11.1.0にダウングレードしてインストールすると解決することが提起されている。

実際にワークフローの設定を修正して反映し、動かしてみた。

...
    - name: Install Firebase Emulator Suite
      run: yarn global add firebase-tools@11.1.0
      working-directory: ./packages/functions
...

すると、求めていたDeploy complete!が表示された。

やはり、@11.2.0系でなにやら問題があるようだ。 もしCI/CDでデプロイする場合はバージョンを@11.1.0にダウングレードしてfirebase-toolsをインストールしてみるとうまくいくかもしれない。