見出し画像

Github Actionsを使ってBaseline Profilesを作成してPull Requestを作成する

こんにちは!Masatoです。
今回の記事ではGithub Actionsを使ってベースラインプロファイルを作成して、プルリクエストを出すワークフローを紹介したいと思います。

参考にした記事

前提条件
・ベースラインプロファイルをローカルで作成できる状態

ManagedDeviceの設定

CI上でベースラインプロファイルを作成するには、仮想デバイスでBaselineProfileGeneratorのテストを実行できるようにする必要があるので、以下のようにbenchmarkモジュールのbuild.gradleのandroidブロックの中に設定を追加します。

experimentalProperties["android.experimental.self-instrumenting"] = true

    testOptions {
        managedDevices {
            devices {
                pixel6Api31(ManagedVirtualDevice) {
                    device = "Pixel 6"
                    apiLevel = 31
                    systemImageSource = "aosp"
                }
            }
        }
    }

この設定を追加すると、コマンドからAPIレベル13のPixel6の仮想デバイスでベースラインプロファイルを作成できるようになります。

ちなみにコマンドは以下のようになります。

gradle :benchmark:pixel6Api31BenchmarkAndroidTest

これをローカルで実行すると、benchmark/build/outputs/managed_devide_android_test_aditional_output/pixel6Api31のフォルダの中に、BaselineProfilesGenerator_startup-baseline-prop.txtという名前でベースラインプロファイルが作成されます。(ファイル名は[テストのクラスメイ]-[テスト名]-prop.txtになるので、環境によって異なります。)

以上でコマンド上からベースラインプロファイルを作成できるようになったので、Github Actionsのワークフローの方を作っていきます。

ワークフローの設定

.github/workflowsの中に、generate_baseline_profiles.ymlという名前のファイルを追加してください。この中に以下のコードを追加すると、featureという文字から始まるブランチをpushするたびにベースラインプロファイルを作成したプルリクエストが作成されるようになります。要点の説明はコードの下にあります。

name: baseline-profiles

on:
  push:
    branches:
      - feature**

jobs:

  generate-baseline-profiles:

    runs-on: macos-latest

    steps:

      - uses: actions/checkout@v3

      - uses: actions/setup-java@v3
        with:
          distribution: temurin
          java-version: 11

      - name: Setup Gradle
        uses: gradle/gradle-build-action@v2

      - name: Grant Permissions to gradlew
        run: chmod +x gradlew

      - name: Clean Managed Devices
        run: ./gradlew cleanManagedDevices --unused-only

      - name: Generate Baseline Profile
        run: ./gradlew :benchmark:pixel6Api31BenchmarkAndroidTest -Pandroid.testoptions.manageddevices.emulator.gpu="swiftshader_indirect" -Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile -Dorg.gradle.workers.max=4

      - name: Move & Rename Baseline Profiles
        run: |
          mv -f benchmark/build/outputs/managed_device_android_test_additional_output/pixel6Api31/BaselineProfileGenerator_startup-baseline-prof.txt app/src/main/baseline-prof.txt

      # Create pull request for adding baseline profiles
      - name: Commit Baseline Profiles and create pull request
        env:
          TZ: 'Asia/Tokyo'
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          OWNER: ${{ github.repository_owner }}
          REPO: ${{ github.event.repository.name }}
        run: |
          DATE=`date +"%Y%m%d%H%M"`
          BRANCH_NAME="baseline_profiles/$DATE"
          git checkout -b "$BRANCH_NAME"
          
          git add app/src/main/baseline-prof.txt
          git commit --allow-empty -m "Generate baseline profiles"
          git push --set-upstream origin "$BRANCH_NAME"
          
          gh pr create -B develop/phase2 -t "Generate Baseline Profiles $DATE" -b ''

要点の説明

on:
  push:
    branches:
      - feature**

この部分では、featureから始まるブランチにpushがあるたびに、このファイルで設定しているワークフローが走るように設定しています。
デバッグ用にpushのたびにワークフローが走るように設定していますが、やや現実的ではないので、マイルストーンが作られたときや、masterにpushがあった時などに変更してください。

- name: Generate Baseline Profile
  run: ./gradlew :benchmark:pixel6Api31BenchmarkAndroidTest -Pandroid.testoptions.manageddevices.emulator.gpu="swiftshader_indirect" -Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile -Dorg.gradle.workers.max=4

この部分では、ベースラインプロファイルを作成するために、テストを走らせています。オプションは参考にした記事から貼り付けただけなので意味はわかっていないですが、なくても動くかと思います。

- name: Move & Rename Baseline Profiles
  run: |
    mv -f benchmark/build/outputs/managed_device_android_test_additional_output/pixel6Api31/BaselineProfileGenerator_startup-baseline-prof.txt app/src/main/baseline-prof.txt

生成されたベースラインプロファイルをappモジュールのManifestと同じ場所にbaseline-prof.txtにリネームして移動しています。

# Create pull request for adding baseline profiles
- name: Commit Baseline Profiles and create pull request
  env:
    TZ: 'Asia/Tokyo'
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    OWNER: ${{ github.repository_owner }}
    REPO: ${{ github.event.repository.name }}
  run: |
    DATE=`date +"%Y%m%d%H%M"`
    BRANCH_NAME="baseline_profiles/$DATE"
    git checkout -b "$BRANCH_NAME"
    
    git add app/src/main/baseline-prof.txt
    git commit --allow-empty -m "Generate baseline profiles"
    git push --set-upstream origin "$BRANCH_NAME"
    
    gh pr create -B develop/phase2 -t "Generate Baseline Profiles $DATE" -b ''

ここでベースラインプロファイルを追加するPull Requestを作成しています。
envのところで、pull requestを作成するのに必要な環境を設定していて、Token, Owner, Repositoryを設定しています。この部分は基本的にコピペしていただければ動きます。

run 部分では、
まず、DATE(datetimeの方が適切かも)にタイムスタンプ代入して、それを使ってbranchを作成しています。
そして、ひとつ前のステップでのbaseline-prof.txtの追加をコミットしています。
最後に、github cliのprコマンドを使用して、「Genarate Baseline Profiles タイムスタンプ」という名前のPull Requestを作成しています。

以上でベースラインプロファイルを作成して、プルリクエストを作成するGithub Actionsのワークフローの作成は完了です。

作ってみた感想

私自身、普段はAndroidアプリ開発中心でCIをいじることはほとんどないのですが、こうして触ってみると勝手にPull requestが作成されるのを眺めるのはとっても楽しい体験でした。
Github Actionsには詳しくないので、おそらくもっと改善の余地はあるかと思うのですが、この記事が皆さんの参考になっていたら幸いです。

Udemyコースの宣伝

Jetpack Composeを使ってのアプリ開発の方法をUdemyで教えていますので、Androidアプリの開発をこれから始めたい方、Androidアプリ開発の経験はあるけどJetpack Composeでのアプリ開発経験がない方はぜひチェックしてみてください。


この記事が気に入ったらサポートをしてみませんか?