SonnarQubeでソースコードの品質を解析する

SonarQubeというソースコードの静的解析ツールで、OpenAMのソースコードの品質を解析してみました。セットアップは非常に簡単なので、興味のあるOSSの品質を調査してみると面白いと思います。

SonarQubeとは

SonarQubeは、ソースコードの品質を管理するオープンソースソフトウェアで、以前はSonarと呼ばれていました。以下の7つの観点でソースコードの品質を分析します:

現時点で、Java、C#、C/C++、PL/SQL、Cobol、ABAPなど20種類以上のプログラミング言語の解析が可能で、拡張メカニズムによって、新しい言語に対応することや解析ルールを追加すること、高度な統計情報を計算することもできるようです。Jenkinsと連携させて自動化するのが、一般的な利用方法だと思いますが、今回は単独で動作させます。

手順. SonarQubeをセットアップする

公式サイト(以下)に、2分間でセットアップするためのガイドがあるので、基本的にはこの通りに実施します。

Get Started in Two Minutes

なお、今回はOSにWindows 10(64bit)を使用しています。

(1) このページ内のリンクからSonarQubeをダウンロード。

以下の2つが必要です。

  • SonarQube Server: ソースコードの解析結果を表示するサーバーソフトウェア
  • SonarQube Scanner: ソースコードの解析を行うツール

(2) ダウンロードしたら、適当な場所に解凍する。

ここでは、C:\配下にsonarqubeというディレクトリを作成して、その下に解凍しています。

  • C:\sonarqube\sonarqube-6.1
  • C:\sonarqube\sonar-scanner-2.8

(3) SonarQube Serverを起動。

Windows 10(64bit)の場合は、sonarqube-6.1\bin\windows-x86-64にあるStartSonar.batを実行するだけです。が、…

C:\WINDOWS\system32>cd C:\sonarqube\sonarqube-6.1\bin\windows-x86-64

C:\sonarqube\sonarqube-6.1\bin\windows-x86-64>StartSonar.bat
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1    |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
jvm 1    |
jvm 1    | WrapperSimpleApp: Unable to locate the class org.sonar.application.App: java.lang.UnsupportedClassVersionError: org/sonar/application/App : Unsupported major.minor version 52.0
jvm 1    |
jvm 1    | WrapperSimpleApp Usage:
jvm 1    |   java org.tanukisoftware.wrapper.WrapperSimpleApp {app_class} [app_arguments]
jvm 1    |
jvm 1    | Where:
jvm 1    |   app_class:      The fully qualified class name of the application to run.
jvm 1    |   app_arguments:  The arguments that would normally be passed to the
jvm 1    |                   application.
wrapper  |

このように、「Unsupported major.minor version 52.0」のエラーが出たら、Javaのバージョンが古いので、Java 8をインストールしましょう。OpenJDK 8のWindowsインストーラは、以下からダウンロードできます。

OpenJDK | ‘Red Hat Developers’

インストールしたら、環境変数なども設定して、javaコマンドでOpenJDK 8のjavaコマンドが実行されるようにして下さい。もしくは、以下のようにC:\sonarqube\sonarqube-6.1\confの下にあるwrapper.confを編集して下さい。

wrapper.java.command=java
  ↓
wrapper.java.command=C:\Program Files\RedHat\java-1.8.0-openjdk-1.8.0.111-1\bin\java

完了したら、再度StartSonar.batを実行します。「Process[ce] is up」が表示されたら、SonarQube Serverの起動完了です。

