やること
GitHub
のREADME
に以下のようなカバレッジ表示を出します。
プロジェクト構成
今回は自作のOSS
、KRowMapper
のリポジトリで作業をしました。
このプロジェクトは以下のような構成となっています
-
Kotlin JVM
のGradle
プロジェクト-
build.gradle
はKotlin DSL
で記述 - テストフレームワークは
JUnit5
- カバレッジ計測には
Jacoco
を使用
-
-
CI
はCircleCI
で実行 - カバレッジの分析周りは
Codecov
を利用
コードはGitHub
に公開しています。
外部設定
まずプロジェクト外でカバレッジ計測の準備をします。
Codecovの設定
GitHub
等のアカウントを利用してCodecov
にログインし、計測対象にしたいリポジトリを選択します。
選ぶとtoken
が生成されます(スクショを撮り忘れたので生成した時の表示の画像が有りません、申し訳ありません)。
このtoken
は「Settings
-> Repository Upload Token
」から確認できます。
CircleCIの設定
次に、CircleCI
で「PROJECT SETTINGS
-> Environment Variables
-> Add Variable
」から環境変数を追加します。
Name
はCODECOV_TOKEN
で、先ほど生成したCodecov
のtoken
を入力します。
この時token
はダブルクォートで囲まずそのままで入力する必要が有ります(ダブルクォートで囲ってしまった場合カバレッジが上手く反映されません)。
Orb Security Settingsの設定
CircleCI
でCodecov
のOrb
を利用する場合、Organization Settings
からOrb Security Settings
でYes
を指定する必要が有ります。
この設定はOrganization
等の単位で設定するため、これまでに何も触っていない場合は設定が必要です。
この設定無しで実行した場合、To use this orb, an organization admin must opt-in to using third party orbs in Organization Security settings.
となって失敗します。
内部設定
続いてリポジトリ内での設定をします。
Jacocoによるレポートの出力設定
build.gradle
にJacoco
によるレポート出力を追記していきます。
まずplugins
にjacoco
を追加します。
/* 略 */
plugins {
/* 略 */
id("jacoco")
}
/* 略 */
続いてtasks
にjacocoTestReport
を追加します。
この設定はこちらの記事を参考にしています。
/* 略 */
tasks {
/* 略 */
test {
useJUnitPlatform()
}
jacocoTestReport {
reports {
xml.isEnabled = true
csv.isEnabled = false
html.isEnabled = true
}
}
}
最後に、自分はテスト実行後に自動でカバレッジのレポートを生成する設定を行いました。
tasks {
/* 略 */
test {
useJUnitPlatform()
// テスト終了時にjacocoのレポートを生成する
finalizedBy(jacocoTestReport)
}
jacocoTestReport {
reports {
xml.isEnabled = true
csv.isEnabled = false
html.isEnabled = true
}
}
}
最終的にbuild.gradle.kts
は以下のようになりました(実際に利用している内容なため、今回の設定に対しては余計な内容が多く含まれています)。
`build.gradle.kts`
plugins {
id("maven")
id("java")
id("org.jetbrains.kotlin.jvm") version "1.3.72"
id("org.jlleitschuh.gradle.ktlint") version "9.2.1"
id("jacoco")
}
group = "com.mapk"
version = "0.14"
java {
sourceCompatibility = JavaVersion.VERSION_1_8
}
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath(kotlin("gradle-plugin"))
}
}
repositories {
mavenCentral()
maven { setUrl("https://jitpack.io") }
}
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation(kotlin("reflect"))
api("com.github.ProjectMapK:Shared:0.16")
// 使うのはRowMapperのみなため他はexclude、またバージョンそのものは使う相手に合わせるためcompileOnly
compileOnly(group = "org.springframework", name = "spring-jdbc", version = "5.2.4.RELEASE") {
exclude(module = "spring-beans")
exclude(module = "spring-jcl")
exclude(module = "spring-tx")
}
// https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter
testImplementation(group = "org.junit.jupiter", name = "junit-jupiter", version = "5.6.2") {
exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
}
// https://mvnrepository.com/artifact/io.mockk/mockk
testImplementation("io.mockk:mockk:1.10.0")
// テスト時には無いと困るため、別口でimplementation
testImplementation(group = "org.springframework", name = "spring-jdbc", version = "5.2.4.RELEASE")
// https://mvnrepository.com/artifact/com.h2database/h2
testImplementation(group = "com.h2database", name = "h2", version = "1.4.200")
// 現状プロパティ名の変換はテストでしか使っていないのでtestImplementation
// https://mvnrepository.com/artifact/com.google.guava/guava
testImplementation(group = "com.google.guava", name = "guava", version = "28.2-jre")
}
tasks {
compileKotlin {
dependsOn("ktlintFormat")
kotlinOptions {
jvmTarget = "1.8"
allWarningsAsErrors = true
}
}
compileTestKotlin {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "1.8"
}
}
test {
useJUnitPlatform()
// テスト終了時にjacocoのレポートを生成する
finalizedBy(jacocoTestReport)
}
jacocoTestReport {
reports {
xml.isEnabled = true
csv.isEnabled = false
html.isEnabled = true
}
}
}
.circleci/config.ymlにCodecov関連を設定する
まずクイックスタートを参考にCodecov
のOrb
を追加します。
自分のプロジェクトではconfig
のバージョンが2.0
だったため、これを機に2.1
に上げました。
version: 2.1
orbs:
codecov: codecov/codecov@1.0.5
# 略
続いて、CI
の最後にCodecov
にカバレッジ関連ファイルを上げる設定を追加します。
# 先ほど設定した部分
version: 2.1
orbs:
codecov: codecov/codecov@1.0.5
# 略
jobs:
build:
# 略
steps:
# 略
# run tests!
- run: gradle test
# ↓2行を追加
# upload coverages to codecov
- run: bash <(curl -s https://codecov.io/bash)
最終的に.circleci/config.yml
は以下のようになりました。
内容はほぼLanguage Guide: Javaのコピペです。
`.circleci/config.yml`
# Java Gradle CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-java/ for more details
#
version: 2.1
orbs:
codecov: codecov/codecov@1.0.5
jobs:
build:
docker:
# specify the version you desire here
- image: circleci/openjdk:8-jdk
# Specify service dependencies here if necessary
# CircleCI maintains a library of pre-built images
# documented at https://circleci.com/docs/2.0/circleci-images/
# - image: circleci/postgres:9.4
working_directory: ~/repo
environment:
# Customize the JVM maximum heap limit
JVM_OPTS: -Xmx3200m
TERM: dumb
steps:
- checkout
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "build.gradle.kts" }}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run: gradle dependencies
- save_cache:
paths:
- ~/.gradle
key: v1-dependencies-{{ checksum "build.gradle.kts" }}
# run lints!
- run: gradle ktlintCheck
# run tests!
- run: gradle test
# upload coverages to codecov
- run: bash <(curl -s https://codecov.io/bash)
GitHubで動作を確認する
最後に、これまでの設定からGitHub
での動作を確認します。
Pull Requestを作成する
PR
を出した際にCI
を回す設定になっていれば、以下のようにCodecov Report
が届きます。
実際にCodecov Report
が届いているPRです。
READMEにバッジを貼る
Codecov
の「Settings
-> Badge
」から各フォーマットでのバッジが確認できます。
これをREADME
に貼ることで、以下のようなカバレッジ表示を出せます。