静的解析のために LaraDock の SonarQube を Windows 10 + VirtualBox + Docker の環境で動かしてみたメモ

## 概要
SonarQubeというもので静的解析なるものが出来ると聞いて、[前回](https://qiita.com/hibohiboo/items/7de7ae7c76f081cbde50)のソースに試してみたメモ。
エラー修正の方向を間違えて迷走したが、最後には問題なく試すことができた。

[検証ソース](https://github.com/hibohiboo/whitemap/tree/84919701a73a064923d7ececf1ed611b2c253029/laravel_docker)


## 環境

* Windows 10 Home
* Vagrant 2.2.6
* virtualbox 6.0.14
* Ubuntu 18.04 LTS (Bionic Beaver)
* Docker version 19.03.2, build 6a30dfc
* docker-compose version 1.24.1, build 4667896b
* Laradoc  
* SonarQube Community EditionVersion 7.9.1 (build 27448)

## 設定

* コマンドは`vagrant ssh`でvirtualboxのubuntuにログインしている状態のもの。

### 必要な Dockerfile

LaraDockの中にはたくさんのDockerfileが入っているが、これに必要なのは以下の2つ。

- postgres
- sonarqube

### .envファイルの修正

```diff:laradock/.env
### SONARQUBE ################################################
## docker-compose up -d sonarqube
## (If you encounter a database error)
## docker-compose exec --user=root postgres
## source docker-entrypoint-initdb.d/init_sonarqube_db.sh
## (If you encounter logs error)
## docker-compose run --user=root --rm sonarqube chown sonarqube:sonarqube /opt/sonarqube/logs


-SONARQUBE_HOSTNAME=sonar.example.com
+SONARQUBE_HOSTNAME=127.0.0.1
SONARQUBE_PORT=9000
SONARQUBE_POSTGRES_INIT=true
SONARQUBE_POSTGRES_HOST=postgres
SONARQUBE_POSTGRES_DB=sonar
SONARQUBE_POSTGRES_USER=sonar
SONARQUBE_POSTGRES_PASSWORD=sonarPass
```

### ファイルのパーミッションの設定


`~/.laradock/data`は.envファイルの`DATA_PATH_HOST=./.laradock/data`を参照しているので、
変更している場合はそれに合わせること。

```
sudo mkdir -p ~/.laradock/data/sonarqube/logs
sudo chmod -R 777 ~/.laradock/data/sonarqube
```

上記を行わないと、以下のエラーが出て止まってしまう。

```
2019-10-19 01:53:08,586 main ERROR Unable to create file /opt/sonarqube/logs/es.log java.io.IOException: Permission denied
```

`## (If you encounter logs error) docker-compose run --user=root --rm sonarqube chown sonarqube:sonarqube /opt/sonarqube/logs` を試してみたがうまくいかず、調査に時間がかかってしまった。

### 仮想メモリの確認

- sonarqube は内部で ElasticSearch を使用しているため、メモリを大量に使う。
- 以下のコマンドで確認して、デフォルトの65530ならば増やす必要がある。

```
sysctl vm.max_map_count
```

#### 仮想メモリを増やす

```
sudo sysctl -w vm.max_map_count=262144
```

### 動作確認

```
docker-compose up -d sonarqube
```

virtualboxのIPをここでは192.168.74.60とすると、
http://192.168.74.60:9000/ にアクセスすると、SonarQubeの画面を確認することができる。

#### ログイン
ユーザ:admin,パスワード:admin でログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/99da3e0e-341c-4468-80f8-4fd01f37ef1c.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/5f23f086-725f-3772-0690-898c22d85250.png)

#### PHPプラグインの導入

プラグインを入れずに進めると以下のようなエラーとなってしまう。

```
ERROR: Error during SonarQube Scanner execution
ERROR: No quality profiles have been found, you probably don't have any language plugin installed.
ERROR:
ERROR: Re-run SonarQube Scanner using the -X switch to enable full debug logging.
```

Administration > MarketPlace でプラグイン導入画面へ移動。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/56cfea9c-80f4-e98a-cda1-3c3f1786d909.png)

phpと入力してプラグインを絞り込んで、インストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/2648465b-24ec-fd13-721e-dc0e2cc680c7.png)

インストールできたら再起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/5cfaf399-efb0-f274-0a48-c890299cf480.png)


