はじめに
Gradle を使っている Java に対して、SonarQube で静的解析をしていきます。
実現方法として、SonarScanner for Gradle と SonarScanner CLI があるので、どちらも使ってみてどちらを使うのがいいかも見ていきたいと思います。
SonarScanner CLI と SonarScanner for Gradle
SonarScanner (CLI) は、特定のビルドシステムに依存しないスキャナーです。
一方、SonarScanner for Gradle は Gradle を使った Java に特化した SonarScanner です。
違いとしては、Gradle に特化しているのか、していないのかになります。特化していると、SonarScanner を実行する際に設定するさまざまなパラメーターをビルドツールの設定から取得して、自動で設定してくれます。
一応、SonarScanner CLI を使って、Gradle を使った Java も解析できます。
SonarScanner CLI のインストール
SonarScanner CLI は brew を使うと、下記でインストールできます。
brew install sonar-scanner
準備
今回は、SonarScanner for Gradle と SonarScanner CLI どちらも使って解析してみます。
まずは、SonarQube 自体とサンプルコードを用意します。
Docker Compose で SonarQube の構築
SonarQube は Docker Compose を使って、ローカルに構築します。
詳しい構築方法は下記を参照ください。

User > My Account > Security から解析時に使う Token を作成しておきます。
サンプルコードの取得
サンプルコードは、下記の SonarSource のリポジトリのコードを利用します。
下記で clone して、今回利用するプロジェクトまで移動します。
git clone [email protected]:SonarSource/sonar-scanning-examples.git
cd sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic
SonarScanner for Gradle
まずは、SonarScanner for Gradle を使って実行してみます。
作成した Token を使って、実行します。SonarScanner CLI でも同じリポジトリを使うので、プロジェクト名は変更されるようにしています。
./gradlew sonar -Dsonar.host.url=http://localhost:9000 -Dsonar.projectKey=sonarscanner-for-gradle -Dsonar.projectName=sonarscanner-for-gradle -Dsonar.login={token}
実行が完了すると UI から結果を確認できます。
テストのカバレッジもソース(src/)から自動で識別してくれています。
build.gradle
に記載されているバージョンも自動で設定されています。
SonarScanner CLI
sonar-project.properties
を作成して、とりあえずは先ほど指定したパラメーターと同じものを設定してみます。
sonar.host.url=http://localhost:9000
sonar.projectKey=sonarscanner-cli
sonar.ProjectName=sonarscanner-cli
sonar.login={token}
SonarScanner CLI を使って実行します。
sonar-scanner
実行してみると、エラーになりました。SonarScanner for Gradle の時は自動で設定されていたパラメーターが設定されていないのが原因みたいです。
...
ERROR: Error during SonarScanner execution
org.sonar.java.AnalysisException: Your project contains .java files, please provide compiled classes with sonar.java.binaries property, or exclude them from the analysis with sonar.exclusions property
...
わかる範囲でパラメーターの値を設定します。SonarScanner for Gradle のときに設定されてる値は下記から確認します。
gradle properties
などのコマンドを用いて、できる限り設定します。
sonar.host.url=http://localhost:9000
sonar.projectKey=sonarscanner-cli
sonar.ProjectName=sonarscanner-cli
sonar.login={token}
sonar.projectDescription=Example of Sonar Scanner for Gradle Usage
sonar.projectVersion=1.0
sonar.projectBaseDir={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic
sonar.projectWorkingDir={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic/build/sonar
sonar.java.source=17
sonar.java.target=17
sonar.sources={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic/src
sonar.tests={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic/src/test/java
sonar.java.binaries={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic/build/classes/java/main
sonar.java.test.binaries={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic/build/classes/java/test
sonar.junit.reportPaths={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic/build/test-results
再度実行するとうまくいき、UI から結果も確認できました。
sonar-scanner
どっちがいいのか
Gradle を使っている java に対して、SonarScanner for Gradle と SonarScanner CLI どちらも使ってみました。自動でパラメーターを設定してくれる SonarScanner for Gradle の方が圧倒的に楽でした。
下記のコミュニティでも回答されていますが、Gradle を使っているのであれば SonarScanner for Gradle を使うのがいいかいと思います。
ただ場合によっては、同じ CI パイプライン使って複数の言語を解析する場合は、SonarScanner CLI も選択肢になり得るかも知れません。その場合は、sonar-project.properties
の設定を自ら行う必要があると思います。
参考
- SonarScanner for Gradle
- SonarScanner
- When to use sonar-scanner CLI versus SonarScanner plugin available with build tool’s like Maven,Gradle. etctera..? - SonarQube - Sonar Community
- SonarSource/sonar-scanning-examples: Shows how to use the Scanners
- SonarSource/sonar-scanner-cli: Scanner CLI for SonarQube and SonarCloud