ソースコードの静的メトリクス分析

# これは何？
静的メトリクス分析をお手軽にできないのか？を調べたときのメモで SonarQube について書いてあります。

# 経緯
GitHubにあるソースコードの静的メトリクス分析を行いたくて始めて、まずはGitHub APIの[この辺り](https://developer.github.com/v3/repos/statistics/)を叩くように[GitHub.js](http://github-tools.github.io/github/)に手を入れて作ってみたものの、ソースコードの成長率とコードのコミットをしてる人たちの履歴くらいしか取れないな〜、ということで世の中のツールを探したところ、[SonarQube](https://www.sonarqube.org/)にたどり着き、セットアップをして使ってみることになった、という経緯。

# SonarQube
## ウェブサイト
[こちら](https://www.sonarqube.org/)
Community Editionというのを使えば無料です。

## 何ができる？
「プログラム品質管理を行える統合品質管理ツール」とでも言えばよいのか、とにかく静的にいろいろ解析してくれます。

## 仕組み
荒く説明すると、クライアントで静的解析を行い（Scanner）＜図中(1)の部分＞、その結果をサーバに送り、サーバに送られた静的解析結果はWebUIから見やすい形で閲覧が可能になる＜図中(2)の部分＞、というのが大枠の仕組みです。（他の使い方もあるかもしれませんが、現在のところはここまでしか試していません）
これから説明するDockerのコンテナがサーバということになります。
<img width="744" alt="Screen Shot 2019-09-12 at 10.59.32 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61221/c1250aa5-0c20-7aaa-37fc-1ee00106c19f.png">

## 対応言語
20以上対応しているみたいです。以下は対応言語の一例です。

- Java
- VB.NET
- C/C++
- PL/SQL
- C#
- T-SQL
- COBOL
- Flex
- ABAP
- Python
- HTML
- Groovy
- RPG
- PHP
- JavaScript
- Swift
- TypeScript
- Visual Basic
- Objective C
- PL/I
- Kotlin(行けるっぽい)
- （他にもあるみたい）

## Requirement
動作させる手段はいろいろあるみたいです。ここではDockerで動作させサクッと動かすところの説明をします。

- Dockerが動くこと
- 解析対象のソースコードがある

ここの説明はmacOSを使って行います。

## 早速動かしてみる
[Docker Hubに公式Imageが公開されている](https://hub.docker.com/_/sonarqube/)のでサクッと動きます。Docker Hubのページにもインストール方法が説明されていますがインストールは全く同様の内容、その後の実行はオリジナルで説明していきます。

#### 1. 導入する
導入は以下の1行で完了です。

```shell
$ docker run -d --name sonarqube -p 9000:9000 sonarqube;
```

#### 2. ブラウザに表示する

ブラウザで http://localhost:9000 にアクセスしたらそこではSonarQubeが動いています。

こんな画面が出てきて、
<img width="1117" alt="Screen Shot 2019-09-12 at 14.18.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61221/045f85f0-4637-8369-49be-659e8d848369.png" style="border-radius: 2px; border: 1px solid #dddddd">

しばらく時間が経つと、この画面に切り替わります。
<img width="1116" alt="Screen Shot 2019-09-12 at 14.19.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61221/38e7cb60-80b5-53ea-5f43-d3f2b4ceba69.png" style="border-radius: 2px; border: 1px solid #dddddd">

#### 3. ログインしてプロジェクトを作成する

[Log in]をクリックして、ID: admin, PASS: admin でログインします。
その後[Creatte Project]からプロジェクトを作ります。
<img width="448" alt="Screen Shot 2019-09-12 at 14.24.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61221/b80ecd0e-10dd-4b6d-48d4-94c9caa630b7.png" style="border-radius: 2px; border: 1px solid #dddddd">


#### 4. Tokenを生成する 

Tokenは静的解析をクライアント（Scanner）で行った結果をサーバに送信する際に必要となります。再作成も可能ですがメモることをオススメします。
<img width="753" alt="Screen Shot 2019-09-12 at 14.25.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61221/947f4e11-5539-a9c1-83a6-a8da974c29de.png">

#### 5. scannerをセットアップして静的解析を行い結果を表示する

続いて、Scanner（静的解析をクライアントで行うツール）をクライアント（ここではmacOS）にダウンロードしてセットアップします。
<img width="797" alt="Screen Shot 2019-09-12 at 14.29.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61221/8dea4472-bbec-a916-d9ac-4d68602ba2d6.png">

セットアップ後、PATHまで通したら説明の通りのコマンドをクライアント（ここではmacOS）から実行します。コマンドもコピペでOKなので簡単です。

```shell
$ git clone https://github.com/ryoyakawai/midimessageviewer.git;
$ cd midimessageviewer/;
$ sonar-scanner \
  -Dsonar.projectKey=test00 \
  -Dsonar.sources=. \
  -Dsonar.host.url=http://localhost:9000 \
  -Dsonar.login=xxxxxxxxxx38e5812ff9a5de07e;
```

Scanner（静的解析をクライアントで行うツール）での静的解析が完了すると、以下のようにブラウザの画面が切り替わります。切り替わったら完了です。
<img width="1323" alt="Screen Shot 2019-09-12 at 15.24.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61221/1c2ece96-6d7a-f023-7223-7f97a18450a4.png">



以上でSonerQubeでの静的メトリクス分析の作業は終了です。あとは内容を読みつつ修正を行い品質の改善をおこなっていきます。
動作させること自体は拍子抜けするほど簡単ですので興味がある方は是非挑戦してみてください。


# Reference
- [sonarqube - Docker Hub](https://hub.docker.com/_/sonarqube/)
- [SonarQubeでプログラムの品質管理をはじめる（概要）](https://qiita.com/sh-ogawa/items/fac0eca110c3558dfae9)