#### プロジェクトの作成
Adminstration > Projects >Management の順で選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/16cbfbb9-48ea-8995-f514-6941fdbce6ad.png)

Create Project を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/c89ad9c9-9820-e760-9a9b-6958911d0179.png)

Name とKeyを入力してCreate

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/d7cea468-5690-d2d1-bf2a-0ac97b0a28ca.png)

Provide TokenにKeyを入力してGenerate。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/1d48bc5b-9c0d-394a-e427-752b0508960e.png)

このTokenはメモ帳などに保存しておくといい。
tokenを確認したら、 Continue。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/56c0f2dc-6c9c-08c4-cdf8-6e187b18dba9.png)

PHPを解析したいので、Other

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/d586c079-db4a-9633-d31c-61141e22df7d.png)


SonarQubeクライアントはUbuntuにインストールする予定なので、Linuxを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/9075da83-e382-8193-97f4-db0b2ff39186.png)

#### クライアントツールの設定

```bash
# インストール場所の設定
mkdir -p /home/vagrant/sonarqube
# 移動
cd /home/vagrant/sonarqube
# クライアントの入手
sudo wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.2.0.1873-linux.zip
# 解凍ツール導入
sudo apt install -y unzip
# 解凍
sudo unzip sonar-scanner-cli-4.2.0.1873-linux.zip
# 解凍したパスを設定して、フルパスをいれなくても sonar-scanner コマンドが使えるようにする
export PATH="$PATH:/home/vagrant/sonarqube/sonar-scanner-4.2.0.1873-linux/bin"
# ソースコードのあるディレクトリに移動
cd /vagrant/project/whitemap/laravel_docker/whitemap/app
# scan開始
sonar-scanner  -Dsonar.projectKey=Larvel  -Dsonar.sources=.  -Dsonar.host.url=http://192.168.74.60:9000  -Dsonar.login=b00689ae6518e3341dc09f529cc66661e3460d20
```

#### 確認

`sonar-scanner`に成功すると以下のようなメッセージが表示される。

```
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 8.460s
INFO: Final Memory: 6M/24M
INFO: ------------------------------------------------------------------------
````

ProjectsでWebから確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/12837e93-7b6c-6af7-365e-459473688cbd.png)

バグが１つあった。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/51efbd91-0821-1b0d-a43c-3b2305dd56b0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/0dba40bf-6731-7443-798e-b07136304577.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/71a8b7e3-ca1c-a495-d56b-f5195926da8a.png)


## 参考

[Laradock 3](https://laradock.io/documentation/#install-sonarqube-automatic-code-review-tool)
[issue](https://github.com/SonarSource/docker-sonarqube/issues/282#issuecomment-507735864)
[仮想メモリ - Elasticsearch 導入前に気を付けておきたいこと！](https://qiita.com/uzresk/items/e0b10c14875b79c450f2#%E4%BB%AE%E6%83%B3%E3%83%A1%E3%83%A2%E3%83%AA)
[Docker for Windows で postgres コンテナの Volume マウントを安全にする](https://qiita.com/megmogmog1965/items/e7cd4500006c3b6b1894)]
[SonarQube で PHP のコードを静的解析する](https://qiita.com/kadoyau/items/70f4a403b42847e4ed00)
[Get Started in Two Minutes Guide](https://docs.sonarqube.org/latest/setup/get-started-2-minutes/)
[Jenkins + SonarQube で PHP コードメトリクス計測！](http://kenzo0107.hatenablog.com/entry/2016/05/21/010902)
[Ubuntu の PATH の設定方法 j](https://qiita.com/takanemu/items/6027291be8a2a6af9adc)
[docker volume mount 時の user owner 問題](https://qiita.com/hikaruna/items/e04371fd49da0338ad81)
[SonarQubeでソースコードの静的解析とレビューを自動化してみる(前編)](https://dev.classmethod.jp/ci/sonarqube-source-analytics-1/)
[How To Ensure Code Quality with SonarQube on Ubuntu 18.04](https://www.digitalocean.com/community/tutorials/how-to-ensure-code-quality-with-sonarqube-on-ubuntu-18-04)
[【PHP】 PHPでの静的解析 SonarQubeを使ってみた](http://deadcode.hatenablog.jp/entry/2016/04/19/114256)