SonarQubeサクッといじってみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/0fadcd5d-cdde-8666-9222-012ea810ee2b.png)

# はじめに
皆さん、どうもです。[ｋ．ｓ．ロジャース](https://www.wantedly.com/companies/ks-rogers)のやすもんです。
今回はSonarQubeをローカルで試してみようと思います。
SonarQubeとはコードの静的解析を行い、自動レビューを行ってくれるオープンソースの品質管理プラットフォームです。
CIなどと組み合わせることでレビュワーの負担を減らし、品質担保を実現できるという話なのでイジイジしてみましょう！

# 弊社の開発フロー
ここで弊社の開発フローを簡単に紹介
1. PMがタスクの内容をissueに書き出し
2. 実装者がdevelopブランチからissue番号に合わせてブランチを作成し、開発を行う
3. 開発が完了したらPRを上げてレビュワーをアサイン
4. レビュワーがコードレビューを行い、修正点をコメント→実装者が修正
5. 修正点がなくなってLGTMが出た段階で実装者がdevelopにマージ
6. developにソースがマージされるとstaging環境へ自動デプロイ
7. staging環境でテスト後、問題なければdevelopブランチをmasterブランチへPMがマージする
8. masterブランチにソースがマージされるとproduction環境へデプロイ

大体、通常の開発フローと同じ感じだと思います。
上記項番3で自動レビューが走ると項番4のやり取りがだいぶ楽になると考えられます！

# SonarQube構築
では、早速構築していきましょう。
なんと、ありがたいことに公式のdocker-composeがあるのでこれを使わない手はないすね！
https://github.com/SonarSource/docker-sonarqube

dockerとはなんぞやという人はggってください！僕が説明するよりわかりやすく説明してくれる人がいるはずです

## docker-composeする
↑の公式からdocker-compose.ymlを拝借し、ローカルに展開

```sh
$ mkdir sonar
$ cd sonar
$ vi docker-compose.yml
```

docker-compose.yml を作成

```yml
version: "2"

services:
  sonarqube:
    image: sonarqube
    ports:
      - "9000:9000"
    networks:
      - sonarnet
    environment:
      - sonar.jdbc.url=jdbc:postgresql://db:5432/sonar
    volumes:
      - sonarqube_conf:/opt/sonarqube/conf
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions

  db:
    image: postgres
    networks:
      - sonarnet
    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=sonar
    volumes:
      - postgresql:/var/lib/postgresql
      # This needs explicit mapping due to https://github.com/docker-library/postgres/blob/4e48e3228a30763913ece952c611e5e9b95c8759/Dockerfile.template#L52
      - postgresql_data:/var/lib/postgresql/data

networks:
  sonarnet:
    driver: bridge

volumes:
  sonarqube_conf:
  sonarqube_data:
  sonarqube_extensions:
  postgresql:
postgresql_data:
```

ポスグレと一緒に立ち上がるみたいですね。
ymlができたら立ち上げます

```sh
$ docker-compose up -d
$ docker logs sonar_sonarqube_1
2019.06.13 16:41:41 INFO  app[][o.s.a.AppFileSystem] Cleaning or creating temp directory /opt/sonarqube/temp
2019.06.13 16:41:41 INFO  app[][o.s.a.es.EsSettings] Elasticsearch listening on /127.0.0.1:9001
2019.06.13 16:41:41 INFO  app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='es', ipcIndex=1, logFilenamePrefix=es]] from [/opt/sonarqube/elasticsearch]: /opt/sonarqube/elasticsearch/bin/elasticsearch
...中略
2019.06.13 16:42:36 INFO  ce[][o.s.ce.app.CeServer] Compute Engine is operational
2019.06.13 16:42:37 INFO  app[][o.s.a.SchedulerImpl] Process[ce] is up
2019.06.13 16:42:37 INFO  app[][o.s.a.SchedulerImpl] SonarQube is up
```

## アクセスしてみる
http://localhost:9000
ポートなどをいじってない場合は↑のURLからアクセスしてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/955e94bd-a710-6383-39b7-f2bd42f4ff50.png)

うまいこと立ち上がってはくれてるみたいだ

ログインしてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/653a9c75-9727-94e5-520d-50528a9c229c.png)

デフォルトはID, PASS共にadminとのこと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/11d8d8c9-b7b7-ee9a-d039-c81177216e47.png)

入れたみたいだ

## plugin設定
解析対象の言語や日本語化のプラグインなどいろいろあるみたいなので、入れてみます

AdministrationからMarketplaceを選択し、pluginを入れていきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/ca409622-5285-43c6-26fa-d1322170bd9c.png)

日本語の言語パックを入れてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/035b586e-169c-3480-cabb-76cdb81a958e.png)

インストールが完了したら、再起動しろ言われるので言われるがままに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/60496096-afb7-5995-9865-1a7baf0f2f91.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/17483b4d-62fc-a573-67ac-1ccb6d51f0f6.png)

程なくして再起動が完了しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/2110c17b-bb3f-d76f-da14-9d0085815c5f.png)

ログイン画面にリダイレクトされるので、リログします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/7e824b06-2c13-a221-e077-458f27782b98.png)

おぉ、日本語化されてますね

phpな基本的なプラグインは入ってるみたいです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/46b78b1c-b8c7-ccc9-9828-2b088c39cac4.png)

では、実際にコードの解析していきましょうか

## コードを解析させる
プロジェクトを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/77e34671-5131-3df1-182e-8ac3848691fc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/aa04f21b-dee7-ff30-44a9-bddc9c5b65d1.png)

トークンを生成する画面に行くので、生成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/b0e1d8fe-4304-611b-e41b-e9589489ccb3.png)

最下部のコマンドをコピーしておく

Scannerをインストールせよと言われるので言われるがままにzipをダウンロード

以下のような感じで展開

```sh
$ tree -L 1
.
├── docker-compose.yml 
└── sonar-scanner
```

phpコードを適当に配して、実行してみる

```sh
vi sample.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Hello World</title>
</head>
<body>
<?php
    echo "Hello World";
?>
</body>
</html>
```

こんな感じ

```sh
$ tree -L 1
.
├── docker-compose.yml
├── sample.php
└── sonar-scanner
```

コード解析の実行

```sh
$ ./sonar-scanner/bin/sonar-scanner \
  -Dsonar.projectKey=sample \
  -Dsonar.sources=. \
  -Dsonar.host.url=http://localhost:9000 \
  -Dsonar.login={トークン}

INFO: Scanner configuration file: /Users/ksr-1/work/sand_box/sonar/sonar-scanner/conf/sonar-scanner.properties
INFO: Project root configuration file: NONE
... 中略
INFO: Analysis total time: 3.854 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 7.693s
INFO: Final Memory: 26M/331M
INFO: ------------------------------------------------------------------------
```
上手くいったみたいだ

画面にレポート的なものがでる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/e8d15ee2-b744-8c27-6c07-ff3f1fa4765d.png)

バグを見てみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/5a7b87ff-7673-b96a-ad4c-6ab9698998f6.png)

sonner-scannerのコードを解析してしまったみたいだｗ

ファイル指定してやる

```
$ ./sonar-scanner/bin/sonar-scanner \
  -Dsonar.projectKey=sample \
  -Dsonar.sources=sample.php \ 
  -Dsonar.host.url=http://localhost:9000 \
  -Dsonar.login={トークン}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/eae6577e-a126-e1bc-c60d-1346836d1253.png)

画面が更新された

phpコードをいじって、わざとバグを出してみる

```php
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>Hello World</title>
    </head>
    <body>
        <?php
            echo "Hello World"
        ?>     
    </body>
</html>



<?php
    echo "Hello World";
?>     
```

まさかのバグ0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/c77e05b0-aa08-5812-9274-5ce65a8201a1.png)

そんな・・・無駄な改行や、スペース、phpの部分はセミコロンとかも消したのに。。。

設定みなおす
品質プロファイルから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/d8c62a6b-a25a-5341-12e9-07c3be6821fe.png)

PHPをPSR2に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/c8a94a57-b8d4-3acf-051e-288a6a468b87.png)

解析を再実行

Code Smellsに反応あり、どうやら臭うらしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/3bc0281c-3495-bdb0-5b86-190ca087b6f2.png)

エラーが出るようになりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/52432d5c-8968-c4c6-e0c7-502b1ce62a43.png)

どうやら、無駄なスペース部分でエラー出てるみたいです。
結構設定いじってみましたが、セミコロン抜けは反応してくれないみたいです(ココらへん設定でなんとかなるのかな。。。)

とはいえ、phpのコードを静的解析してGUI上で解析結果を表示することには成功しました。

構築してみた感じCIとの連携も簡単そうなので、良さそうです。

# さいごに
イジイジした感じですが、ちょと機能が多すぎてさっくりと触るだけでは網羅しきれませんでした。。。
また、かゆいところに手が届かない感じはあるかなーと言ったところですね。
セミコロンの件などは知見ある方いましたらコメントで教えていたければありがたいです><

しかし、設定周りを煮詰めれば確かにレビューのコストは減りそうですが、小~中規模のプロジェクトに導入するには大げさな気もしました。

大規模なプロジェクトでは真価を発揮するかもしれません。
公式のdocker-composeも準備されており、導入ハードルは低いので一度お試しを！

### Wantedlyでもブログ投稿してます

Techブログに加えて会社ブログなどもやっているので、気になった方はぜひ覗いてみてください。
https://www.wantedly.com/companies/ks-rogers