この記事は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
ネタの記事です。