3
5

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 3 years have passed since last update.

MavenプロジェクトでSonarQubeを使ってみる

Last updated at Posted at 2021-01-22

What's?

こちらのエントリでSonarQubeサーバーのインストール方法はわかったので、今後はSonarQubeを動かしてみましょう。

CentOS 8にSonarQubeサーバーをインストールする

Java(Maven)なプロジェクトで、SonarQubeのソースコード解析を動かしてみます。

環境

SonarQubeサーバーのバージョンは8.6.0.39681、SonarQubeサーバーが稼働しているサーバーのIPアドレスは192.168.33.10とします。

JavaやMavenのバージョンはこちら。

$ java --version
openjdk 11.0.9.1 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)


$ mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 11.0.9.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-64-generic", arch: "amd64", family: "unix"

サンプルプロジェクト

ソースコード解析をしようにも、ソースコードがないとどうにもなりません。

今回は、すでに存在するものを引っ張ってくることにしました。Spring PetClinicです。

Spring PetClinic Sample Application

cloneしてきて

$ git clone https://github.com/spring-projects/spring-petclinic.git
$ cd spring-petclinic

特定のタグにcheckoutしたかったところですが、タグがなかったのでコミットにしておきました。

$ git log -1
commit 02babdd8cb0d494d043fdf35a24dd2127c5d5167 (HEAD -> main, origin/main, origin/HEAD)
Author: Stephane Nicoll <snicoll@vmware.com>
Date:   Fri Dec 25 13:02:48 2020 +0100

    Upgrade to Spring Boot 2.4.1

$ git checkout 02babdd8cb0d494d043fdf35a24dd2127c5d5167

これで、ソースコードを解析するプロジェクトの準備は完了です。

SonarQubeでソースコードを解析する

SonarQubeサーバー側では、ユーザーとプロジェクトを作成しておきます。

プロジェクト作成時に

image.png

トークンを作って

image.png

ビルドシステムや言語を選ぶと、使い方を教えてくれます。

image.png

今回は、プロジェクト名はsonar-spring-petclinicとしました。
※キャプチャとは違う名前ですね…

以下のように、システムプロパティでSonarQubeサーバー上のプロジェクト名、接続先、トークンを指定してsonar:sonarゴールを実行します。

$ mvn compile sonar:sonar \
  -Dsonar.projectKey=sonar-spring-petclinic \
  -Dsonar.host.url=http://192.168.33.10:9000 \
  -Dsonar.login=[SonarQubeトークン]

この時、ソースコードのビルドは完了している必要があります。

Sonar Maven Plugin実行時の様子です。

