6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

静的コード解析ツール「Detekt」を導入してみる - Hands on

Last updated at Posted at 2022-05-15

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ページからルール違反の項目がアイテムベースでリストされる。

スクリーンショット 2022-05-15 233708.png

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?