🔥

Androidアプリをcodemagic.yamlでFirebase App Distributionにデプロイする

2023/09/20に公開

はじめに

  • Codemagicのymlファイルを使ってAndroidアプリをFirebase App DistributionにPublishできるまでを書き留めたメモになります
  • 大まかな流れ
    • 事前準備
    • Codemagic上でビルド確認やトリガー設定
    • サービスアカウントによる認証を元にPublish

参考記事

Android用継続的インテグレーション&デリバリー(CI/CD) | Codemagic Blog

↑こちらの記事を参考に進めていきたいと思います。
また、事前にCodemagicのAppに対象のAndroidプロジェクトを追加している前提で進めていきます.

環境構築や準備

1. 事前準備

1-1. Firebase App Distribution にテスターとグループを設定する

image1.png

今回は「テスターとグループ」で「Developer」というグループを作成し、新規リリースがあれば通知されるようにしたいと思います。

※ 初めての場合は「 開始」をクリックすると↑の画面表示されるはずです。

1-2. buildTypesproductFlavors

今回デプロイを行う buildTypesproductFlavors 構成は以下を想定してます。

// app/build.gradle.kts
android {
    // ...
    flavorDimensions += "default"
    productFlavors {
        create("dev") {
            signingConfig = signingConfigs.getByName("dev") // signingConfig指定済み
            isDefault = true
            applicationIdSuffix = ".dev"
            dimension = "default"
        }
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
}

CIビルド

1. テストとビルドを行うシンプルなワークフロー

まずはシンプルなワークフローを作成します。以下内容で codemagic.yaml をプロジェクト直下に作成します。

workflows:
  build-dev-android-workflow:
    name: Build Dev Android Workflow
    max_build_duration: 60
    instance_type: mac_mini_m1
    environment:
      groups:
        - setup # JAVA_HOMEの変更など必要があれば(詳細はトラブルシューティング参照)
    scripts:
      - name: Run tests
        script: ./gradlew test
      - name: Build devRelease
        script: ./gradlew assembleDevRelease
    artifacts:
      - app/build/outputs/apk/**/*.apk

コミットしたら早速pushします。

1-1. 手動でビルド

PushしたらCodemagicのダッシュボードを確認すると対象のプロジェクトで、「Start your first build」ができるようになっているかと思います。

image2.png

赤枠を必要に応じて設定し、「Start new build」でビルドを開始します。

image3.png

ビルドが成功すればOKです!

1-2. 特定のbranchにpushされたらビルドされる様にする

https://docs.codemagic.io/yaml-running-builds/starting-builds-automatically/

↑を参考に以下を追加します。この場合だと develop ブランチにpushされたらビルドが走るようになります。


triggering:
  events:
    - push
  branch_patterns:
    - pattern: "develop"
      include: true
      source: true

Firebase App DistributionへPublish

サービスアカウントによる認証

Firebaseのダッシュボードから歯車アイコン > サービスアカウント > N個のサービスアカウント をクリックします。

image4.png

GCPの画面が開いたら左メニューの「サービスアカウント」を選択し、上部メニューの「サービスアカウントを作成」 からサービスアカウントの詳細を入力し、「作成して続行」をクリックします。

image5.png

次に「ロールを選択」で「Firebase App Distribution Admin SDK サービスエージェント」を選択します。

image6.png

最後は何も入力せず「完了」をクリックします。

image7.png

次に作成したサービスアカウントのメニューから「鍵を管理」をクリックします。

image8.png

「鍵を追加」>「新しい鍵を作成」からキーのタイプ「JSON」で「作成」をクリックします。ダウンロードされたJSONファイルはこの後使うので適切な場所で管理します。

image9.png

Codemagicの環境変数設定

先ほどダウンロードしたJSONファイルをクリップボードにコピーします。

cat xxxxxxxxx.json | pbcopy

Codemagicの対象のアプリの設定「Environment variables」タブで新規に FIREBASE_SERVICE_ACCOUNT という環境変数を追加します。

image10.png

値は先ほどクリップボードにコピーした内容を貼り付けます。

最後に codemagic.yaml に以下を追加しPushします。

publishing:
  firebase:
    firebase_service_account: $FIREBASE_SERVICE_ACCOUNT
    android:
      app_id: $ANDROID_APP_ID
      groups:
        - Developer

Firebase App Distribution で以下の様にアプリがリリースされていれば成功です!

image11.png

トラブルシューティング

Android Gradle plugin requires Java 17 to run. You are currently using Java 11. が発生する!

エラーの詳細

* What went wrong:
An exception occurred applying plugin request [id: 'com.android.application', version: '8.1.1']
> Failed to apply plugin 'com.android.internal.application'.
   > Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
      Your current JDK is located in /Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
      You can try some of the following options:
       - changing the IDE settings.
       - changing the JAVA_HOME environment variable.
       - changing `org.gradle.java.home` in `gradle.properties`.

解決方法

Java 17JAVA_HOME の場所がこちらに載っています。

image12.png

↑を参考にCodemagicの対象アプリの設定画面から「Environment variables」を選択し、以下を追加してやります。

Name: JAVA_HOME
Value: /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home
Variable group: setup (groupは必要に応じて変更して設定)

image13.png

Publishing時に以下エラーが発生する

Authenticating with `--token` is deprecated and will be removed in a future major version of `firebase-tools`. Instead, use a service account key with `GOOGLE_APPLICATION_CREDENTIALS`:

現在 firebase_token は使えないので firebase_service_account を使う必要がある。

この記事は以下の情報を参考にして執筆しました

Discussion