[INFO] --- sonar-maven-plugin:3.8.0.2131:sonar (default-cli) @ spring-petclinic ---
[INFO] User cache: $HOME/.sonar/cache
[INFO] SonarQube version: 8.6.0
[INFO] Default locale: "ja_JP", source code encoding: "UTF-8"
[INFO] Load global settings
[INFO] Load global settings (done) | time=216ms
[INFO] Server id: 641C58CB-AXcoJzcTxqy5V9PiCfw8
[INFO] User cache: $HOME/.sonar/cache
[INFO] Load/download plugins
[INFO] Load plugins index
[INFO] Load plugins index (done) | time=66ms
[INFO] Load/download plugins (done) | time=105ms
[INFO] Process project properties
[INFO] Process project properties (done) | time=7ms
[INFO] Execute project builders
[INFO] Execute project builders (done) | time=1ms
[INFO] Project key: sonar-spring-petclinic
[INFO] Base dir: /path/to/spring-petclinic
[INFO] Working dir: /path/to/spring-petclinic/target/sonar
[INFO] Load project settings for component key: 'sonar-spring-petclinic'
[INFO] Load project settings for component key: 'sonar-spring-petclinic' (done) | time=16ms
[INFO] Load quality profiles
[INFO] Load quality profiles (done) | time=44ms
[INFO] Load active rules
[INFO] Load active rules (done) | time=798ms
[INFO] Indexing files...
[INFO] Project configuration:
[INFO] 37 files indexed
[INFO] 0 files ignored because of scm ignore settings
[INFO] Quality profile for java: My Sonar way
[INFO] Quality profile for xml: Sonar way
[INFO] ------------- Run sensors on module petclinic
[INFO] Load metrics repository
[INFO] Load metrics repository (done) | time=19ms
[INFO] Sensor JavaSquidSensor [java]
[INFO] Configured Java source version (sonar.java.source): 8
[INFO] JavaClasspath initialization
[INFO] JavaClasspath initialization (done) | time=20ms
[INFO] JavaTestClasspath initialization
[INFO] JavaTestClasspath initialization (done) | time=4ms
[INFO] Java Main Files AST scan
[INFO] 25 source files to be analyzed
[INFO] Load project repositories
[INFO] Load project repositories (done) | time=20ms
[INFO] 25/25 source files have been analyzed
[INFO] Java Main Files AST scan (done) | time=2436ms
[INFO] Java Test Files AST scan
[INFO] 11 source files to be analyzed
[INFO] Java Test Files AST scan (done) | time=710ms
[INFO] 11/11 source files have been analyzed
[INFO] Java Generated Files AST scan
[INFO] 0 source files to be analyzed
[INFO] Java Generated Files AST scan (done) | time=1ms
[INFO] 0/0 source files have been analyzed
[INFO] Sensor JavaSquidSensor [java] (done) | time=3399ms
[INFO] Sensor CSS Rules [cssfamily]
[INFO] No CSS, PHP, HTML or VueJS files are found in the project. CSS analysis is skipped.
[INFO] Sensor CSS Rules [cssfamily] (done) | time=1ms
[INFO] Sensor JaCoCo XML Report Importer [jacoco]
[INFO] 'sonar.coverage.jacoco.xmlReportPaths' is not defined. Using default locations: target/site/jacoco/jacoco.xml,target/site/jacoco-it/jacoco.xml,build/reports/jacoco/test/jacocoTestReport.xml
[INFO] No report imported, no coverage information will be imported by JaCoCo XML Report Importer
[INFO] Sensor JaCoCo XML Report Importer [jacoco] (done) | time=7ms
[INFO] Sensor C# Properties [csharp]
[INFO] Sensor C# Properties [csharp] (done) | time=1ms
[INFO] Sensor SurefireSensor [java]
[INFO] parsing [/path/to/spring-petclinic/target/surefire-reports]
[INFO] Sensor SurefireSensor [java] (done) | time=2ms
[INFO] Sensor JavaXmlSensor [java]
[INFO] 1 source files to be analyzed
[INFO] Sensor JavaXmlSensor [java] (done) | time=219ms
[INFO] 1/1 source files have been analyzed
[INFO] Sensor HTML [web]
[INFO] Sensor HTML [web] (done) | time=3ms
[INFO] Sensor XML Sensor [xml]
[INFO] 1 source files to be analyzed
[INFO] Sensor XML Sensor [xml] (done) | time=123ms
[INFO] 1/1 source files have been analyzed
[INFO] Sensor VB.NET Properties [vbnet]
[INFO] Sensor VB.NET Properties [vbnet] (done) | time=1ms
[INFO] ------------- Run sensors on project
[INFO] Sensor Zero Coverage Sensor
[INFO] Sensor Zero Coverage Sensor (done) | time=11ms
[INFO] Sensor Java CPD Block Indexer
[INFO] Sensor Java CPD Block Indexer (done) | time=56ms
[INFO] SCM Publisher SCM provider for this project is: git
[INFO] SCM Publisher 1 source file to be analyzed
[INFO] SCM Publisher 0/1 source files have been analyzed (done) | time=286ms
[WARNING] Missing blame information for the following files:
[WARNING]   * pom.xml
[WARNING] This may lead to missing/broken features in SonarQube
[INFO] CPD Executor 12 files had no CPD blocks
[INFO] CPD Executor Calculating CPD for 13 files
[INFO] CPD Executor CPD calculation finished (done) | time=11ms
[INFO] Analysis report generated in 71ms, dir size=251 KB
[INFO] Analysis report compressed in 95ms, zip size=112 KB
[INFO] Analysis report uploaded in 82ms
[INFO] ANALYSIS SUCCESSFUL, you can browse http://192.168.33.10:9000/dashboard?id=sonar-spring-petclinic
[INFO] Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report
[INFO] More about the report processing at http://192.168.33.10:9000/api/ce/task?id=AXcqAWMeAa54pbha1y28
[INFO] Analysis total time: 7.170 s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  15.828 s
[INFO] Finished at: 2021-01-22T21:11:10+09:00
[INFO] ------------------------------------------------------------------------

