はじめに
皆さん、どうもです。k.s.ロジャースのやすもんです。
今回はSonarQubeをローカルで試してみようと思います。
SonarQubeとはコードの静的解析を行い、自動レビューを行ってくれるオープンソースの品質管理プラットフォームです。
CIなどと組み合わせることでレビュワーの負担を減らし、品質担保を実現できるという話なのでイジイジしてみましょう!
弊社の開発フロー
ここで弊社の開発フローを簡単に紹介
- PMがタスクの内容をissueに書き出し
- 実装者がdevelopブランチからissue番号に合わせてブランチを作成し、開発を行う
- 開発が完了したらPRを上げてレビュワーをアサイン
- レビュワーがコードレビューを行い、修正点をコメント→実装者が修正
- 修正点がなくなってLGTMが出た段階で実装者がdevelopにマージ
- developにソースがマージされるとstaging環境へ自動デプロイ
- staging環境でテスト後、問題なければdevelopブランチをmasterブランチへPMがマージする
- masterブランチにソースがマージされるとproduction環境へデプロイ
大体、通常の開発フローと同じ感じだと思います。
上記項番3で自動レビューが走ると項番4のやり取りがだいぶ楽になると考えられます!
SonarQube構築
では、早速構築していきましょう。
なんと、ありがたいことに公式のdocker-composeがあるのでこれを使わない手はないすね!
https://github.com/SonarSource/docker-sonarqube
dockerとはなんぞやという人はggってください!僕が説明するよりわかりやすく説明してくれる人がいるはずです
docker-composeする
↑の公式からdocker-compose.ymlを拝借し、ローカルに展開
$ mkdir sonar
$ cd sonar
$ vi docker-compose.yml
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:
ポスグレと一緒に立ち上がるみたいですね。
ymlができたら立ち上げます
$ 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からアクセスしてみる
うまいこと立ち上がってはくれてるみたいだ
デフォルトはID, PASS共にadminとのこと
入れたみたいだ
plugin設定
解析対象の言語や日本語化のプラグインなどいろいろあるみたいなので、入れてみます
AdministrationからMarketplaceを選択し、pluginを入れていきます
インストールが完了したら、再起動しろ言われるので言われるがままに
程なくして再起動が完了しました
ログイン画面にリダイレクトされるので、リログします
おぉ、日本語化されてますね
では、実際にコードの解析していきましょうか
コードを解析させる
プロジェクトを作成する
最下部のコマンドをコピーしておく
Scannerをインストールせよと言われるので言われるがままにzipをダウンロード
以下のような感じで展開
$ tree -L 1
.
├── docker-compose.yml
└── sonar-scanner
phpコードを適当に配して、実行してみる
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>
こんな感じ
$ tree -L 1
.
├── docker-compose.yml
├── sample.php
└── sonar-scanner
コード解析の実行
$ ./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: ------------------------------------------------------------------------
上手くいったみたいだ
sonner-scannerのコードを解析してしまったみたいだw
ファイル指定してやる
$ ./sonar-scanner/bin/sonar-scanner \
-Dsonar.projectKey=sample \
-Dsonar.sources=sample.php \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.login={トークン}
画面が更新された
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";
?>
そんな・・・無駄な改行や、スペース、phpの部分はセミコロンとかも消したのに。。。
設定みなおす
品質プロファイルから
解析を再実行
どうやら、無駄なスペース部分でエラー出てるみたいです。
結構設定いじってみましたが、セミコロン抜けは反応してくれないみたいです(ココらへん設定でなんとかなるのかな。。。)
とはいえ、phpのコードを静的解析してGUI上で解析結果を表示することには成功しました。
構築してみた感じCIとの連携も簡単そうなので、良さそうです。
さいごに
イジイジした感じですが、ちょと機能が多すぎてさっくりと触るだけでは網羅しきれませんでした。。。
また、かゆいところに手が届かない感じはあるかなーと言ったところですね。
セミコロンの件などは知見ある方いましたらコメントで教えていたければありがたいです><
しかし、設定周りを煮詰めれば確かにレビューのコストは減りそうですが、小~中規模のプロジェクトに導入するには大げさな気もしました。
大規模なプロジェクトでは真価を発揮するかもしれません。
公式のdocker-composeも準備されており、導入ハードルは低いので一度お試しを!
Wantedlyでもブログ投稿してます
Techブログに加えて会社ブログなどもやっているので、気になった方はぜひ覗いてみてください。
https://www.wantedly.com/companies/ks-rogers