🎃

【Flutter】CodemagicでAndroidのbuildに失敗するので対応した

2022/03/11に公開

はじめに

Codemagicでgoogle-services.json関係でAndroidのビルドが失敗するようになり、調べて解決したのでシェアしたいと思います。

分かりづらい点や、誤り等ございましたら、ご指摘いただけるとありがたいです。
(Twitterにご連絡ください。)
この記事がどなたかの参考になれば幸いです。

前提

CodemagicとFirebaseは設定が終わっていることを前提とします。

Codemagic

https://blog.codemagic.io/getting-started-japanese/

Firebase

https://firebase.google.com/docs/flutter/setup?hl=ja&platform=android

環境

MacOS12.2.1

flutter doctor

Doctor summary (to see all details, run flutter doctor -v):
[] Flutter (Channel stable, 2.10.0, on macOS 12.2.1 21D62 darwin-arm, locale ja-JP)
[] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
[] Xcode - develop for iOS and macOS (Xcode 13.2.1)
[] Chrome - develop for the web
[] Android Studio (version 2020.3)
[] Connected device (3 available)
[] HTTP Host Availability

• No issues found!

エラー詳細

== Building for Android ==

> flutter build apk --debug

💪 Building with sound null safety 💪

Running Gradle task 'assembleDebug'...                          

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:processDebugGoogleServices'.
> File google-services.json is missing. The Google Services Plugin cannot function without it. 
   Searched Location: 
  /Users/builder/clone/android/app/src/debug/google-services.json
  /Users/builder/clone/android/app/src/google-services.json
  /Users/builder/clone/android/app/src/Debug/google-services.json
  /Users/builder/clone/android/app/google-services.json

エラーのスクリーンショット

CodemagicでAndroidのビルドしようとするとgoogle-services.jsonが見つからないと表示されてます。
(ローカル側ではAndroid simulatorでビルドはできています。)
セキュリティの観点からgoogle-services.jsonはリモートリポジトリにpushしていないので、それが原因のようです。
google-services.jsonをpushすればいいと思ったのですが、
Firebaseの設定ファイル(?)である、google-services.jsonとGoogleService-Info.plistは
Codemagicでもpushしないよう以下記載されていましたので、pushせずに解決したいと思います。

私たちのローカル環境では、google-services.jsonとGoogleService-Info.plistファイルをダウンロードし、それぞれFlutterアプリのandroidとiosディレクトリに保存しています。これらのファイルには、APIキーやアプリに関する情報など、機密性の高いデータが含まれています。これらのファイルは、バージョンコントロールにチェックインしたり、世間に公開したりしてはいけません。私たちは、機密データを保護するために、一定の措置を講じなければなりません。
Flutterを使ったGoogleサインイン&Firebase認証 | Codemagic Blog

対処方法

以下サイトに記載された手順で解決しましたので、その説明になります。
How to load Firebase config in Codemagic with environment variables [Video] | Codemagic Blog

大雑把な流れは以下です。

  1. Firebaseの設定ファイル(今回はgoogle-services.jsonのみ)をbase64でエンコード。
  2. エンコードされた文字列をCodemagicのWorkflowで変数に入れて登録。
  3. 登録した変数をデコードしたものをCodemagicのpre-buildセクションに登録

1. Firebaseの設定ファイル(google-services.json)をbase64でエンコード

terminalで、google-services.jsonがあるフォルダに移動。

自分の場合は/android/app/google-services.jsonにあるので、そこに移動。

cd android/app

google-services.jsonをbase64でエンコード

以下コマンドを実行します。

openssl base64 -in google-services.json

すると長い文字列がでてくるのでそれをコピーしておきます。

2.エンコードされた文字列をCodemagicのWorkflowで変数に入れて登録する。

Codemagicのプロジェクト設定画面(Workflow Editor)を開きます。

Environment variablesを開いて登録

  • Environment variablesを開く
  • Variable nameに適当な変数名を入れる。
    (今回は参考サイトと同じくANDROID_FIREBASE_JSONと入力)
  • Variable valueに先ほどコピーした文字列を貼り付けます。(Secureにもチェック)
  • addを押します。
    以下のようになります。(すいません、DeepLのアイコンは無視してください!)
  • 画面右上のボタンで保存しておきます。

3. 登録した変数をデコードしたものをCodemagicのpre-buildセクションに登録

Buildセクションの上の歯車マークをクリックして、Pre-build scriptを表示します。


クリックするとこうなる

デコードのコマンドをコピーしてPre-build scriptに貼り付け

  • 以下コマンドをコピーします。
echo $ANDROID_FIREBASE_JSON | base64 --decode \
> $FCI_BUILD_DIR/android/app/google-services.json
  • Pre-build script欄に貼り付けます。

Androidでbuild完了!

最後に

CI/CDツールの勉強を兼ねて、Codemagicを使ってみようと思っています。
ここまで読んでいただきありがとうございました!

参考サイト

主に参考にさせていただきました。
https://blog.codemagic.io/how-to-load-firebase-config-in-codemagic-with-environment-variables/

google-services.jsonとGoogleService-Info.plistはgitignoreした方がいいということが途中に書いてあります。
https://blog.codemagic.io/firebase-authentication-google-sign-in-using-flutter-jpn/

Discussion