最近、仕事で初めてKotlinでサーバーサイドアプリケーションを書く機会がありました。
少しでも慣れたほうがいいかなと思って何かないかなと思っていたらちょうどZabbix Senderを使っていたのでKotlin版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は以下のような感じになります(抜粋)。
[groovy]
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
}
[/groovy]
これでktlintCheck
というタスクが追加されるのでgradlew ktlintCheck
を実行するか、ビルドしても実行されます。
設定によって異なりますが、結果はbuild/reports/ktlint
以下に出力されます。
GitHubのPRに通知する
チェックするだけではあんまり意味がなく、よりわかりやすく通知するためにGitHubに通知します。
通知にはDanger
を使いCIはCircleCI
を使いました。
Dangerファイルは以下のような感じになります。
[ruby]
github.dismiss_out_of_range_messages
checkstyle_format.base_path = '/repo'
checkstyle_format.report 'build/reports/ktlint/ktlint-main.xml'
[/ruby]
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]
<?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>
[/xml]
通常であれば、ktlintとDangerを実行するコンテナ(ホスト)は同じだと思うのですが、今回は違っており更にレポジトリのマウントパスも違っていたのでDir.pwd
を指定しても置換ができずにコメントができませんでした。
今回は/repo
が不要なのでcheckstyle_format.base_pathに/repo
を指定することでうまくコメントができるようになりました。
まとめ
今回初めてDangerを使ったのですが色々な条件をつけてコメントができるみたいなので、チームで決めた指摘を自動化できてかなり良いものだと感じました。