AndroidアプリのCIをGitHub Actionsに移行した話他

個人で作っているAndroidアプリのCIをBitriseからGitHub Actionsに乗り換えた話などをしていきます。

GitHub Actionsで使ってるyamlはこんな感じです。

name: Android CI

on: [pull_request]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8
    - name: Setup ruby
      uses: actions/setup-ruby@v1
      with:
        ruby-version: '2.6'
        architecture: 'x64'
    - name: Install danger
      run: |
        gem install bundler
        bundle install
    - name: Build with Gradle
      run: ./gradlew assembleDebug
    - name: Check lint
      if: always()
      run: ./gradlew ktlintCheck
    - name: Run test
      if: always()
      run: ./gradlew testDebugUnitTest
    - name: Run Danger
      if: always()
      env:
        DANGER_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: bundle exec danger

単純に諸々の準備をした後でアプリのビルド、lint、ユニットテストを行い、lintとテスト結果をDangerでコメントさせています。
if: always()を使うと前のステップで失敗していても当該ステップを実行できます。

ちなみにDangerFileはこんな感じです*1

warn("このPRはWIPです") if github.pr_title.include? "[WIP]"

ktlint_report_dir = "**/ktlintMainCheck.xml"
Dir[ktlint_report_dir].each do |file_name|
  checkstyle_format.base_path = Dir.pwd
  checkstyle_format.report file_name
end
ktlint_test_report_dir = "**/ktlintTestCheck.xml"
Dir[ktlint_report_dir].each do |file_name|
  checkstyle_format.base_path = Dir.pwd
  checkstyle_format.report file_name
end

junit_output_dir = "**/test-results/**/*.xml"
Dir[junit_output_dir].each do |file_name|
  junit.parse(file_name)
  junit.show_skipped_tests = true
  junit.report
end

マルチモジュールなのでテスト結果やlintの結果が複数出てくるのでえいやしています*2
マルチモジュールでDangerをいい感じにするのはインターンでお世話になったしせうがエレガントに解決してる記事があるのでこちらも参照されたし。

閑話休題yamlシンタックスについては僕が何か説明するより公式(GitHub Actionsのワークフロー構文 - GitHub ヘルプ)が整っているのでそちらをご覧いただければと思います。

jobsをいい感じに使えてなかったりうむぅな箇所もありますが、こんな感じでGitHub Actionsライフを送っております。

Bitriseから移行した理由やいいとこなど

新しいから試してみたかったというのも大きな理由ではありますが、テストを走らせるようになってからBitriseの無料枠で使える10分ではビルドが終わらなくなってしまっていたのが最大の理由です。

Circle CIとGitHub Actionsは無料で使うには月ごとのビルド時間に制限があるのですが、Circle CIは1000分でGitHub Actionsは2000分(パブリックリポジトリなら無制限)なのでなんかお得感があります*3
また、並列で行えるジョブについてもCircle CIが無料だと1つのみなのに対してGitHub Actionsは料金プランに関わらず(っぽい)20までと、お金を払いたくない人にとってはGitHub Actionsは結構いいのではと感じています *4

*1:参考 Kotlin+DangerをGithub Actionsで動かす - Qiita

*2:参考 Danger on Android :: iamjonfry — iamjonfry

*3:追記: Circle CIの方が早いらしいです。参考 GitHub ActionでAndroidのCIを設定してみた - phicdy devlog

*4:僕Circle CI使ったことないのでアレなんですけどね