jenkinsを使って継続的インテグレーションを行なっている。
数年前はCruiseControl .NETを使っていたのだけど、hudsonを試したときユーザフレンドリーさに打たれて乗り換えた)

以前からmakeなどで1手順ビルドできる仕組みを作ることにはこだわりがあった。
たけど、単にビルドの1手順化だけでなく、
  •  複数の環境でビルドしたものを統合(CIサーバに集約)
  •  リポジトリのコミットとビルドを結びつけ(さらにITSのチケットに結びつく)
  •  複数の環境で自動テスト実行、その結果とビルドの結びつけ
  •  ビルドのログやテストのログなど記録をとる(確認したいときにすぐ辿れる)
継続的インテグレーション入門 開発プロセスを自動化する47の作法
ということを手間なく繰り返し可能とする仕組みには大きな意味があると思う。

SCM、自動テスト、ITSそれぞれ単独でも役立つけど、
ビルドとこれらを結びつけられるCIの存在は大きい。


で、そのビルドと結びついた記録を取りたいものの1つがコードメトリクス。
気にしている指標はいくつかあるけど、コードクローンについて。

コードクローンの検出にCPD(PMD)を使っている。
CPDのレポートxmlをjenkinsのDRY Pluginに食わせるだけ。ビルドごとの静的解析の結果をとりまとめてくれるプラグインでトレンドを見ることができる。
正直に言えばjenkinsのビュー内でコードクローン部分そのものを見るのはあまり意味が無いというかかえって見づらいと思っている。eclipseにPMDプラグインをインストールしてクローン部分にアクセスする方が便利。
あくまでjenkins上では時系列(ビルド)でコードクローンの増減を概観したい。


ここの環境ではjenkinsのmasterをlinux上で動かしている。
CPDの実行はWindowsスレーブ上で行なっている。
入力はSJIS(MS932)でエンコードされたjavaソース。
jenkinsのslave配下でjavaモジュールのビルドをantで行う。同様にantでCPDのレポートを作成している。

PMDのlib下jarをCLASSPATHに指定してantタスクを定義
    <path id="cp.cpd">
        <fileset dir="${pmd.lib}">
            <include name="*.jar"/>
        </fileset>
    </path>

    <taskdef name="cpd" classpathref="cp.cpd" classname="net.sourceforge.pmd.cpd.CPDTask" />

cpdタスクを実行
    
<cpd encoding="Windows-31J" minimumTokenCount="100" format="xml" language="java" outputFile="${reports.cpd}/cpd.xml"> <fileset dir="${src.dir}"> <include name="**/*.java"/> </fileset> </cpd>

で、後はjenkinsのワークスペースに出力されたxmlのpathをDry Pluginの入力に設定するだけ。


当初、cpdタスクの入力エンコーディングを"MS932"にしていた。出力XMLのxml宣言にあるencodingも"MS932"になるのだけどこのままDry Pluginに読み込ませようとするとエラーになってしまう。
Dry Pluginのソースをgithubからcloneして、自動テストの入力xmlのencodingをMS932に書き換えて実行したらスタックトレースに
「Invalid encoding name "MS932".」と出ていた。
org.apache.xerces.*が使われるから?


環境:

Windows 7 x64
 JDK6 u26 x86
 ant-1.8.2
CentOS 5.6 x64
 JDK u26 x64
 ant-1.8.1