読者です 読者をやめる 読者になる 読者になる

$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

perlのメトリクスをjenkinsで可視化する

perl tech

 最近リファクタリングをしたいと思っているんだけど、なかなか大変で後回しにしてしまう。これはいけないと思って、自分達を納得させるために、perlのメトリクスを出し、それをjenkinsで可視化するというのをやってみた。

perlのメトリクス集計

 まずperlのメトリクス集計はPerl::Metrics::LiteやApp::plmetricsというのを使えば良い。これにより、関数の長さやCyclomatic Complexity(循環的複雑度)が集計できる。

 まずPerl::Metrics::Liteのmeasureperlコマンドを使ってみる。すると以下のようにファイルの長さ、関数数やそれぞれのファイルのメソッドごとの長さ、Cyclomatic Complexityが集計できる。

$ measureperl lib
#======================================#
#           File Metrics               #
#======================================#
.-------------------------------------------------------------.
| path                                | loc | subs | packages |
+-------------------------------------+-----+------+----------+
| lib/PrePAN.pm                       |  38 |    6 |        2 |
| lib/PrePAN/App.pm                   |  51 |    4 |        1 |
| lib/PrePAN/App/Auth.pm              |  97 |    2 |        1 |
....
| lib/PrePAN/Worker/Twitter/PrePAN.pm |  19 |    3 |        1 |
'-------------------------------------+-----+------+----------'
#======================================#
#         Subroutine Metrics           #
#======================================#

Path: lib/PrePAN/Data/Hash/Compact.pm
.-------------------------------------------.
| method          | loc | mccabe_complexity |
+-----------------+-----+-------------------+
| as_serializable |   1 |                 1 |
'-----------------+-----+-------------------'

Path: lib/PrePAN/Twitter.pm
.----------------------------------.
| method | loc | mccabe_complexity |
+--------+-----+-------------------+
| new    |   8 |                 1 |
'--------+-----+-------------------'

Path: lib/PrePAN/Notify.pm
.--------------------------------------------.
| method           | loc | mccabe_complexity |
+------------------+-----+-------------------+
| notify_comment   |  21 |                 2 |
| notify_vote      |  11 |                 1 |
...

メトリクスをjenkinsで可視化する

 上の例で、perlのメトリクスを表示することは出来た。しかしこれでは見づらいし、何より一番最初に書いた、リファクタリングをするための自分への説得材料としてはなかなか難しい。

 そこでPerl::Metrics::Liteのmeasureperl-checkstyleコマンドを使い、メトリクスを集計したものをjenkinsのcheckstyleで表示できるようにしてみる。

jenkinsで読み取り可能なxmlを出力する

 まずmeasureperl-checkstyleコマンドで結果のxmlを出力してみる。この時、メソッドごとの行数の閾値、Cyclomatic Complexityの閾値を設定し、これを上回るとエラーになるようにしておく。すると以下のように出力がでる。

$ measureperl-checkstyle --max_sub_lines 100 --max_sub_mccabe_complexity 10 --directory lib > checkstyle-result.xml
$ cat checkstyle-result.xml
<checkstyle version="5.1">
  ....
  <file name="lib/PrePAN/Twitter/PrePAN.pm">
  </file>
  <file name="lib/PrePAN/App/Module.pm">
    <error line="173" column="1" severity="error" message="'post_review' method cyclomatic complexity is 13" source="com.puppycrawl.tools.checkstyle.checks.metrics.CyclomaticComplexityCheck"/>
  </file>
  ...
</checkstyle>

 上の例だとlib/PrePAN/App/Module.pmのpost_reviewメソッドはCyclomatic Complexityの値が13になっておりエラーが出力される。これでjenkinsに読み取らせるxmlを作成することが出来た。

jenkinsでこのファイルを読み込む

 jenkinsではcheckstyleというpluginを使えばこのファイルを読み込み可視化することが出来る。

 まずjenkinsのプロジェクトを作って、「ビルド」 -> 「シェルの実行」の部分にコマンドを書いておく。

measureperl-checkstyle --max_sub_lines 100 --max_sub_mccabe_complexity 10 --directory lib > checkstyle-result.xml

 checkstyleプラグインを入れていれば、「ビルド後の処理」の部分に「Checkstyle警告の集計」というのが追加されているので、それをチェックしてcheckstyle-result.xmlと入力しておく。

 あとはビルドしておけば、エラー数がグラフ化され、エラーが起こったメソッドやその行数を確認することが出来る。あとはこれを見て、やばそうなところを見つけ、やる気を出して頑張ると良い。

f:id:shiba_yu36:20130803145852p:plain:w300:left
f:id:shiba_yu36:20130803145853p:plain:w300

まとめ

 今回はリファクタリングの機運を高めるために、jenkinsでPerlのメトリクスを表示するということをやってみた。あとはこれを継続的にみながらやっていけば良いですね。