Tagbangers Blog

静的コード解析 Sonar ってなに?

Sonar とは

Sonar は SonarSource社 が開発、運営する静的コード解析ツールです。
正式には Sonar という製品ではなく、SonarQube や SonarCloud などの製品があります。

詳しくは 公式サイト(Products) を参照。

今回は解析結果を分析するための UI である、SonarQube、SonarCloud の使い方を見ていきたいと思います。

いろいろな Sonar

まず、はじめに SonarQubeSonarCloud はほぼ同じです。
自身でインストールして使う SonarQube(Server版)か SonarCloud(Cloud版)かの違いだと思っていて間違いではありません。
ただし、機能制限や新規機能のリリース時期が違ったりしますのでどうしても使いたい機能がある場合は、使えるかどうか確認してください。

機能面以外での迷ったら以下項目を検討するとよいと思います。

SonarQube

  • 自分のタイミングでバージョンアップしたい
  • 組織のセキュリティ要件的にクラウド版は使えない
    • 最近はあまりないかも??
  • AD連携したい

SonarQube は無料でも使用できますが、機能が結構制限されてしまいます。

SonarCloud

  • 無料で色々な機能を使いたい
    • ただし、全世界にソースコードが公開されます
    • 有料版あり(private)
  • バージョンアップのタイミングにはこだわらないので、管理の手間を省きたい

SonarCloud はソースコードが公開されてもいい場合は、無料で全機能使える(はず)です。

また、公式の Docker Image も公開されているので、ローカルでサクッと試してみるのも簡単です!
Docker 版 は SonarQube の 無料版を試すことが可能です。

どうつかう??

おすすめの構成は Git + Pull Request + CI + SonarQube (SonarCloud) の連携です。
解析から結果の連携までを自動化して、ソースコードレビューを円滑にすすめましょう。

  1. 作業/機能単位(好きなように)で ブランチを作成し開発をすすめる
  2. Pull Request を作成
  3. CI で Pull Request の作成をフックして、ビルド。
  4. ビルド環境で、Sonar Scanner を使用してコードを解析
  5. 解析結果を SonarQube (SonarCloud) に連携
  6. SonarQube (SonarCloud) から Pull Request に対して評価(Quality Gate)を連携
  7. 評価が低い(Quality Gate をパスしていない)場合は、Pull Request を却下またはマージ不可にする

評価 / 解析の観点

Reliability

バグが潜んでいないかの解析結果です。NullPointerException でエラー画面とか。。。

Security

脆弱なコードが含まれていないか解析してくれます。パスワードべたがきじゃないですよね??

Maintainability

このコードなにか臭う。`if(size >= 12) ....` 12ってなんだ。

Coverage

テストコードのカバレッジです。高ければ良いわけではありませんが、テストは正義。

Duplications

いらないコードです。設計を見直すタイミング。

Quality Gate

Quality Gate とは SonarQube (SonarCloud) での評価基準です。
解析対象のコードの評価が基準を満たさない場合は、解析結果画面に Failed と赤字で表示され、とても悲しい気持ちになります。
開発者は Quality Gate を通す(Pass)ために、コードの品質を意識せざる得なくなります。

デフォルトでは Sonar way として以下の条件が設定されています。

  • テストカバレッジが80%以上
  • 重複コードは3%以下
  • Maintainability Rating ランクA
  • Reliability Rating ランクA
  • Security Rating ランクA

※ ランクの細かい基準は調べていません。時間があれば調べようと思います。。

さらに細かい設定も可能なのでプロジェクトに応じて設定を調整してより高い品質を目指しましょう。

どう見るか?

開発者、レビューアー

Branch Analysis + Pull Request Decoration で自分のコードだけの評価を知る。

自分の書いたコードがこんな評価だったら、即 Pull Request を取り下げたくなりますね。
「FAILED CONDITIONS」のそれぞれのカードや、「METRICS」の New Bugs、New Code Smells 左側の数値はリンクになっており評価の詳細を見ることができます。
レビューアーの人にレビューしてもらいえるように詳細を確認して、Quality Gate を Pass しましょう。

※ 画面は SonarCloud

Branch Analysis と Pull Request Decoration は SonarQube では有料版でのみ有効な機能ですが、チームで開発においてはとても有効な機能です。
有効というよりも無いと結構な不便さがあります。タグバンガーズではこのためだけに有料版を使っていたりします。

Branch Analysis とは、Pull Request の作業ブランチとマージ対象のターゲットブランチとの差分のみを解析するための機能です。
あるブランチで10行の変更を加えた場合、10行のみが解析され10行全てをテストがカバーしていれば、カバレッジは 100% になります。
ターゲットブランチのカバレッジが 0% であっても、Branch Analysis なら 100 %です。

さらに Pull Request Decoration で Pull Request 画面に解析結果を連携します。

画面は GitHub の Pull Request 画面。

GitHub の Checks には評価の概要が表示されます。

プロジェクト管理者

プロジェクト全体を見る人は以下を見ていくと進捗、品質を見極めるのに役立ちます。

LOC

プロジェクトの行数から、作業進捗、プロジェクト規模を把握。
あくまでも目安ですが、LOC(行数)からプロジェクトのサイズを確認することができます。

Activity 

テストカバレッジ、Bugs などの項目はそれぞれ、 Activity として数値の遷移を折れ線グラフでみることができます。
LOC があまり増えていないのにテストカバレッジが急激に下がっていたり、Bugs が増えていたりするのは危険な信号です。

Mesures

クラス(ファイル)単位の状態をバブルチャートで表示します。

項目によって軸はことなりますが、円は小さいほうがよく、左下に寄っている方が良いとされています。
右上に大きな円がたくさんあるプロジェクトありませんか??


まとめ

静的コード解析を行うことにより、

開発者は、自身のコードの品質を高めることができ、
レビューアー(PR)は 業務ロジックなど Sonar では解析できないような箇所をより重点的にレビューでき、
管理者はプロジェクトの進行、全体の品質をひと目で把握することが可能になります。

Sonar が指摘してくれることって、くだらないことが多かったりします。
でも、それを愚直にまもるだけで、くだらない指摘や、くだらないバグを防げるのです。(くだらない争いも?)

みなさん、是非 SonarQube (SonarCloud) 使ってみたください!