PHPCPDとjenkinsを利用して、冗長化したコードを検出してみる

PHPCPD(PHP Copy Paste Detector)で冗長化したコードを検出してみる

1.PHPCPDの追加

$ sudo pear install phpunit/phpcpd

2.コマンドラインで利用してみる

$ phpcpd --log-pmd cpd.xml --suffixes php /path/to/app/

成功するとcpd.xmlが生成される

3.Jenkins側にプラグインをインストール

プラグインマネージャーから「DRY Plugin」をインストールする

4.ビルド用のファイルを用意する

前回用意したbuildファイルを以下のように修正して利用してみる。
/path/to/svn/projectname/trunk/build.xml

<?xml version="1.0" encoding="utf-8" ?>
<project name= "BuildTest" basedir= "." default= "main" >

    <target name="main" depends= "init,phpcs,phpmd,phpcpd" ></target>

    <!-- init -->
    <target name="init" >
        <delete dir= "./reports" includeemptydirs= "true" />
        <mkdir dir= "./reports" />
    </target>

    <!-- checksytle -->
    <target name="phpcs" description= "Generate phpcs.xml using PHP_CodeSniffer" >
        <exec executable= "phpcs" output= "${basedir}/reports/phpcs.xml" >
        <arg line= "
            --report=checkstyle
            --standard=CakePHP
            --extensions=php
            /path/to/app" />
        </exec>
    </target>

    <!-- PHPMD -->
    <target name="phpmd" >
         <phpmd rulesets= "codesize,unusedcode,design,naming" >
             <fileset dir= "/path/to/app/" >
                 <include name= "**/*.php" />
                 <exclude name= "**/*Test.php" />
             </fileset>
             <formatter type= "xml" outfile= "reports/pmd.xml" />
         </phpmd>
    </target>

    <!-- PHPCPD -->
    <target name="phpcpd" >
         <phpcpd>
              <fileset dir= "/path/to/app/" >
                  <include name= "**/*.php" />
                  <exclude name= "**/*Test.php" />
              </fileset>
              <formatter type= "pmd" outfile= "reports/cpd.xml" />
         </phpcpd>
    </target>
</project>

5.プロジェクトの設定

設定>ビルド後の処理から、重複コード分析の集計にチェックを入れ、集計するファイルにreports/cpd.xmlと記述。 閾値はとりあえずデフォルト(High:20,Normal:25)で。

6.ビルドの実行をする

プロジェクトページから「ビルド実行」を選択
問題なくビルドされていれば、左ナビに「重複コード」へのリンクが表示され、2回以降のビルド後には、プロジェクトトップに重複コードの推移が表示される。