[GithubActions] AndroidアプリをFirebaseTestLabに連携しRoboテストを実行するまでの手順

2020.05.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

FirebaseTestLabをGithubActionに組み込み、AndroidアプリのRoboテストを実行するまでの手順をまとめました。 どちらも使用するのが初めてなので、それぞれ単体で実行してみた後に連携させてみようと思います。 今回使用したプロジェクトはこちら

FirebaseTestLabを試してみる

FirebaseTestLabでのAndroidアプリのRoboテストを実行してみます。

  1. Firebase上にプロジェクトを作成する コンソールから「プロジェクトを追加」を選択し、説明に沿って作成します。(私は基本的にAndroidStudioの[Tools]->[Firebase]から作成してます)

  2. apkファイルをアップロード

デフォルトのRoboテストを実行する手順はこれだけです。 スクショや動画、パフォーマンスを含めたテスト結果を表示してくれます。

Github ActionsでCI環境を構築してみる

  1. Github内の[Actions]という項目から、Android CIを選択
  2. デフォルトで[Android.yaml]が作成されるのでコミット
    下のファイルが作成されます。 masterブランチに対するコミット or PRでCIが走りジョブが実行されるように記述されています。(構文についてはこちらが大変参考になりました。)

        name: Android CI
        
        on:
        push:
        branches: [ master ]
        pull_request:
        branches: [ master ]
        
        jobs:
        build:
        
        runs-on: ubuntu-latest
        
        steps:
        - uses: actions/checkout@v2
        - name: set up JDK 1.8
        uses: actions/setup-java@v1
        with:
        java-version: 1.8
        - name: Build with Gradle
        run: ./gradlew build

  3. コミットをトリガーにCIが実行される。 緑になったらビルド成功です。

FirebaseTestLabに連携する

Firebaseとの連携の前にジョブをtest,build,firebase(後述)の三つに分割し順に実行されるように整理します。 またFirebaseTestLab向けにapkファイルを作成するbuildジョブを追記しています。 今回はデフォルトで作成されるテストしかありませんが、はじめにプロジェクトのUnitテストを実行する修正も追加しています。

jobs:
  test:
    name: Unit Tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Run Unit tests
        run: bash ./gradlew test --stacktrace
        
  build:
    name: Build Apk
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Build with Gradle
        run: bash ./gradlew assembleDebug --stacktrace
    
      - name: Upload app APK
        uses: actions/upload-artifact@v1
        with:
          name: app-debug
          path: app/build/outputs/apk/debug/app-debug.apk

 firebase:
    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

buildジョブが成功した段階でapkファイルが作成される様になりました。

ここからFirebaseTestLab用のジョブを追記していきますが、その前にいくつか事前準備が必要です。

事前準備

事前準備としてGithubのSecretにGCPのアカウントキー、FirebaseのプロジェクトIDを設定します。

  1. Firebaseプロジェクトの設定画面 → 「サービス アカウント権限の管理」を選択
  2. 「firebase-adminsdk」の操作 → 「鍵を作成」を選択 json形式でDL
  3. jsonファイルからbase64化した値を取得
        cat {ダウンロードしたファイル名} | base64
  4. [GitHub] Secretに取得した値を登録
  5. [GitHub] SecretにProjectID*を登録

    *Firebaseプロジェクトの設定画面 → 「全般」 から確認できます。

[Android.yaml]に戻ります。

  firebase:
    name: Run Test on Firebase Test Lab
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Download APK
        uses: actions/download-artifact@v1
        with:
          name: app-debug

      - name: Login to Google Cloud
        uses: GoogleCloudPlatform/github-actions/setup-gcloud@master
        with:
          version: '290.0.1'
          service_account_key: ${{ secrets.FIREBASE_SERVICE_ACCOUNT }}
          project_id: ${{ secrets.FIREBASE_PROJECT_ID }}
          export_default_credentials: true
      - run: gcloud info

      - name: Run Test on Firebase Test Lab
        run: gcloud firebase test android run --type robo --app app-debug/app-debug.apk --device model=Pixel2,version=28,locale=ja,orientation=portrait

- name: Login to Google Cloud部分について
GoogleCloudにログインする為にGoogleCloudPlatform/github-actions/setup-gcloud@masterのプラグインを使用します。使い方はREADMEに詳しく記載されていますが、service_account_key/project_idがそれぞれ先ほどSecretに登録したキーを参照する様に記述します。

- Run Test on Firebase Test Lab部分について
GoogleCloudSDKのコマンドを実行しています。詳しいコマンド一覧は公式リファレンスに載っています。
今回はroboテストをPixel2/apiバージョン:28に対して実行します。

変更をプッシュしてみます。
ワークフローが成功し・・・

Roboテストが実行されていました。

終わりに

Masterブランチにプッシュorプルリクエストするだけで自動的にFirebaseTestLabのテスト実行する事ができるようになりました。 非常にお手軽かつある程度までは無料で使用できるので、スクショを楽に撮りたいな〜くらいの気持ちで導入して良いのではないかと思います。

それぞれまだまだ多くの機能がありそうなので、別の機会で掘り下げていければと思います。
以上です。ありがとうございました。

参考