☘️

detektを使って自動で静的解析を行いたい

2024/10/08に公開

はじめに

前提条件として、detektの設定は完了しているものとします。
detektを使って自動で静的解析を行いたいと思い、以下の方法を試してみました。

  • git pre-commit hook
  • gitlabでパイプライン実行させる

git pre-commit hook

公式に従って、コミット時に自動でdetektが実行されるように設定しました。
https://detekt.dev/docs/gettingstarted/git-pre-commit-hook
簡単に手順を以下に記します。

  • .git/hooks/pre-commitにあるpre-commitファイルにdetektを実行させるスクリプトを記述
  • pre-commitファイルに実行権限を与える

懸念点

この方法では、pre-commitファイルをコミットできない(=gitで管理できない)ため各自で設定をする必要があります。また、一つでも解析に引っかかるとコミットできません。

gitlabでパイプライン実行させる

こちらはgitlab-ci.ymlにdetektのタスクを追加しました。
※このとき、gradleのタスクにdetektを追加する必要があります。

gitlab-ci.yml
+ detekt:
+     stage: detekt
+     image: ribo46/detekt-cli:v2
+     tags:
+       - dev
+     script:
+       - ./gradlew detekt

懸念点

imageは適当にそれっぽいものをDockerHubから持ってきました。動いてるので良しとしています。この方法ではローカルでdetektを実行したときに作成される解析結果のレポートが出力されません。このissueを見る限りでは、まだ対応されていないようですね。
https://gitlab.com/gitlab-org/gitlab/-/issues/383150

さいごに

現在はgitlabでパイプライン実行させる処理を採用していますが、後々githubに移行すると思うのでそのときは再度こちらの記事を更新する予定です。また、ローカルでdetektを実行したときに自動で修正してくれたり、解析で引っかかった部分をコード上で指摘してくれるプラグインがintelijであったので追加しました。

Discussion