2021年10月版 CodemagicでFlutterアプリのCI/CDを構築する【Android編】

はじめに

ソフトウェアエンジニアの谷藤です。

Codemagic で Flutter アプリの Android 版の CI/CD を構築するための設定(2021年10月時点)について解説します。

iOS 版はこちら

hirotanifuji.hatenablog.com

あくまで Codemagic 上の設定の話なので、Flutter アプリ自体の設定などについては解説しません。

codemagic.io

1. 各連携

Sign up した後に、User settingsより各サービスとの連携を設定します。

f:id:HiroTanifuji:20210926175612p:plain

  • Bitbucket、GitHub、GitLab のどれかを連携させる(Sign upのアカウントとして選択した場合は、連携済み)

  • Slack を連携する(任意)

  • Developer Portal の連携は必要なし

2. アプリを作成する

Apps タブで Add application を押します。

次に、上記で連携させたホスティングサービス(Bitbucket、GitHub、GitLabのどれか)を選択します。

Select repository には適切なレポジトリを、Select project type には Flutter App を選択して、アプリの作成を完了させます。

f:id:HiroTanifuji:20210926180916p:plain

3. ビルドの設定

Workflow settings

Workflow name にはワークフローの名前を設定します。iOS との区別ができれば何でも良いです。

Max build duration には開始から何分後にタイムアウトさせるかを設定します。こだわりがなければ、120分で問題ないと思います。

f:id:HiroTanifuji:20210927094630p:plain

Build for platforms と Run build on

Build for platforms は Android を選択します。

Run build on は Billing を有効にしていない限り macOS Standard VM しか選択できないと思いますが、好みの VM を選択します。

f:id:HiroTanifuji:20210927095739p:plain

Build triggers

まずは、Automatic build triggering で好みのトリガーを選択します。

合わせて Watched branch patterns や Watched tag patterns も設定します。

例としてmaterブランチにプッシュされたらビルドが走るように設定しました。

f:id:HiroTanifuji:20210926182815p:plain

Environment variables

次は環境変数の設定です。ご自身の環境によって変わるので、以下の中で当てはまる項目のみ参考にしてください。

■ プロジェクトで .env を使っている場合

プロジェクトで .env を使っていて、このファイルをリポジトリに含めていない場合は、次の対応が必要になります。

この後の Pre-build script で使うので、.env ファイルを base64 エンコードした値をセットします。

Macを使っている場合、base64 .env | pbcopybase64 エンコード とその内容のコピーができます。

例として ENV にこの値をセットします。

■ プロジェクトで Firebase を使っている場合

プロジェクトで Firebase を使っていて、構成ファイルをリポジトリに含めていない場合は、次の対応が必要になります。

Firebase を使っている場合は、android/app/google-services.json として構成ファイルを配置する必要があります。

こちらもこの後の Pre-build script で使うので、google-services.jsonbase64 エンコードした値をセットします。

例として、ANDROID_GOOGLE_SERVICE にこの値をセットします。

f:id:HiroTanifuji:20210927095911p:plain

Dependency caching

パッケージなどの依存物をキャッシュする場合は有効にします。

有効にすることでビルド時間を短縮できるので、頻繁に回すビルドでは有効にした方がコストの面で良さそうです。

例として、公式に記載の以下の3つをセットします。

$HOME/Library/Caches/CocoaPods(CocoaPods のキャッシュ)

$HOME/.gradle/caches(Gradle のキャッシュ)

$FLUTTER_ROOT/.pub-cacheDart のキャッシュ)

f:id:HiroTanifuji:20210926184620p:plain

Tests

ビルド前に実行されるテストについての設定です。好みに合わせて設定してください。

基本的には、 Stop build if tests or analysis fail は有効にした方が良いと思うので、有効にします。

その他は、例として、Static code analysis の Flutter analyzer のみ有効にします。

f:id:HiroTanifuji:20210926184718p:plain

Pre-build script

ビルド直前に実行させるスクリプトの設定です。

今回は主に、上の Environment variables で設定した base64 エンコード済のファイルをデコードして、適切な位置に配置する目的で使用します。

例として、以下のようなスクリプトを設定します。

#!/bin/sh

# .env を base64 エンコードした値が設定されている ENV をデコードして、配置する
echo $ENV | base64 --decode> $FCI_BUILD_DIR/.env

# google-services.json を base64 エンコードした値が設定されている ANDROID_GOOGLE_SERVICE をデコードして、配置する
echo $ANDROID_GOOGLE_SERVICE | base64 --decode> $FCI_BUILD_DIR/android/app/google-services.json

