【Flutter】CodemagicでAndroidのbuildに失敗するので対応した
はじめに
Codemagicでgoogle-services.json関係でAndroidのビルドが失敗するようになり、調べて解決したのでシェアしたいと思います。
分かりづらい点や、誤り等ございましたら、ご指摘いただけるとありがたいです。
(Twitterにご連絡ください。)
この記事がどなたかの参考になれば幸いです。
前提
CodemagicとFirebaseは設定が終わっていることを前提とします。
Codemagic
Firebase
環境
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
大雑把な流れは以下です。
- Firebaseの設定ファイル(今回はgoogle-services.jsonのみ)をbase64でエンコード。
- エンコードされた文字列をCodemagicのWorkflowで変数に入れて登録。
- 登録した変数をデコードしたものを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を使ってみようと思っています。
ここまで読んでいただきありがとうございました!
参考サイト
主に参考にさせていただきました。
google-services.jsonとGoogleService-Info.plistはgitignoreした方がいいということが途中に書いてあります。
Discussion