What is Detekt
Kotlinのための静的コード解析ツール
不吉なにおいの解析
このHand-onでは、Spring Bootで作成したプロジェクトを利用します。CIにはGitHub Actionsを利用します。
Prerequisites
- Spring Bootプロジェクトの作成
- GitHubアカウントとリモートリポジトリ
Quick start tutorial
新規作成したSpring Bootプロジェクト、もしくはSpring Initializerで作成したプロジェクトを開く。
Install Detekt with Gradle plugin
Gradleプロジェクトビルドファイルに次の構成を適応する。
plugins {
id("io.gitlab.arturbosch.detekt") version "1.20.0"
}
Tip: JET BRAINSのマーケットプレイスで公開されているDetektのプラグインをインストールすることで、IDEAと統合することができます。
Run Detekt using Gradle Task
検証用に次のコードを追加する。
package com.example.demo.domain.talent
data class TalentName(val value: String) {
init {
if (value.length > 255) {
throw Exception("名前は255文字以下で入力してください")
}
}
}
CLIからコマンドを実行する。
C:\Users\Umizoko\Downloads\demo\demo>gradlew detekt
> Task :detekt FAILED
C:\Users\Umizoko\Downloads\demo\demo\src\test\kotlin\com\example\demo\DemoApplicationTests.kt:10:21: This empty block of code can be removed. [EmptyFunctionBlock]
C:\Users\Umizoko\Downloads\demo\demo\src\main\kotlin\com\example\demo\domain\talent\TalentName.kt:6:13: Exception is a too generic Exception. Prefer throwing specific exceptions that indicate a specific error case. [TooGenericExceptionThrown]
C:\Users\Umizoko\Downloads\demo\demo\src\main\kotlin\com\example\demo\DemoApplication.kt:10:33: In most cases using a spread operator causes a full copy of the array to be created before calling a method. This may result in a performance penalty. [SpreadOperator]
C:\Users\Umizoko\Downloads\demo\demo\src\main\kotlin\com\example\demo\domain\talent\TalentName.kt:9:2: The file C:\Users\Umizoko\Downloads\demo\demo\src\main\kotlin\com\example\demo\domain\talent\TalentName.kt is not ending with a new line. [NewLineAtEndOfFile]
C:\Users\Umizoko\Downloads\demo\demo\src\main\kotlin\com\example\demo\domain\talent\TalentName.kt:5:28: This expression contains a magic number. Consider defining it to a well named constant. [MagicNumber]
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':detekt'.
> Analysis failed with 5 weighted issues.
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 1s
1 actionable task: 1 executed
上記のようにルールに違反したものを列挙する。公式ドキュメントからルールを確認することで、より準拠したコードにすることができる。
EmptyFunctionBlock
Empty blocks of code serve no purpose and should be removed.
TooGenericExceptionThrown
This rule reports thrown exceptions that have a type that is too generic. It should be preferred to throw specific exceptions to the case that has currently occurred.
SpreadOperator
In most cases using a spread operator causes a full copy of the array to be created before calling a method. This has a very high performance penalty.
NewLineAtEndOfFile
This rule reports files which do not end with a line separator.
MagicNumber
This rule detects and reports usages of magic numbers in the code. Prefer defining constants with clear names describing what the magic number means.
Automate Detekt with GitHub Actions
GitHub Actionsのワークフローに統合する。
ワークフローファイルに次の構成を適応する。
<SpringBoot Root Directory>/.gihub/workflows/detekt.yaml
name: detekt
on: push
jobs:
static-code-analyze:
runs-on: ubuntu-latest
steps:
- name: Checkout project sources
uses: actions/checkout@v2
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
- name: Executable Gradlew file
run: chmod +x ./gradlew
- name: Run detekt
run: ./gradlew detekt
ジョブのログで失敗していることを確認する。
Tip: レポートの出力フォーマットにSARIFをサポートしています。出力されたSARIFファイルをアップロードすることでCode Scanningと統合することができます。
Integrate Code Scanning
リモートリポジトリから
ワークフローの設定ファイルに次の構成を追加する。
name: detekt
on: push
jobs:
static-code-analyze:
runs-on: ubuntu-latest
steps:
- name: Checkout project sources
uses: actions/checkout@v2
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
- name: Executable Gradlew file
run: chmod +x ./gradlew
- name: Run detekt
run: ./gradlew detekt
- name: Upload SARIF to Github using the upload-sarif action
uses: github/codeql-action/upload-sarif@v2
if: success() || failure()
with:
sarif_file: build/reports/detekt/detekt.sarif
SARIFファイルのアップロードが完了すると、Code scanningページからルール違反の項目がアイテムベースでリストされる。