【SonarQube】Gradleを使っているJavaに対するSonar Scanner

スポンサーリンク

はじめに

Gradle を使っている Java に対して、SonarQube で静的解析をしていきます。

実現方法として、SonarScanner for Gradle と SonarScanner CLI があるので、どちらも使ってみてどちらを使うのがいいかも見ていきたいと思います。

SonarScanner CLI と SonarScanner for Gradle

SonarScanner (CLI) は、特定のビルドシステムに依存しないスキャナーです。

SonarScanner
TheSonarScanneristhescannertousewhenthereisnospecificscannerforyourbuildsystem.

一方、SonarScanner for Gradle は Gradle を使った Java に特化した SonarScanner です。

SonarScanner for Gradle
TheSonarScannerforGradleprovidesaneasywaytostarttheanalysisofaGradleprojectwithSonarQube.

違いとしては、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 を使って、ローカルに構築します。

詳しい構築方法は下記を参照ください。

【SonarQube】Docker Composeでサクッと試してみる
はじめにDockerComposeでローカルにSonarQubeを構築して、サクッと試してみたいと思います。SonarQubeとはSonarQubeとは、コードの品質を保つための静的解析ツールです。CIパイプラインに組み込むことで、継続的に...

User > My Account > Security から解析時に使う Token を作成しておきます。

Generating and using tokens
Userscangeneratetokensthatcanbeusedtorunanalysesorinvokewebserviceswithoutaccesstotheuser'sactualcredentials.

サンプルコードの取得

サンプルコードは、下記の SonarSource のリポジトリのコードを利用します。

https://github.com/SonarSource/sonar-scanning-examples/tree/master/sonarqube-scanner-gradle/gradle-basic

下記で 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 のときに設定されてる値は下記から確認します。

SonarScanner for Gradle
TheSonarScannerforGradleprovidesaneasywaytostarttheanalysisofaGradleprojectwithSonarQube.

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 を使うのがいいかいと思います。

When to use sonar-scanner CLI versus SonarScanner plugin available with build tool’s like Maven,Gradle. etctera..?
Must-shareinformation(formattedwithMarkdown):whichversionsareyouusing(SonarQube,Scanner,Plugin,andanyrelevantextension)Version:8.3.1.34397(CommunityEdition)what...

ただ場合によっては、同じ CI パイプライン使って複数の言語を解析する場合は、SonarScanner CLI も選択肢になり得るかも知れません。その場合は、sonar-project.propertiesの設定を自ら行う必要があると思います。

参考

タイトルとURLをコピーしました