C:\sonarqube\sonarqube-6.1\bin\windows-x86-64>StartSonar.bat
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1    |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
jvm 1    |
jvm 1    | 2016.11.10 21:35:47 INFO  app[][o.s.a.AppFileSystem] Cleaning or creating temp directory C:\sonarqube\sonarqube-6.1\temp
jvm 1    | 2016.11.10 21:35:47 INFO  app[][o.s.p.m.JavaProcessLauncher] Launch process[es]: C:\Program Files\RedHat\java-1.8.0-openjdk-1.8.0.111-1\jre\bin\java -Djava.awt.headless=true -Xmx1G -Xms256m -Xss256k -Djna.nosys=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -Djava.io.tmpdir=C:\sonarqube\sonarqube-6.1\temp -javaagent:C:\Program Files\RedHat\java-1.8.0-openjdk-1.8.0.111-1\jre\lib\management-agent.jar -cp ./lib/common/*;./lib/search/* org.sonar.search.SearchServer C:\sonarqube\sonarqube-6.1\temp\sq-process3894559107684097525properties
jvm 1    | 2016.11.10 21:36:01 INFO  app[][o.s.p.m.Monitor] Process[es] is up
jvm 1    | 2016.11.10 21:36:01 INFO  app[][o.s.p.m.JavaProcessLauncher] Launch process[web]: C:\Program Files\RedHat\java-1.8.0-openjdk-1.8.0.111-1\jre\bin\java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djruby.management.enabled=false -Djruby.compile.invokedynamic=false -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -Djava.io.tmpdir=C:\sonarqube\sonarqube-6.1\temp -javaagent:C:\Program Files\RedHat\java-1.8.0-openjdk-1.8.0.111-1\jre\lib\management-agent.jar -cp ./lib/common/*;./lib/server/*;C:\sonarqube\sonarqube-6.1\lib\jdbc\h2\h2-1.3.176.jar org.sonar.server.app.WebServer C:\sonarqube\sonarqube-6.1\temp\sq-process4898450156161102220properties
jvm 1    | 2016.11.10 21:37:06 INFO  app[][o.s.p.m.Monitor] Process[web] is up
jvm 1    | 2016.11.10 21:37:06 INFO  app[][o.s.p.m.JavaProcessLauncher] Launch process[ce]: C:\Program Files\RedHat\java-1.8.0-openjdk-1.8.0.111-1\jre\bin\java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -Djava.io.tmpdir=C:\sonarqube\sonarqube-6.1\temp -javaagent:C:\Program Files\RedHat\java-1.8.0-openjdk-1.8.0.111-1\jre\lib\management-agent.jar -cp ./lib/common/*;./lib/server/*;./lib/ce/*;C:\sonarqube\sonarqube-6.1\lib\jdbc\h2\h2-1.3.176.jar org.sonar.ce.app.CeServer C:\sonarqube\sonarqube-6.1\temp\sq-process1341352410018877544properties
jvm 1    | 2016.11.10 21:37:20 INFO  app[][o.s.p.m.Monitor] Process[ce] is up

http://localhost:9000/ にアクセスすると、SonarQube Serverの画面が表示されます。

sq11

この段階では、まだ解析していないので、プロジェクトはありません。

(4) SonarQube Scannerを実行

SonarQube Serverが起動したら、SonarQube Scannerを実行してソースコードの解析を行います。解析するのは、OpenAMのソースコードにします。https://github.com/ForgeRock/openamからナイトリービルドをダウンロードして、適当なディレクトリに解凍します。今回は、C:\sonarqube以下に解凍しました。

解析を行う前に以下のページを確認して、sonar-scanner.propertiesを編集します。

http://docs.sonarqube.org/display/SONAR/Analysis+Parameters

ここでは、以下のプロパティを追加しました。

sonar.host.url=http://localhost:9000
sonar.projectKey=OpenAM14
sonar.sources=C:/sonarqube/openam-master
sonar.projectName=OpenAM14Nightly
sonar.projectVersion=14.0.0

それでは、SonarQube Scannerを実行してみましょう。ソースコードのルートディレクトリに移動して、sonar-scanner.batを実行します。

C:\sonarqube\sonar-scanner-2.8\bin>cd C:\sonarqube\openam-master

C:\sonarqube\openam-master>C:\sonarqube\sonar-scanner-2.8\bin\sonar-scanner.bat
C:\sonarqube\sonar-scanner-2.8\bin\..
INFO: Scanner configuration file: C:\sonarqube\sonar-scanner-2.8\bin\..\conf\sonar-scanner.properties
INFO: Project root configuration file: NONE
INFO: SonarQube Scanner 2.8
INFO: Java 1.8.0_111-1-redhat Oracle Corporation (64-bit)
INFO: Windows 10 10.0 amd64

  ・・・(省略)・・・

INFO: Calculating CPD for 2068 files
INFO: CPD calculation finished
INFO: Analysis report generated in 219437ms, dir size=41 MB
INFO: Analysis reports compressed in 72981ms, zip size=15 MB
INFO: Analysis report uploaded in 12057ms
INFO: ANALYSIS SUCCESSFUL, you can browse http://localhost:9000/dashboard/index/OpenAM13
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://localhost:9000/api/ce/task?id=AVhOak-bSYyq1GnEMWBa
INFO: Task total time: 24:00.621 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 24:03.301s
INFO: Final Memory: 48M/306M
INFO: ------------------------------------------------------------------------

成功したら、再度 http://localhost:9000/  にアクセスします。画面右上の円形のマークが回転している間はSonarQubeが解析中なので、しばらく待ちましょう。

完了してからアクセスすると、解析結果が表示されます。

sq2

「ん?バグが3,800件で…脆弱性が670件?」とびっくりしてしまいますが、解析結果の詳細を見ると、Severity(重大性)が最高ランクのBlockerでも「NullPointerExceptionがスローされる可能性がある」といったもので、実際に直す必要があるかどうかはソースコードを見てみないと判断できません。

sq16

例えば、以下のようにメソッドの呼び元から渡ってくる値がnullになりえない個所での指摘だったりするので、全てが問題というわけではありません。

sq18

警告メッセージの右側の「…」となっている箇所をクリックすると、画面下部に何が問題でどのような修正すべきかも表示されます。

sq15

ちなみにEclipseやIntelliJのプラグインもあります。

広告