ふるてつのぶろぐ

福岡在住のエンジニアです。

写真提供:福岡市

いまだにJava 8 備忘録 - sonarqubeの使い方

今日すること

こんにちはふるてつです。

今回はJava自体のお話ではありません。
sonarqubeのお話になります。
sonarqubeソースコードの静的解析ツールになります。

f:id:tetsufuru:20201009020250p:plain:w300

常駐先のプロジェクトでも使用していますが、すでに設定されたものを使用するだけで、自分でいちから設定することはまずないです。
最近その常駐先で同僚にsonarqubeを教えようとしたところ「あら、どうやるんだっけ??」となりました。

そこで基礎から設定をやり直そうと思いブログにも書いた次第です。
Qiitaなどで話しつくされた感はかなりありますが…

1. sonarqubeの作業

まずsonarqubeダウンロードサイトを見てみます。
f:id:tetsufuru:20201009020730p:plain https://www.sonarqube.org/

コミュニティ版とデベロッパー版があるようですが、 ローカルにインストールして使用する場合は左のコミュニティ版を選ぶようです。
しかしダウンロードしているうちに下記のドキュメントにDocker版もあるというのを見つけまして、途中でダウンロードはやめて今回はDocker版を使うことにしました。

f:id:tetsufuru:20201009022548p:plain https://docs.sonarqube.org/latest/setup/get-started-2-minutes/

sonarqubeの起動

まずはsonarqubeを起動します、Dockerの起動コマンドはこちらです。

docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest

プロセスが起動したら下記のURLを参照します、ローカルホストの9000番ポートです。
f:id:tetsufuru:20201009024237p:plain http://localhost:9000

これでsonarqubeが起動しました。

プロジェクトの登録

では解析するプロジェクトを追加していきます。
まずはサインインします、login、password はともにデフォルトで admin です。
f:id:tetsufuru:20201009024350p:plain

サインインすると「Create new project」ボタンがまんなかに出てきます。
f:id:tetsufuru:20201009025218p:plain

「Create new project」ボタンをクリックするとProject keyとDisplay nameを入力しろと出てきます。
Project keyは解析するプロジェクトとは関係なくどんな名前でも大丈夫なようです。
わたしはとりあえず my_sonar_qube_test にしてみました、Display nameも一緒です。 f:id:tetsufuru:20201009025414p:plain

「Set Up」ボタンをクリックすると次は token を入力しろと出てきました。
こちらもとりあえずの値 my_sonar_qube_token と入れました。
f:id:tetsufuru:20201009025833p:plain

「Generate」ボタンをクリックしてそのあと先に進むと下の画面にたどり着きます。
わたしの環境の場合、言語はJavaで、ビルドはGradleを選択しています。
他にもC#JSも解析できるようです。
f:id:tetsufuru:20201009135424p:plain

画面の下に表示されている内容のうちひとつは解析したいソースの build.gradle ファイルに追加する内容です。
もう一つはsonarqubeに解析したいソースを登録するコマンドになります。

2. 解析されるソース(Java)での作業

Gradleにプラグイン追加

下記のプラグインを build.gradle ファイルに追加します。

plugins {
    id "org.sonarqube" version "2.7"
}

わたしの環境はGradleのマルチプロジェクトで、フロント側とBiz側の二つの子供のプロジェクトがあります。
下記のような感じで2つともに追加しました。
(バージョンは変数にして別ファイルで管理してます)

フロント側の build.gradle

f:id:tetsufuru:20201009034647p:plain

Biz側の build.gradle

f:id:tetsufuru:20201009034750p:plain

sonarqubeに解析したいソースの登録

次に以下のコマンドを解析したいソースのディレクトリ直下で実行します。
補足になりますが、わたしはWindows環境なので-Dの書き方を変えないとエラーになりました。
最初の./gradlewのところも、Dosコマンドを使う方は./が不要と思います。

./gradlew sonarqube -D "sonar.projectKey=myTestProject" -D "sonar.host.url=http://localhost:9000" -D "sonar.login=ea493af063a0129adf716dae2e6e41000c9a9379"
}

このコマンドが正常に終了するとsonarqubeで解析結果を見れるようになります。

3. 解析結果の確認

今回の解析結果は下記になります。
解析対象のソースはわたしが個人的にJavaで作ったもので、これまでにCheckstyleSpotBugsなどのツールは一切使っていません。
たくさん指摘がでると思いますー
f:id:tetsufuru:20201009040046p:plain

Bugs

まず一番上のBugsをみると1件出ていますね。
そんなふうには作ってないのですが…クリックして中身を確認します。 f:id:tetsufuru:20201009140201p:plain IntegerIntegerをかけ合わせてそのあとにLongに変えている箇所に指摘がありますね。
「かけ合わせる前にそれぞれをキャストしろ」と言われているようです。

Vulnerabilities

脆弱性は0件です。これはよし。

Security Hotspots

Security Hotspotsは1件あります。
Security Hotspotsは脆弱性とは違うようですね。
「ここリスクが高いから確認しておけよ」という感じでしょうか。
こちらも中を確認します。
f:id:tetsufuru:20201009141230p:plain Spring Securityの security config が指摘されていました。 わたしの環境ではSPAでサインインするときにSpringのBasic認証を使っているのですがそのあたりです。
そうですね、もう一度自分の意図した設定とあっているか確認しておきます。

Debt

これは負債を解消するためのコストらしいのですが、2h 38min ならいいかなと思いここはスキップします。

Code Smells

Code Smells 「あやしいにおい」ですね、ここは29件もあります。
f:id:tetsufuru:20201009142108p:plain 中身を確認してみます。

a. コードの消し忘れ

f:id:tetsufuru:20201009142749p:plain コメントアウトしたままコードを消していなかったところが指摘されています…

b. シリアライズ

f:id:tetsufuru:20201009142932p:plain 「ここではシリアライズできるクラスを使ってくれ」といったことを指摘してますね、そうですか…

c. その変数は省略できます

f:id:tetsufuru:20201009144938p:plain 「その変数は省略できます」というヤツですね、同じ内容が多数指摘されました。
わたしは節目節目で変数にセットしたいタイプなのですが修正した方がいいでしょうねー
あと同じところにもう一つ指摘があり「lambda -> はメソッド参照 :: に変えましょう」というのもありました。
そうなんですね、これも修正せねば。

d. リストの中が空かどうか

f:id:tetsufuru:20201009145837p:plain 「リストの中が空かどうかは size() メソッドを使うのではなく、isEmpty() メソッドを使いましょう」という指摘です。
すみません…

感想


今回はsonarqubeの初期設定について書きました。
いちおう最後までできました。 今回指摘された内容は別途修正します。

実際に自分でやろうとするとうまくできないことがおおいですねぇ
でもこれで常駐先の同僚にちゃんと説明できると思います。どや顔で。

それではまた😎