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

2023.09.12
2024.03.24
CI/CD
GradleJavaSonarQube

はじめに

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

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

SonarScanner CLI と SonarScanner for Gradle

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

SonarScanner

SonarScanner

The SonarScanner is the scanner to use when there is no specific scanner for your build system.

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

SonarScanner for Gradle

SonarScanner for Gradle

The SonarScanner for Gradle provides an easy way to start the analysis of a Gradle project with SonarQube.

違いとしては、Gradle に特化しているのか、していないのかになります。特化していると、SonarScanner を実行する際に設定するさまざまなパラメーターをビルドツールの設定から取得して、自動で設定してくれます。

一応、SonarScanner CLI を使って、Gradle を使った Java も解析できます。

SonarScanner CLI のインストール

SonarScanner CLI は brew を使うと、下記でインストールできます。

1brew install sonar-scanner

準備

今回は、SonarScanner for Gradle と SonarScanner CLI どちらも使って解析してみます。

まずは、SonarQube 自体とサンプルコードを用意します。

Docker Compose で SonarQube の構築

SonarQube は Docker Compose を使って、ローカルに構築します。

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

【SonarQube】Docker Composeでサクッと試してみる

【SonarQube】Docker Composeでサクッと試してみる

はじめに Docker ComposeでローカルにSonarQubeを構築して、サクッと試してみ

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

Generating and using tokens

Generating and using tokens

Users can generate tokens that can be used to run analyses or invoke web services without access to the user's actual credentials.

サンプルコードの取得

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

unknown link

下記で clone して、今回利用するプロジェクトまで移動します。

1git clone [email protected]:SonarSource/sonar-scanning-examples.git
2cd sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic

SonarScanner for Gradle

まずは、SonarScanner for Gradle を使って実行してみます。

作成した Token を使って、実行します。SonarScanner CLI でも同じリポジトリを使うので、プロジェクト名は変更されるようにしています。

1./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を作成して、とりあえずは先ほど指定したパラメーターと同じものを設定してみます。

1sonar.host.url=http://localhost:9000
2sonar.projectKey=sonarscanner-cli
3sonar.ProjectName=sonarscanner-cli
4sonar.login={token}

SonarScanner CLI を使って実行します。

1sonar-scanner

実行してみると、エラーになりました。SonarScanner for Gradle の時は自動で設定されていたパラメーターが設定されていないのが原因みたいです。

1
2...
3
4ERROR: Error during SonarScanner execution
5org.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
6
7...
8

わかる範囲でパラメーターの値を設定します。SonarScanner for Gradle のときに設定されてる値は下記から確認します。

SonarScanner for Gradle

SonarScanner for Gradle

The SonarScanner for Gradle provides an easy way to start the analysis of a Gradle project with SonarQube.

gradle propertiesなどのコマンドを用いて、できる限り設定します。

1sonar.host.url=http://localhost:9000
2sonar.projectKey=sonarscanner-cli
3sonar.ProjectName=sonarscanner-cli
4sonar.login={token}
5
6sonar.projectDescription=Example of Sonar Scanner for Gradle Usage
7sonar.projectVersion=1.0
8sonar.projectBaseDir={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic
9sonar.projectWorkingDir={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic/build/sonar
10
11sonar.java.source=17
12sonar.java.target=17
13sonar.sources={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic/src
14sonar.tests={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic/src/test/java
15sonar.java.binaries={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic/build/classes/java/main
16sonar.java.test.binaries={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic/build/classes/java/test
17sonar.junit.reportPaths={path to repo}/sonar-scanning-examples/sonarqube-scanner-gradle/gradle-basic/build/test-results

再度実行するとうまくいき、UI から結果も確認できました。

1sonar-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..?

When to use sonar-scanner CLI versus SonarScanner plugin available with build tool’s like Maven,Gradle. etctera..?

Must-share information (formatted with Markdown): which versions are you using (SonarQube, Scanner, Plugin, and any relevant extension) Version: 8.3.1.34397 ( Community Edition) what are you trying to achieve Static code analysis Via Jenkins Pipeline what have you tried so far to achieve this Hi, I am new to sonarqube tool. Can someone please help me understand. When to use sonar-scanner CLI versus SonarScanner plugin available with build tool’s like Maven,Gradle. etctera…? Also,...

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

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee