🛺

Codemagicを使ったFlutterアプリのGoogle Play自動デプロイ

2024/05/28に公開

Codemagicを使ったFlutterアプリのGoogle Play自動デプロイ

導入

FlutterをCI/CDするためのツールとしてはGithub actionsを使う方法もありますが、Codemagicは、Flutterアプリのビルドとデプロイを自動化するために特化してるツールです。

https://codemagic.io/start/

さまざまなツールが用意されており、Github actionsより比較的簡単、高機能にCI/CDを実現することができます。

今回は、Codemagicを使ってFlutterアプリをGoogle Playに自動デプロイする方法を紹介します。今回は、yamlファイルを使った方法を紹介します。

iosのapp storeの自動デプロイはこちら

https://zenn.dev/yuki_2021/articles/9789cf9b2fe2ca

準備

必要なツール

  • Codemagicアカウント
  • Google Cloudアカウント
  • Google Play Consoleアカウント
  • Githubのリポジトリ
  • androidのアプリ署名に使うkeystoreファイル or jksファイル

実装

プロジェクトのセットアップ

まずは対象のGithubのリポジトリとCodemagicを紐づけましょう。今回は、特定のタグがプッシュされたときに自動デプロイをするように紐づけたいので、WebhooksもGithubに登録しておきます。

CodemagicでGithubのリポジトリから新しくプロジェクトを作るのは割愛します。

できたら、[Apps] > [Webhooks]の方に移動して、表示されてるURLを控えておきます。

次に、Githubの方へ移動します。[Setting] > [Webhooks]を開きます。

新しくこのリポジトリにプッシュがあった時などにCodemagicへ自動的に通知するように設定しておきます。Payload URLに先程のURLを入れておき、Content typeは「application/json」を選択します。送信するタイミングは「Send me everything.」を選択しておけば間違いありません。

androidアプリ署名に使う証明書をCodemagicに登録

https://docs.codemagic.io/yaml-code-signing/signing-android/

Codemagic管理画面での操作

androidアプリの署名に使うkeystoreファイルかjksファイルが必要です。そちらの作り方については割愛して、すでにあるものとします。

Codemagicを開き、左側のメニューから[Teams]を選択、そして編集したいアカウント名をクリックして開く。

開かれた画面の[codemagic.yaml settings]の[Code signing identities]を開きます。その中から、[Android keystores]のタブを開きます。

そうすると次の画面になるのでそれぞれの項目に適切な情報を入力します。

  • Keystore password
  • Key alias
  • Key alias password
  • Reference name (後ほど、yamlファイルでこの設定を指定するための変数名。今回はkeystore_referenceとしておく)

android/app/build.gradleの編集

アップロードしようとしてるアプリの中の[android/app/build.gradle]を次のように編集します。

...
  android {
      ...
      defaultConfig { ... }
      signingConfigs {
          release {
              if (System.getenv()["CI"]) { // CI=true is exported by Codemagic
                  storeFile file(System.getenv()["CM_KEYSTORE_PATH"])
                  storePassword System.getenv()["CM_KEYSTORE_PASSWORD"]
                  keyAlias System.getenv()["CM_KEY_ALIAS"]
                  keyPassword System.getenv()["CM_KEY_PASSWORD"]
              } else {
                  keyAlias keystoreProperties['keyAlias']
                  keyPassword keystoreProperties['keyPassword']
                  storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
                  storePassword keystoreProperties['storePassword']
              }
          }
      }
      buildTypes {
          release {
              ...
              signingConfig signingConfigs.release
          }
      }
  }
  ...

Google Play Android Developer APIを有効にして、Google Play Consoleでアップロードするユーザにリリースを行う権限を付与

https://docs.codemagic.io/yaml-publishing/google-play/

Google Cloudでの作業

  1. Google Cloudにて対象のアプリの[IAMと管理]を開きます。
  2. 右側のタブで[サービスアカウント]をクリック。上側のメニューで[サービスアカウントを作成]をクリック。
  3. 名前と説明は順当に追加。このユーザのロールは「サービスアカウントユーザー」にしておきます。

  1. 登録すると、一覧に戻る。そのユーザのメールアドレスが発行されるので、それは後ほど使うので控える。
  2. 該当のユーザの右端にある[鍵を管理]をクリック
  3. [鍵を追加] > [新しい鍵を作成] そしてJSONをクリックして鍵を作成。JSONファイルがダウンロードされるので、先ほどのメールアドレスとともに安全なところに保管。

Google Play Consoleでの作業

  1. Google Play Consoleにて[ユーザと権限]を開きます。
  2. [新しいユーザを招待]をクリックします。先ほどGoogle Cloudで作成したメールアドレスを入力します。
  3. アカウントの権限については下記参照。(正直よくわかりません)

  1. これで[ユーザを招待]でOK。

Codemagicでの作業

  1. Codemagicを開いて、[Apps]の該当アプリの設定画面を開きます。
  2. [Environment variables]のタブを開きます。
  3. [variable name]には適当な変数名。(ex. GCLOUD_SERVICE_ACCOUNT_CREDENTIALS)[variable value]にはGoogle Cloudで作成したJSONファイルの中身を全部コピペします。
  4. [select group]ではgoogle_credentialsと新しくグループを作成して完了。

Codemagicのyamlを記述

  1. ビルドトリガーの設定(GitHubのプッシュやプルリクエストなど)。
  2. ビルドスクリプトの作成。
workflows:
  android-push-store:
    environment:
      flutter: fvm # fvmを使用する
      # androidの署名用の環境変数
      android_signing:
        - keystore_reference
      # 環境変数の設定
      groups:
        - google_credentials

    # トリガーの設定: GitHubのpushイベント時に自動でビルドを開始 android-push*のタグのみ
    triggering:
      events:
        - tag
      tag_patterns:
        - pattern: android-push*
          include: true
      cancel_previous_builds: true # 既存のビルドをキャンセル

    # キャッシュ設定: ビルドの高速化
    cache:
      cache_paths:
        - ~/.pub-cache
        - .dart_tool
        - .packages
        - .flutter-plugins
        - .flutter-plugin-dependencies

    # flutterのビルド
    scripts:
      - name: flutter clean
        script: flutter clean
      - name: Install dependencies
        script: flutter pub get
      - name: Build runner
        script: flutter pub run build_runner build --delete-conflicting-outputs
      - name: Build AAB
        script: flutter build appbundle --release
    
    # アップロードするファイルを指定
    artifacts:
      - build/**/outputs/**/*.aab
      - build/**/outputs/**/mapping.txt
      - flutter_drive.log

    # AndroidのAABファイルのアップロード
    publishing:
      # ビルドの結果をemailで通知
      email:
        recipients:
          - test@sample.com
        notify:
          success: true
          failure: true
      # Google Playに内部テストでアップロード
      google_play: 
        credentials: $GCLOUD_SERVICE_ACCOUNT_CREDENTIALS
        track: internal
        submit_as_draft: true

テストとデプロイ

テストの実行

Codemagicのビルドログを確認し、エラーがないかチェックします。

まとめ

Codemagicを使うことで、Flutterアプリのビルドとデプロイを自動化することができました。これにより、手動でのデプロイ作業を省略し、開発の効率を大幅に向上させることができます。

Discussion