22
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SonarQubeサクッといじってみた

Last updated at Posted at 2020-02-26

image.png

はじめに

皆さん、どうもです。k.s.ロジャースのやすもんです。
今回は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を拝借し、ローカルに展開

$ 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からアクセスしてみる
image.png

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

ログインしてみる
image.png

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

image.png

入れたみたいだ

plugin設定

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

AdministrationからMarketplaceを選択し、pluginを入れていきます
image.png

日本語の言語パックを入れてみます
image.png

インストールが完了したら、再起動しろ言われるので言われるがままに
image.png

image.png

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

image.png

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

image.png

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

phpな基本的なプラグインは入ってるみたいです
image.png

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

コードを解析させる

プロジェクトを作成する

image.png

image.png

トークンを生成する画面に行くので、生成する
image.png

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

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: ------------------------------------------------------------------------

上手くいったみたいだ

画面にレポート的なものがでる
image.png

バグを見てみる
image.png

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

ファイル指定してやる

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

image.png

画面が更新された

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

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

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

image.png

PHPをPSR2に
image.png

解析を再実行

Code Smellsに反応あり、どうやら臭うらしい
image.png

エラーが出るようになりました
image.png

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

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

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

さいごに

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

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

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

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

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

22
20
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?