静的コード分析ツールSonarQubeってこんなに簡単に使えるようになってたのか、の話

# はじめに

数年ぶりにSonarQubeを触ってみたくなり、試したところかなり簡単だったので、その感覚を残したく記事化してみました。

# SonarQubeとは

SonarSourceのプロダクトの一つであり、コード品質、コードセキュリティのチェックを実施するツールです。

https://www.sonarqube.org/

さまざまな使い方ができるのだと思いますが、簡単に使うためにはJenkinsなどのツールと同じようにSonarQube用のサーバーとして１プロセス立ち上げ、その中でチェックと、チェック結果を確認・参照することができます。

# 今回やりたいこと

MavenでビルドしているJavaプロジェクトに対して、ソースコードの品質が不安なので第三者チェックしてほしいと思うことがあると思います。その際に頼めるレビューアーがいないので最低限確認するためにツールにレビューをお任せしたい、ということがやりたいことです。
JenkinsのようなCI環境も手元にはありませんので、無しでいきます。

# 環境構成

ざっくりですが、以下の環境でやりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/2ae84334-a1b9-0d51-e280-ab69c1f03322.png)

Java,Maven等のバージョンは以下の通りです。

```
\$ mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/xxxx/.sdkman/candidates/maven/current
Java version: 11.0.7, vendor: AdoptOpenJDK, runtime: /Users/xxxx/.sdkman/candidates/java/11.0.7.hs-adpt
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.16", arch: "x86_64", family: "mac"
```
# SonarQubeを試す

## SonarQubeのインストールと起動

SonarQubeのインストールについては公式のガイド通りにやればOKです。ローカルマシンでDocker動かすとちょっと重たいので今回はFrom the zip fileに記載の方法で実施しました。

https://docs.sonarqube.org/latest/setup/get-started-2-minutes/

今回利用したバージョンは、Community EditionVersion 9.5 (build 56709)でした。

ざっくりいうと
- Zipファイルダウンロードして解凍
- binフォルダの下にあるsonar.shをconsoleオプション付きで実行

```
 ./sonar.sh console
```
ログの掲載は省略しますが、Java11で動いていることがわかります。


## SonarQubeのプロジェクト作成
デフォルトでは9000番ポートでOpenされているので　http://localhost:9000/　
にブラウザでアクセスします。ID、PWを入れてログインするとプロジェクト一覧のような画面が出るのでCreate ProjectでManuallyでプロジェクト生成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/afccd6c1-e864-be50-7951-6437d54f6563.png)

プロジェクト名を決める必要があるので、今回はSampleProjectにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/4144b06f-1ad1-ef64-0a46-ca4fe4cb9b67.png)

Setupを押すとどういった構成で実行するのかを聞かれるので、今回はローカル実行のため、Locallyを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/1986bb6e-b365-39e9-26df-bd042da9f178.png)

Tokenを生成せよと言われるので、そのままGenerateしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/a362034e-c460-b2e7-4d8f-c4f4ed36eaee.png)

その後、プロジェクトのビルド方法を聞かれるので今回はMavenにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/333df308-889b-a914-2400-9920d24776e2.png)

すると、Token付きのMavenでの実行方法のコードが出てきますので、それを実行することでチェックできるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/50ba1190-36c7-8eeb-e98c-7491c6b529ad.png)

## SonarQubeでのチェック実行

お手元にある適当なJava、Mavenプロジェクトで試してみます。
あまり複雑なものではないのですが、JakartaEE9.1で画面アプリのサンプルを試していた以下のプロジェクトを使いました。

https://github.com/omix222/jeestudy

こちらのプロジェクト直下で先ほどSonarQubeで表示されていたmvnコマンドを実行します。初回はさまざまなプラグインやライブラリのダウンロードが走るため時間かかります。

実行ログの最後の方にレポートアクセスのためのURLが出るのでそこから結果を確認します。

```
・・・
[INFO] CPD Executor CPD calculation finished (done) | time=38ms
[INFO] Analysis report generated in 176ms, dir size=159.1 kB
[INFO] Analysis report compressed in 227ms, zip size=45.1 kB
[INFO] Analysis report uploaded in 155ms
[INFO] ANALYSIS SUCCESSFUL, you can find the results at: http://localhost:9000/dashboard?id=SampleProject
[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=AYKW086UmtOjHj2hRwpV
[INFO] Analysis total time: 59.090 s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:08 min
[INFO] Finished at: 2022-08-13T19:50:54+09:00
[INFO] ------------------------------------------------------------------------

```

結果レポートを見ると、２つのBugがあるとレポートされてました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/acd53af9-86fa-392a-a87b-a2b92e63023b.png)

Bugと表示されている2のところがリンクとなっており、押下すると以下のとおりどのファイルのどこの箇所がどういう理由でBugと検知されたのかを確認することができました！
今回は2つのXHTMLファイルのhtmlタグの属性にlangかxml:langが無いよ、という指摘でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/751868c5-fa27-0535-06f2-f1654b8f9613.png)

簡単な指摘でしたので、以下のとおり修正して再度実行し、Bugが0になることを確認しました。

https://github.com/omix222/jeestudy/commit/5d79d7e7112fee0cf635993abca89a1d2f7655cd

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/afc3bbbe-9d06-a7af-950a-d74cc90b4fff.png)

今回のBugは致命的なものではありませんでしたが、細かいチェックはツールにしてもらうに限りますね。簡単でした！

# まとめ

今回は最小の手として、MavenプロジェクトをローカルでSonarQube実行して静的コードチェックをすることを試しました。
この方法は初めてやったので簡単さが有難かったです。（過去はJenkinsと繋いで、、とかやってました。）

いろいろな使い道があると思いますが、一つ一つのコンポーネントを理解しながら最後に繋げて検討するという方法が良いかなと個人的には思いますので、試してみてください！