Sonar qubeでちょっと楽しい静的解析

Preview:

Citation preview

SonarQubeでちょっと楽しい?静的解析

@渋谷Java 2015/03/07

金森 政雄

自己紹介

• 認証と決済のシステム

– 社内の他のサービスから利用

• 主にオフショア管理がお仕事

初LT参戦、よろしくお願いします

とりあえず言いたいことは・・・

Why 消費税増税!!??

十数種類の決済種×月額/従量/+α×社内全サイト = デスマしか見えない

ちなみに

IT企業役員

売れっ子若手芸人 ヒラの開発者

まさかの同い年

アジェンダ

• SonarQube概要

• SonarQubeとの出会い

• 機能紹介

• Tips

• まとめ

SonarQube概要

SonarQubeとは

• OSSのソースコード静的解析ツール– 様々な言語の解析をサポート(一部有料plugin)– サイト: http://www.sonarqube.org/

• 以前は「Sonar」と呼ばれていた

• ライセンスは LGPL v3.

• SonarSource社が追加言語のカバーやサポート

SonarQubeデモページhttp://nemo.sonarqube.org/

SonarQubeとの出会い

社内の成長活動:お題「自動化」

理想

テスト自動化やCIって楽しそう!!

社内の成長活動:お題「自動化」

理想

テスト自動化やCIって楽しそう!!

デプロイ自動化もやってみたい!!

社内の成長活動:お題「自動化」

理想

テスト自動化やCIって楽しそう!!

デプロイ自動化もやってみたい!!

最近流行りのツールもいろいろ試そう!!

社内の成長活動:お題「自動化」

理想

テスト自動化やCIって楽しそう!!

デプロイ自動化もやってみたい!!

最近流行りのツールもいろいろ試そう!!

現実

コストダウン最優先

現実

コストダウン最優先

部門の壁

『デプロイや構成管理は運用部なので手出し無用』

社内の成長活動:お題「自動化」

理想

デプロイ自動化もやってみたい!!

最近流行りのツールもいろいろ試そう!!

諸々あって静的解析担当に

本音:

「えー、今更静的解析?」

諸々あって静的解析担当に

本音:

「えー、今更静的解析?」

というわけにもいかないので・・・

静的解析のイメージ@Java

• Checkstyle– 開発中は便利– ルールのカスタマイズが面倒(設定、ルール追加)

• FindBugs– バグ本当に見つかります・・・?– checkstyleと一緒に入れとくだけ入れておく

• Jenkins– Pluginで解析・レポートが見れる

静的解析のイメージ@Java

• Checkstyle– 開発中は便利– ルールのカスタマイズが面倒(設定、ルール追加)

• FindBugs– バグ本当に見つかります・・・?– checkstyleと一緒に入れとくだけ入れておく

• Jenkins– Pluginで解析・レポートが見れる

もうやってるんですけど・・・

増える要求

増える要求

難易度の判定もできたらいいな

増える要求

難易度の判定もできたらいいな

レガシーなコードの見積もりを出したい

増える要求

難易度の判定もできたらいいな

レガシーなコードの見積もりを出したい

チーム毎の品質を

比較したい

増える要求

難易度の判定もできたらいいな

レガシーなコードの見積もりを出したい

チーム毎の品質を

比較したい

リファクタリングポイントの特定

増える要求

難易度の判定もできたらいいな

レガシーなコードの見積もりを出したい

チーム毎の品質を

比較したい

リファクタリングポイントの特定

SonarQube発見!!

• 多機能:難易度判定などにも使えそう

• pluginの開発で拡張もできる!!

• これならやる気出そう!!

SonarQube機能紹介

ソースコード解析の流れ

ソースコード

DB

ソースコード

DB

Analyzerソースコード

DB

Analyzer

解析ソースコード

DB

Analyzer

解析ソースコード

格納

DB

Analyzer

CIツール

解析 解析ソースコード

格納

DB

Analyzer

CIツール

開発者

解析 解析

参照

