はじめに
今回はGithub Actionsを使って自動テストをした話を紹介していきたいと思います。
自動テストのタイミング
PR出したタイミングとかPR出したブランチにpushしたタイミングでいいのでは?
と思う方もいるかもしれません。
Github Actionsはpublicなレポジトリだと無料ですが、Organizationで使うと従量課金制になっています。
テストの量が多い場合、push毎にCIを走らせてしまうととんでもない実行時間になってしまいます。
またPR出したタイミングで修正があることに気付き新しくpushした場合、その部分はグリーンになっている保証はありません。
なので今回はレビュワーがapproveしたタイミング(LGTMしたタイミング)で自動テストを回すようにしました。
PR出す→修正がある場合は新たにpush→レビュワーがapprove→テスト→成功でも失敗でもslackに通知
レビュー時にテストをする方法
自動テストのやり方などはググればたくさん出てくるんですが、approveされたらという条件が合致するものがなかったので苦労しました。
まずGithub Actionsのトリガーを見てみると、pull_request_reviewというのが出てきます。
これがレビューされた時のトリガーです。
今回筆者はアクティビティタイプをsubmittedだけにしました。
レビュワーがapproveしてくれたけど、コメントを編集した場合や、取り消しした場合に毎回走るのは嫌だったので追加したタイミングだけCIが走るようにしました。
次にプルリクエストをレビューした時のWebHookを見ていきます。
ここのpayloadを見ていくと、reviewの中にstateというのがあるのがわかります。
ここには
- commented
- approved
- change_requested(これ合ってるかわからない)
の3つの要素が入ってきます。
なのでこれがapprovedの時だけCIを走らせればいい感じですね。
一旦全体を見ていきましょう
name: UnitTest
on:
pull_request_review:
types: [ submitted ]
branches: [ master ]
jobs:
test:
if: github.event.review.state == 'approved'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: UnitTest
run: ./gradlew testDebugUnitTest
細かい解説
トリガー
on:
pull_request_review:
types: [ submitted ]
branches: [ develop ]
まずはトリガーから
レビューをした時に走らせたいのでpull_request_review
アクティビティタイプはsubmitted
ブランチは適当にmaster指定にしてますが、任意で設定してください
条件
jobs:
test:
if: github.event.review.state == 'approved'
runs-on: ubuntu-latest
次にテストを走らせる条件
jobsをスタートしてジョブ名はtest(ここも任意で)
ifに条件を書いていきます。
github.eventでそのトリガーに合ったWebHookのペイロードを取得できます。
今回は上記でも説明したようにreviewの中のstateを使いたかったのでgithub.event.review.state
ちなみに記法として2パターンあって
if: github.event.review.state == 'approve'
でも
if: ${{ github.event.event.review.state == 'approve' }}
でもOK
確かシングルクオーテーションじゃなきゃダメだったので気をつけてください
あとはいつも通り
steps:
- uses: actions/checkout@v2
- name: set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: UnitTest
run: ./gradlew testDebugUnitTest
Androidのビルド環境を作ってテストするだけ
テストコマンドは
./gradlew test{buildVariantName}UnitTest
です。
まとめ
以上がレビューでapproveもらった時だけ自動でテストを走らせる方法です。
次はテスト結果をslackに通知する方法でいいかな?