SonarQubeサーバーへの送信が上手くいったら、プロジェクトのページを見てみます。

こんな感じになっています。

image.png

検出された問題の一覧が見れたり

image.png

指摘箇所が見れたり

image.png

ソースコードも見れたりします。

image.png

ということは、プロジェクトのソースコードはSonarQubeサーバーに送っているんですね。

Sonar Maven Pluginをpom.xmlに組み込む

先ほどはmvn実行時のシステムプロパティですべての設定を行い、またプラグインのバージョン指定などもなかったので、今度はpom.xmlにSonar Maven Pluginを組み込んでみましょう。

こちらですね。

SonarScanner for Maven

SonarQube Scanner for Maven

シンプルに、こんな感じになります。設定項目はほぼありません(スキップの指定があるくらいです)。


  <build>
    <plugins>
      <plugin>
        <groupId>org.sonarsource.scanner.maven</groupId>
        <artifactId>sonar-maven-plugin</artifactId>
        <version>3.8.0.2131</version>
      </plugin>

      ...

    </plugins>
  </build>

設定がないと書きましたが、先ほどのSonarQubeサーバーのURLなどの説明は?というと、こちらにあります。

Analysis Parameters

これらは、pom.xmlにプロパティとして指定しましょう。

  <properties>
    <!-- SonarQube -->
    <sonar.projectKey>sonar-spring-petclinic</sonar.projectKey>
    <sonar.host.url>http://192.168.33.10:9000</sonar.host.url>
    <sonar.login>dummy</sonar.login>

    ...

  </properties>

トークンだけは、システムプロパティで実行時に渡すことにしました。

$ mvn sonar:sonar -Dsonar.login=[トークン]

実際には、ソースコードのビルドとともに動かすことになると思うので、以下のような使い方になるでしょう。

$ mvn compile sonar:sonar -Dsonar.login=[トークン]
$ mvn test sonar:sonar -Dsonar.login=[トークン]
$ mvn package sonar:sonar -Dsonar.login=[トークン]

ちなみに、Spring PetClinicの場合、HTTPでSonarQubeへの接続先を書いていたらCheckStyleでNGになりました…。

[INFO] --- maven-checkstyle-plugin:3.1.1:check (nohttp-checkstyle-validation) @ spring-petclinic ---
[INFO] There is 1 error reported by Checkstyle 8.32 with src/checkstyle/nohttp-checkstyle.xml ruleset.
[ERROR] pom.xml:[36,22] (extension) NoHttp: http:// URLs are not allowed but got 'http://192.168.33.10:9000'. Use https:// instead.

今回は、コメントアウトしておきます…。

src/checkstyle/nohttp-checkstyle.xml
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
		"-//Puppy Crawl//DTD Check Configuration 1.2//EN"
		"https://checkstyle.org/dtds/configuration_1_2.dtd">
<module name="com.puppycrawl.tools.checkstyle.Checker">
	<!-- <module name="io.spring.nohttp.checkstyle.check.NoHttpCheck"/> -->
</module>

適用しているルールについて

今回はなにも考えずに実行しましたが、デフォルトのルールでソースコードチェックされていることになります。

Project Informationで見た時の、「Quality Profile」というものが適用しているルールをまとめたプロファイルです。

image.png

デフォルトでは「Sonar way」というプロファイルが使われています。

image.png

各言語の全ルールが有効になっているわけではなく、ある程度は選別されているようです。

一覧はこちらです。

image.png

Sonar wayはビルトインプロファイルなので、編集することができません。

Sonar wayをベースにカスタマイズするには、コピーして新しいプロファイルを作って行うのがよいのでしょう。

こちらは、Sonar wayプロファイルをコピーして作成した「My Sonar way」というプロファイルです。Deactivateが押せるようになっています。

image.png

あとは、プロジェクト側のQuality Profiliesで

image.png

作成したプロファイルを選択すると、次回の解析から使用されます。

image.png

これで、SonarQubeでの解析が始められますね。

3
5
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
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?