この記事はMicroAd (マイクロアド) Advent Calendar 2020 - Qiitaの2日目の記事です。
やること
GitHub ActionsでJava/Kotlin製ライブラリ(ビルドツールはgradle)のCI環境を構築します。
具体的には、以下2項目を行います。
-
PRを出した際にテストとlintを走らせる - カバレッジを計測する
サンプルプロジェクトの内容
サンプルコードには以下の加算コードとそのテストコードなどが含まれています。
package com.wrongwrong
fun myAdd(a: Double, b: Double) = a + b
コード全体は以下で公開しています。
テンプレートについて
ワークフローの基本的なテンプレートはhttps://github.com/${ユーザー}/${リポジトリ}/actions/newに公開されているため、基本的にこれをコピペする形で話を進めます。
PRを出した際にテストとlintを走らせる
テストとlintは./gradlewから呼び出す形で実行するのが簡単です。
テストを走らせる
まずテストを走らせてみます。
Java with Gradleテンプレートを参考に、${プロジェクトルート}/.github/workflows/ci.ymlを追加します。

内容に関しては、run: ./gradlew testでテストを呼び出していることが分かれば一旦大丈夫だと思います。
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Test with Gradle
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
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: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Test with Gradle
run: ./gradlew test
lintを走らせる
次にlintを走らせます。
lintはktlint gradle plugin(org.jlleitschuh.gradle.ktlint)を用いて行います。
plugins {
kotlin("jvm") version "1.4.10"
id("org.jlleitschuh.gradle.ktlint") version "9.4.1" // 追加
}
ワークフロー設定は、run: ./gradlew ktlintするだけで行えます。
今回はテストの前にlintを走らせる形としました。
run: chmod +x gradlew
# 下2行を追記
- name: ktlint check
run: ./gradlew ktlintCheck
- name: Test with Gradle
run: ./gradlew test
試しにlintが引っかかる状態で実行した結果が以下です。
ktlint checkが追加され、失敗しています。

バッジを表示する
テストやlintが出来たので、READMEにそのステータスバッジを出します。
バッジは当該ワークフローからCreate status budgeすれば取得できます。


2. カバレッジを計測する
続いてテストのカバレッジを計測します。
今回はJaCoCoで生成したカバレッジファイルをCodecovにアップロードする形でこれを行います。
JaCoCo関連の設定
まずJaCoCo関連の設定を追加します。
詳しい説明は以前書いた記事の中で説明したためここでは省略します。
/* 略 */
plugins {
/* 略 */
id("jacoco")
}
/* 略 */
tasks {
/* 略 */
jacocoTestReport {
reports {
xml.isEnabled = true
csv.isEnabled = false
html.isEnabled = true
}
}
test {
useJUnitPlatform()
// テスト終了時にjacocoのレポートを生成する
finalizedBy(jacocoTestReport)
}
}
ローカルで./gradlew testした際に${プロジェクトルート}/build/reports/jacoco/にテストレポートが吐き出されていればJaCoCo関連の設定は完了です。
Codecovのセットアップ
Codecovのセットアップに関しても、以前書いた記事の中で詳しく説明したためここでは省略します。
Repository Upload Tokenが取得できれば完了です。
GitHub Actionsの設定
Repository Upload TokenをリポジトリのSecretsに追加
リポジトリのSettings -> Secrets -> New repository secretに先ほど生成したRepository Upload Tokenを設定します。

キーの名前は後述するワークフローの設定で参照できれば何でもよいと思いますが、今回はCODECOV_TOKENとします。

ワークフローの設定
以下4行を追加することでアップロードが行われるようになります。
run: chmod +x gradlew
- name: ktlint check
run: ./gradlew ktlintCheck
- name: Test with Gradle
run: ./gradlew test
# 下4行を追記
- name: upload coverage
uses: codecov/codecov-action@v1
with:
token: ${{ secrets.CODECOV_TOKEN }}
この状態でPRを作成することで、codecov関係が動くようになりました。

テスト無しで関数を1つ追加した様子が以下です。
カバレッジが落ちていることが確認できます。

終わりに
GitHub ActionsでJava/Kotlin製ライブラリ(ビルドツールはgradle)のCI環境を構築してみました。
感想としては「連携等で必要な操作も最低限で超簡単だしマジぱねえ」という感じです。
個人開発に関してはCircle CIからの乗り換えを決断しました。
仕事で使っているGitHub Enterpriseについては記事執筆時点(11/24)でActionsがまだ来ていませんが、2020中に来る来るという話なので、今から楽しみにしています。
明日は@yassan168によるHadoopネタの記事です。

