sonarQubeを使ったソースコード解析手順

# はじめに
sonarQubeを使ったソースコード解析の環境構築手順を残します。
以下の環境を使って構築しました。

| 環境             |            Version |
|:-----------------|:-------------------|
| OS               | macOS Mojave 10.14.3 |
| Docker           |          18.09.2 |

sonarQubeはDBの構築も必要なアプリケーションだったため、直接インストールせず
docker-composeを使って、複数のコンテナ上に載せました。
docker-composeのymlファイルは[こちら](https://github.com/SonarSource/docker-sonarqube/blob/master/recipes.md)を使わせていただきました。

# なぜ

### なぜソースコード解析か？
技術的負債の返済の必要性について開発者だけでなく、ビジネスも含めた関係者間で認識を合わせる必要がありました。
そのためにはビジネスとしての言語に翻訳する、つまり定量的な指標に落とし込むことが必要であり、そのための解析ツールを探していた次第です。

### なぜsonarQubeか？
当初[Code Climate](https://docs.codeclimate.com/)というSaaSのソースコード解析を利用しようとしたのですが
外部サーバに置かれることに関して社内でNGとなり、ローカルで確認可能な解析ツールを探したところ、sonarQubeを見つけました。

### なぜDockerか？
上記のとおりビジネス側と早急に言語を合わせる必要があるため、お手軽に立ち上げ可能なDockerを選定しました。

### 手順
Dockerはすでにインストールされているものとして記載します。

#### １．事前準備
docker composeを実行するための以下のように作業フォルダおよびファイルを作成します。

```
.
├── containers
│   └── datastore
│       └── Dockerfile
└── docker-compose.yml
```

#### ２．docker-compose用のymlファイル、Dockerイメージファイルを作成

```docker-compose.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:
```

Dockerfileは以下のようになります。

```Dockerfile
FROM busybox:latest

MAINTAINER takashi.iwasaki <takashi.iwasaki@example.com>

# sonarqube
VOLUME /opt/sonarqube/conf
VOLUME /opt/sonarqube/data
VOLUME /opt/sonarqube/extensions
VOLUME /opt/sonarqube/lib/bundled-plugins
ADD sonar.properties /opt/sonarqube/conf/sonar.properties
# postgresql
VOLUME /var/lib/postgresql
VOLUME /var/lib/postgresql/data

CMD /bin/sh
```

#### ３．docker-compose起動

```
$ docker-compose up
```

#### ４．sonarQubeログイン
[http://localhost:9000](http://localhost:9000)にアクセスし、以下のID、パスワードでログインします。

| 項目             |            値       |
|:-----------------|:-------------------|
| ID               | admin              |
| Password         | admin              |

#### ５．解析前準備
　（１）「Create New Project」で任意のプロジェクト名を入力、「SetUp」
　（２）sonarQubeを利用するためのトークンを発行するために「Generate」

#### 6．sonar scannerのインストール
[sonar scanner](https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner)をインストールします。
インストールしたzipファイルを解凍し、以下のディレクトリ構成で格納します。

```
.
├── containers
│   └── datastore
│       └── Dockerfile
├── docker-compose.yml
└── sonar-scanner-3.3.0.1492-macosx
    ├── bin
    │   ├── sonar-scanner
    │   └── sonar-scanner-debug
    └── conf
    　   └── sonar-scanner.properties
```

#### 7．sonar scanner実行のための準備
プロパティファイルを以下のように作成します。

```
#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here

#----- Default SonarQube server
#sonar.host.url=http://localhost:9000

#----- Default source code encoding
#sonar.sourceEncoding=UTF-8

#----- Default SonarQube server
sonar.host.url=http://localhost:9000

#----- Default source code encoding
sonar.sourceEncoding=UTF-8

#----- Global database settings (not used for SonarQube 5.2+)
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar

#----- postgres
sonar.jdbc.url=jdbc:postgresql://localhost/sonar

# Project identification
sonar.projectName=projectName # ５で登録したprojectName
sonar.projectKey=projectKey   # ５で登録したprojectKey
sonar.projectVersion=1.0

# Info required for Sonar
sonar.sources=project  # ソースコード解析したいプロジェクト

# Comma-separated paths to directories with sources (required)
sonar.language=java

#----- Default source code encoding
sonar.sourceEncoding=UTF-8

```


#### 8．sonar scanner実行

```
$ bin/sonar-scanner
```

### 今後
今回はあるタイミングのスナップショットでの解析となりましたが、
今後は開発プロセスに組み込み、Pull Request単位での解析を行いコードレビューを自動化あるいは平準化したいと思います。