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回以降のビルド後には、プロジェクトトップに重複コードの推移が表示される。