LoginSignup
0
0

More than 3 years have passed since last update.

Android アプリを GitHubActions でビルド、単体テストして FirebaseTestLab で UI テストを実行する

Last updated at Posted at 2020-12-25

まずは yml です。

以下内容で PROJECT_ROOT/.github/workflows/main.yml を作成してプッシュすれば GitHubActions の Workflows に追加されます。

main.yml
name: CI

on:
  push:
    branches: [main]
    paths-ignore:
      - '**.md'

jobs:
  build:
    runs-on: ubuntu-20.04

    steps:

    - name: Checkout
      uses: actions/checkout@v2

    - name: Set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8

    - name: Restore gradle cache
      uses: actions/cache@v2
      with:
        path: ~/.gradle/caches
        key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
        restore-keys: |
          ${{ runner.os }}-gradle-

    - name: Make gradle.properties
      run:
        KEYSTORE_PASSWORD=${{ secrets.KEYSTORE_PASSWORD }}
        echo -e "org.gradle.daemon=trueorg.gradle.daemon=true\norg.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError\norg.gradle.parallel=true\norg.gradle.configureondemand=true\nKEYSTORE_PASSWORD=$KEYSTORE_PASSWORD\nandroid.enableD8 = true\nandroid.enableJetifier=true\nandroid.useAndroidX=true" >> gradle.properties

    - name: Run Compile
      run: ./gradlew assembleDebug

    - name: Run unit tests
      run: ./gradlew testDebugUnitTest --stacktrace

    - name: Set up Cloud SDK
      uses: google-github-actions/setup-gcloud@master
      with:
        project_id: ${{ secrets.GCP_PROJECT_ID }}
        service_account_key: ${{ secrets.GCP_SA_KEY }}
        export_default_credentials: true

    - name: Assemble Android Instrumentation Tests
      run: ./gradlew assembleDebugAndroidTest

    - name: Set APP_VERSION
      id: app_version
      run: |
        VERSION=$(grep -Eo 'versionName ".*"' ./app/build.gradle | grep -Eo '[0-9]+.[0-9]+.[0-9]+')
        echo "::set-output name=version::$VERSION"

    - name: Run Instrumentation Tests in Firebase Test Lab
      run: |
        echo "y" |
        gcloud firebase test android run \
          --timeout 5m \
          --type instrumentation \
          --app app/build/outputs/apk/debug/app-${{ steps.app_version.outputs.version }}-debug.apk \
          --test app/build/outputs/apk/androidTest/debug/app-${{ steps.app_version.outputs.version }}-debug-androidTest.apk \
          --device model=Pixel2,version=28,locale=ja_JP,orientation=portrait

ひとつずつみていきます。

name: CI

この Workflow の名前です。

on:
  push:
    branches: [main]
    paths-ignore:
      - '**.md'

この Workflow が動く条件です。
main ブランチに push されたとき」という条件を指定しています。
ただし '**.md' の push は除外しています。

jobs:
  build:
    runs-on: ubuntu-20.04

    steps:

Workflow 内の Job です。
build という名前の Job で ubuntu-20.04 上で実行すると定義しています。
Job の中身は steps 内に記述していきます。

runs-on に指定できるラベルは GitHub Docs-GitHub Actions-jobs.<job_id>.runs-on を参照してください。

Linux、macOS、Windows で料金が変わってくるので注意してください。
詳しくは GitHub Docs-GitHub Actionsの支払いについて を参照してください。

    - name: Checkout
      uses: actions/checkout@v2

リポジトリをチェックアウトします。

    - name: Set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8

JDK をセットアップします。

    - name: Restore gradle cache
      uses: actions/cache@v2
      with:
        path: ~/.gradle/caches
        key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
        restore-keys: |
          ${{ runner.os }}-gradle-

Gradle の依存関係をキャッシュします。
詳しくは GitHub Docs-GitHub Actions-依存関係のキャッシング を参照してください。

    - name: Make gradle.properties
      run:
        KEYSTORE_PASSWORD=${{ secrets.KEYSTORE_PASSWORD }}
        echo -e "org.gradle.daemon=trueorg.gradle.daemon=true\norg.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError\norg.gradle.parallel=true\norg.gradle.configureondemand=true\nKEYSTORE_PASSWORD=$KEYSTORE_PASSWORD\nandroid.enableD8 = true\nandroid.enableJetifier=true\nandroid.useAndroidX=true" >> gradle.properties

今回のアプリではビルドするために gradle.properties が必要なのでここで作成しています。
ファイル内に秘匿情報も含まれているため、 GitHub の Secrets に設定して secrets.KEYSTORE_PASSWORD で参照しています。
詳しくは GitHub Docs-GitHub Actions-暗号化されたシークレット を参照してください。

    - name: Run Compile
      run: ./gradlew assembleDebug

デバッグ APK をビルドします。

    - name: Run unit tests
      run: ./gradlew testDebugUnitTest --stacktrace

単体テストを実行します。

    - name: Set up Cloud SDK
      uses: google-github-actions/setup-gcloud@master
      with:
        project_id: ${{ secrets.GCP_PROJECT_ID }}
        service_account_key: ${{ secrets.GCP_SA_KEY }}
        export_default_credentials: true

FirebaseTestLab と連携するために GCP のセットアップをおこないます。

project_id Firebase の プロジェクト ID です。
service_account_key GCP のサービスアカウントの鍵を base64化 した値です。

どちらも GitHub の Secrets に設定します。

コチラのサイトが画像付きでわかりやすかったです :pray:

    - name: Assemble Android Instrumentation Tests
      run: ./gradlew assembleDebugAndroidTest

UI テスト用の APK をビルドします。

    - name: Set APP_VERSION
      id: app_version
      run: |
        VERSION=$(grep -Eo 'versionName ".*"' ./app/build.gradle | grep -Eo '[0-9]+.[0-9]+.[0-9]+')
        echo "::set-output name=version::$VERSION"

今回のアプリでは APK のファイル名にバージョン名が含まれるため build.gradle ファイルの
versionName 1.0.01.0.0 だけを抽出し環境変数にセットしています。

    - name: Run Instrumentation Tests in Firebase Test Lab
      run: |
        echo "y" |
        gcloud firebase test android run \
          --timeout 5m \
          --type instrumentation \
          --app app/build/outputs/apk/debug/app-${{ steps.app_version.outputs.version }}-debug.apk \
          --test app/build/outputs/apk/androidTest/debug/app-${{ steps.app_version.outputs.version }}-debug-androidTest.apk \
          --device model=Pixel2,version=28,locale=ja_JP,orientation=portrait

FirebaseTestLab に APK をアップロードし UI テストを実行しています。
先ほど環境変数にセットした versionName は ${{ steps.app_version.outputs.version }} で参照しています。

gcloud firebase test android run のオプションは gcloud リファレンス-gcloud firebase test android run を参照してください。

echo "y" は 初めて実行するときに以下のような確認が入るため記述しています。
(2回目以降は不要そう)

API [toolresults.googleapis.com] not enabled on project.
Would you like to enable and retry (this will take a few minutes)? (y/N)?  

あとはファイルを main ブランチにプッシュすれば GitHub Actions が動いて Firebase の Test Lab 上でテストが動くことが確認できると思います。

以上です。

参考
GitHub Docs-GitHub Actions
[GithubActions] AndroidアプリをFirebaseTestLabに連携しRoboテストを実行するまでの手順
gcloud リファレンス-gcloud firebase test android run

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0