Android 앱을 GitHubActions로 빌드하고 단위 테스트하고 FirebaseTestLab에서 UI 테스트 실행

우선 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 브랜치에 푸시되었을 때"라는 조건을 지정합니다.
다만 '**.md' 의 push 는 제외하고 있습니다.
jobs:
  build:
    runs-on: ubuntu-20.04

    steps:

Workflow의 작업입니다.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로 설정합니다.

이쪽 사이트이 이미지와 함께 이해하기 쉽습니다
    - 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)?  

그런 다음 파일을 메인 브랜치로 푸시하면 GitHub Actions가 실행되고 Firebase의 Test Lab에서 테스트가 실행되는 것을 확인할 수 있습니다.

이상입니다.

참고
GitHub Docs-GitHub Actions
[GithubActions] Android 앱을 FirebaseTestLab에 연결하고 Robo 테스트를 실행하기 전의 단계
gcloud 참조-gcloud firebase test android run

좋은 웹페이지 즐겨찾기