f:id:HiroTanifuji:20210927101049p:plain

Build

次に最も重要なビルドについての設定です。

Flutter version はご自身の環境に合わせて設定してください。特にこだわりがなければ、デフォルトで問題ないと思います。

Project path もご自身の環境に合わせて設定してください。基本的には . だと思います。

Android build format もご自身の環境に合わせて選択してください。

Mode には Release を設定します。

f:id:HiroTanifuji:20210927103016p:plain

Build arguments には flutter build の後に付け加えたい引数を指定します。ご自身の環境に合わせて設定してください。

例として、以下を設定しました。

--target-platform android-arm,android-arm64,android-x64 --flavor production --build-number=$(($BUILD_NUMBER + 10))

flavor を設定している場合は、指定します。

--build-number は基本的には $BUILD_NUMBER で良いと思いますが、すでにビルドを Google Play にアップロードしている場合は、ビルド番号が重複となってしまいます。

その場合は、--build-number=$(($BUILD_NUMBER + N)) のように、すでにアップロード済みの数(N)を加算したビルド番号を指定するようにしてください。

f:id:HiroTanifuji:20210927103214p:plain

Distribution

Android code signing と Google Play の設定をします。

まずは、Android code signing です。

Enable Android code signing を有効にします。

Keystore* には普段使っているアップロード鍵をアップロードしてください。

Keystore password、Key alias、Key password は上でアップロードした鍵についての情報を入力してください。

f:id:HiroTanifuji:20210927104557p:plain

次に、Google Play についてです。

まずは、Enable Google Play publishing を選択してください。

Credentials(.json)* ですが、ご自身の Google Play Console で手続きをする必要があります。手順は以下の通りです。

  1. Google Play Console > 設定 > API アクセス から新しいプロジェクトを作成
  2. 作成されたプロジェクトを Google Cloud Platform で開く
  3. IAM と管理 > サービスアカウント からサービスアカウントを作成する
  4. 作成したサービスアカウントのロールとして Service Accounts > サービスアカウント ユーザー を設定する
  5. 作成したサービスアカウントの詳細ページ > キー > 鍵を追加 > 新しい鍵を作成 > JSON タイプ で秘密鍵の作成 & ダウンロード
  6. Google Play Console に戻って、サービスアカウントが追加されたことを確認する
  7. このアカウントにアプリ権限とアカウント権限を付与する
  8. Codemagic に戻って、ダウンロードした秘密鍵をアップロード

Track はご自身の環境に合わせて選択してください。

Production を選択すると自動で審査の提出まで行ってくれますが、リリースノートの記載ができないことがあるので、Beta を選択して、審査の提出は手動で行う iOS と近い運用にした方が無難だと思います。

その他の Update priority や Rollout fraction などはご自身の環境に合わせて設定してください。

f:id:HiroTanifuji:20210927130435p:plain

4. 通知の設定

Email と Slack の通知を設定できます。

好みの設定にしてください。

f:id:HiroTanifuji:20210926214646p:plain

5. ビルド実行

全ての設定が完了したら、ビルドを実行してみましょう。

Start new build から、ビルドしたいレポジトリのブランチと、ビルドの設定をしたワークフローを選択して実行します。

f:id:HiroTanifuji:20210927130115p:plain

以下のように NDK is not installed というエラーが出る場合は android/app/build.gradle に NDK のバージョンを指定するようなコードを追加してください。

// android/app/build.gradle

android {
    ...

    ndkVersion "22.1.7171670"

    ...
}

f:id:HiroTanifuji:20210927124540p:plain

これは、Codemagic で使用している VM にインストールされている NDK のバージョンと、Androidがデフォルトで使う NDK のバージョンが一致しないことが原因です。

Android がデフォルトで使う NDK のバージョンを VM にインストールされている NDK のバージョンに合わせてあげると解決するはずです。

VM にインストールされている NDK のバージョンはこちらから確認できます。

docs.codemagic.io

ビルドが成功すると、以下のような通知が届きます。

f:id:HiroTanifuji:20210927125833p:plain

f:id:HiroTanifuji:20210927125840p:plain

さいごに

Codemagic を使って Flutter アプリの CI/CDを構築するための設定方法について解説しました。

ご自身の環境によって変更しないといけない箇所があると思いますが、基本的な設定や詰まりそうな箇所の解説はできたかなと思います。

ご不明点やご指摘などがございましたら、コメントに書いてください。

以下、私が参考にさせていただいた記事になります。

medium.com

medium.com

blog.dalt.me

読んでいただきありがとうございました。