ソースコード

格納

SonarQube Runner

• SonarQube推奨のAnalyzer– SonarQubeのサイトからダウンロード

• 言語問わず解析に利用できる– 前提:言語に応じたpluginをインストールする

– 設定ファイルで解析する言語を指定

• 設定ファイルを配置しそこでコマンドを実行

– 設定ファイル:「sonar-project.properties」

– コマンド:「sonar-runner」※パス通すの忘れない

sonar-project.properties

#Required metadatasonar.projectKey=samplesonar.projectName=samplesonar.projectVersion=1.0

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

# Languagesonar.language=java

# Encoding of the source filessonar.sourceEncoding=UTF-8

解析結果の確認

コード行数

重複率の割合

サイクロマチック複雑度

SQALE Rating

技術的負債

LOC:コード行数

• コードの行数を計測

– コメントは抜いてくれる

• ファイル数、クラス数、アクセサの数も測定

Duplications:コードの重複率

• ソースコードの重複率

Complexity:複雑度

• サイクロマチック複雑度– デフォルトを1として分岐ごとに+1

– プロジェクトの合計、関数/クラスファイルの平均

• 1関数あたり15を超え始めると注意

Technical Debt:技術的負債

• 技術的課題を負債にたとえる

–単位は修正にかかる工数

–工数は設定で変更できる

SQALE Rating

• コード全体に占める技術的負債の割合

– コード全体はLoC×30min(デフォルト)

• A~Eで判定

– Aは10%以下、Eは100%以上

問題のあるところにドリルダウン

※SonarQubeドキュメントから拝借

dashboardのカスタマイズ

• widgetを組み合わせてdashboardを作れる

Time Machine

• 測定値の推移が見れるdashboard

Tips(というより起こったこと)

①メモリ不足連発

• ハードウェア要件( http://docs.sonarqube.org/display/SONAR/Requirements )

– SonarQubeは最低1GBのメモリが必要

–ディスクI/Oも高速である必要がある

• 試しに仮想マシンで動かしてエラー連発

(当たり前ですが)ハードウェア要件ちゃんと確認する

②文字コードが統一されていない

• SonarQube Runnerの設定で文字コード指定

• 設定に反する文字コードのソースがあるとエラー

文字コードが統一されてないと解析すらしてもらえない

③指標は組み合わせて見る

• 社内で悪名高いレガシーコードを分析

– 皆の期待:「品質めちゃくちゃ悪いはず」

③指標は組み合わせて見る

• 社内で悪名高いレガシーコードを分析

– 皆の期待:「品質めちゃくちゃ悪いはず」

⇒SQALE Rating→「A」

③指標は組み合わせて見る

• 社内で悪名高いレガシーコードを分析

– 皆の期待:「品質めちゃくちゃ悪いはず」

⇒SQALE Rating→「A」

③指標は組み合わせて見る

• 原因はソースコードの重複率

– 重複率:68.2%⇒半分以上要らないコード– ちゃんと動くところがコピーされるので規模に対して負債は膨らまなかった?

1つの指標だけ見ても判断できない。

組み合わせてまずいところを見つけていく

まとめ

「見える化」って大事

• 「見られている意識」が品質の改善に

–自然とソースレビュー/リファクタリング提案

–他と比較されるので成果がわかりやすい

• 上司受けがよい

–定量化された指標

おまけ

• ローカルで試せる環境作成用のplaybookhttps://github.com/G-F/sonar-playbook

• Vagrantと ansibleで自動的に下記が入ります– SonarQube

– mysql

– Jenkins

• メモリ注意!!(デフォルトで2GB使います)

最後に

• この人に少しでも追いつきたいので英語の勉強がてらSonarQubeのドキュメント和訳してます

• 少しずつ公開していくので不備などあればどんどん指摘してください

最後に

• この人に少しでも追いつきたいので英語の勉強がてらSonarQubeのドキュメント和訳してます

• 少しずつ公開していくので不備などあればどんどん指摘してください

以上!!