Firebase Test Labでのテストの設定をCircleCI Orbsとして公開する

# 概要

先週[DeployGateでのAPK配布設定をCircleCI Orbsとして公開する](https://qiita.com/Horie1024/items/ccc3e6bfd6e1c1053942)という記事を書いたのですが、Orbsが面白いのでAndroidアドベントカレンダーもOrbsネタで書こうと思います。

CircleCIで[Firebase Test Lab](https://firebase.google.com/docs/test-lab)でのテストを実行するための設定は[Testing With Firebase Test Lab](https://circleci.com/docs/2.0/language-android/#testing-with-firebase-test-lab)という形で公式ドキュメントにまとめられていますが、より簡単に設定ができた方が便利です。

今回、CircleCI Orbsとして設定を公開することでFirebase Test Labの設定を簡単にできないか試してみました。

# Orbとは？

`.circleci/config.yml`での設定内容をパッケージとしてまとめ、再利用可能な形で公開できる機能です。CircleCI 2.1 configuration(2018/12/7時点でプレビュー)で追加されました。Orbの詳細は[公式ドキュメント](https://circleci.com/docs/2.0/orb-intro/#section=configuration)をご覧ください。

OrbとしてFirebase Test Lab向けの設定内容をまとめ公開することで、Firebase Test Labによるテストを含むWorkflowをより素早く構築することが可能になるはずです。

# 公開したOrb

Orb registryのページはこちらです。
https://circleci.com/orbs/registry/orb/horie1024/firebase-test-lab

また、ソースコードはこちらになります。
https://github.com/horie1024/orb_firebaae_test_lab

# 使い方

## Enable build processingを有効化

CircleCI 2.1 configurationは2018/12/7時点でプレビューであるので、プロジェクトのSettings->Advanced SettingsでEnable build processingを`On`にします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/43438/f0011bc5-d0e3-2b92-a54b-21e456aafcef.png)

## Orbのimport

`.circleci/config.yml`に次の設定を追加しOrbをimportします。versionは`2.1`を指定してください。

```yaml
version: 2.1

orbs:
  firebase: horie1024/firebase-test-lab@volatile
```

## コマンドの実行

`firebase/test`コマンドでFirebase Test Labでのテストを開始します。

```yaml
firebase/test:
    service_account_key: SERVICE_ACCOUNT_KEY
    firebase_project_id: FIREBASE_PROJECT_ID
    type: instrumentation
    test_settings: test_settings.yml:instrumentation-test
```

`service_account_key`には、GCP Projectのサービスアカウントキー[^1]をbase64エンコードした値を格納した環境変数を指定します。また、`firebase_project_id`にはFirebaseプロジェクトのIDを、`type`には、`instrumentation`もしくは`robo`を指定します。

[^1]: サービスアカウントの作成や環境変数への格納については[こちらの記事](https://qiita.com/Horie1024/items/3c22b67634deb0dd4645#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E3%82%AD%E3%83%BC%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89)でまとめています。

`test_settings`には、次のようなymlを指定することでテストを実行するデバイスを指定できます。

```yaml
instrumentation-test:
  device:
    - model: Nexus5
      version: 21
      locale: ja_JP
      orientation: portrait
    - model: mata
      version: 25
      locale: ja_JP
      orientation: portrait
```

その他パラメーターの詳細はOrbのドキュメントをご覧ください。

https://circleci.com/orbs/registry/orb/horie1024/firebase-test-lab#commands-test

最終的なconfig.ymlは次の通りです。

```yaml
version: 2.1

orbs:
  firebase: horie1024/firebase-test-lab@volatile

jobs:
  build:
    docker:
      - image: circleci/android:api-28-alpha
    steps:
      - checkout
      - run:
          name: Download Dependencies
          command: ./gradlew androidDependencies
      - run:
          name: Build debug APK and release APK
          command: |
              ./gradlew :app:assembleDebug
              ./gradlew :app:assembleDebugAndroidTest
      - firebase/test:
          service_account_key: SERVICE_ACCOUNT_KEY
          firebase_project_id: FIREBASE_PROJECT_ID
          type: instrumentation
          test_settings: test_settings.yml:instrumentation-test
```

# Androidプロジェクトでの使用例

実際に今回公開したOrbを使用してFirebase Test Labでのテストを実行してみました。サンプルプロジェクトは[こちら](https://github.com/horie1024/orb_firebaae_test_lab_android_sample)です。

## テスト結果の確認

テスト結果はArtifactsタブから確認でき、テスト実行中のスクリーンの様子も簡単に確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/43438/a67ab3e9-c31d-28ac-4b16-21c4c21870ea.png)

# まとめ

設定をOrbとして公開することでCircleCIからより簡単にFirebase Test Labでのテストを実行できるようになったと思います。

今回公開したOrbに足りない機能や不具合がありましたらPull Requestをよろしくお願いします🙏

https://github.com/horie1024/orb_firebaae_test_lab