KotlinのコードをktlintでチェックしてDangerでGitHubのPRへ通知する

Kotlin

最近、仕事で初めてKotlinでサーバーサイドアプリケーションを書く機会がありました。
少しでも慣れたほうがいいかなと思って何かないかなと思っていたらちょうどZabbix Senderを使っていたのでKotlin版Zabbix Senderを作りました。

kt-zabbix-sender

Zabbix Senderの説明は端折りますが、Zabbix Serverに対してzabbix_senderコマンドを使ってメトリクスを登録できます。
いろんな言語のバインディングがあるので、今回はJava版を参考にしました。
https://www.zabbix.org/wiki/Docs/protocols/zabbix_sender/1.8/java_example

ktlint

Javaだとcheckstyleとかでソースコードのフォーマットをチェックできると思うのですが、Kotlinだとktlintでチェックできるみたいなのでやってみました。
Gradleで実行するようにしました。
build.gradleは以下のような感じになります(抜粋)。

buildscript {
    ext {
        kotlinVersion = '1.1.61'
        jacksonVersion = '2.9.3'
        ktlintGradleVersion = '3.0.0'
    }
    repositories {
        mavenCentral()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
        classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
        classpath("gradle.plugin.org.jlleitschuh.gradle:ktlint-gradle:${ktlintGradleVersion}")
    }
}

apply plugin: "org.jlleitschuh.gradle.ktlint"

repositories {
    mavenCentral()
    jcenter()
}

ktlint {
    version = "0.15.0"
    debug = true
    verbose = true
    android = false
    reporter = "checkstyle"
    ignoreFailures = true
}

これでktlintCheckというタスクが追加されるのでgradlew ktlintCheckを実行するか、ビルドしても実行されます。
設定によって異なりますが、結果はbuild/reports/ktlint以下に出力されます。

GitHubのPRに通知する

チェックするだけではあんまり意味がなく、よりわかりやすく通知するためにGitHubに通知します。
通知にはDangerを使いCIはCircleCIを使いました。
Dangerファイルは以下のような感じになります。

github.dismiss_out_of_range_messages

checkstyle_format.base_path = '/repo'
checkstyle_format.report 'build/reports/ktlint/ktlint-main.xml'

ktlintの指摘があるのにGitHubのPRにコメントがつかなくて、なんでかなと思っていたのですがcheckstyle_format.base_pathの指定が違っていました。
checkstyle_format.base_pathには通常はDir.pwdを設定します。
ktlintの結果xmlに記載されるパスは絶対パスが記載されていてdanger-checkstyle_format実行時に絶対パスをレポジトリのパスに置換してくれています。
その時に置換するパスを指定するのがcheckstyle_format.base_pathになります。
例えば今回ktlintを実行すると以下のようなxmlファイルが出力されました。

<?xml version="1.0" encoding="utf-8"?>
<checkstyle version="8.0">
	<file name="/repo/src/main/kotlin/com/beeete2/zabbix/sender/ZabbixSender.kt">
	</file>
</checkstyle>

通常であれば、ktlintとDangerを実行するコンテナ(ホスト)は同じだと思うのですが、今回は違っており更にレポジトリのマウントパスも違っていたのでDir.pwdを指定しても置換ができずにコメントができませんでした。
今回は/repoが不要なのでcheckstyle_format.base_pathに/repoを指定することでうまくコメントができるようになりました。

まとめ

今回初めてDangerを使ったのですが色々な条件をつけてコメントができるみたいなので、チームで決めた指摘を自動化できてかなり良いものだと感じました。

参考にさせていただいたページ