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でのアプリ開発経験がない方はぜひチェックしてみてください。