PHPMDとJenkinsでtypoなどによる未定義変数を自動検出

t.sayamaJenkins,PHPMD,typo,コード解析

9月も早いものですね!2013年も終わりそうで寂しいs-24です。
7年ぶりに草野球を欠席してしまいました。皆さんも体調管理に気を付けて下さい。

前回記事 では PHPMD の使い方を簡単にご紹介しましたが、今回は続編ということで PHPMD と Jenkins を組み合わせて typo などによる未定義変数の検出を自動化しちゃいます。設定方法と、普段どう使ってるかを紹介しますね!

目次

  1. プラグインのインストール
  2. プロジェクトの作成と設定
  3. 普段の運用

プラグインのインストール

以下では Jenkins のセットアップ自体は完了している前提で話を進めます。

まず、プラグインマネージャーから以下の 2 つのプラグインをインストールします。「Jenkinsの管理」→「プラグインの管理」をクリックすると、プラグイン管理画面に移りますので、そちらからインストールできます。(アップデートがあれば、アップデートありますって表示が出てくれますよ!)

  • Phing Plugin
  • PMD Plugin

01

 

プロジェクトの作成と設定

さて、それでは新規ジョブを作成します。「新規ジョブ作成」を選択し、ジョブ名の入力とプロジェクトの種類の選択を行い、「OK」をクリックします。今回はジョブ名を Product-PHPMD-UnUsedCodeCheck としてみます。

01

次に設定画面が出てくるので、各項目設定していきます。

  1. 「説明」にプロジェクトの概要を記載します。
  2. 01

  3. 「ソースコード管理システム」でソースコードのリポジトリ置き場を指定します。
  4. 01

  5. 日次で実行する場合は、「ビルド・トリガ」の項目で「定期的に実行」をクリックして、スケジュールに設定を記載します。ここでは早朝 4 時 10 分にセットしています。書式に関しては右側のクエスチョンマークをクリックするとヘルプが出ますのでそちらを参照ください。
  6. 01

  7. 「ビルド」の「ビルド手順の追加▼」をクリックして追加する処理の一覧を表示し、その中から「Phing の呼び出し」を選択します。「使用するPhing」、「ターゲット」については空欄でOKです。
  8. 01

    01

  9. 最後に、ビルド後の処理に PHPMD を追加します。「ビルド後の処理」の「ビルド後の処理の追加▼」をクリックして追加する処理の一覧を表示し、その中から「PMD警告の集計」を選択します。「集計するファイル」については空欄でOKです。
  10. 01

    01

ここまで設定が完了したら「保存」をクリックして設定を保存します。

さて、次はビルドファイルの作成と設置ですが、置き場であるワークスペースを作成する必要があるので、「ビルド実行」をクリックして一度ビルドを実行します。

01

この時点でのビルドは失敗しますが OK です。

01

次はビルドファイルの作成と設置です。こちらは Jenkins を実行しているサーバにログインして作業を行います。

Jenkins のプロジェクト関連ファイルの置き場は /var/lib/jenkins/jobs/ とします。

上記のビルドで /var/lib/jenkins/jobs/<プロジェクト名>/workspace/ というディレクトリが作成されているはずなので、そのディレクトリに以下の内容のファイルを build.xml として設置して下さい。なお、①「project name=」に記載するプロジェクト名、②「fileset dir=」に設定するディレクトリパス、③「include name=」、「exclude name=」に記載するチェック対象プログラム、検査から除外するプログラムについては適宜変更して下さい。

ちなみに今回のルールセットは unusedcode のみにしています。他にも codesize、design、naming なども指定できますが (詳しくは 前回記事 参照) 、今回の目的では unusedcode で十分なので敢えてそれだけにしています。

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

    <target name="main" depends="phpmd"></target>

    <!-- PHPMD -->
    <target name="phpmd" >
         <phpmd rulesets= "unusedcode" >
             <fileset dir= "/var/lib/jenkins/jobs/Product-PHPMD-UnUsedCodeCheck/workspace/include/product/" >
                 <include name= "**/*.php" />
                 <exclude name= "**/*Test.php" />
             </fileset>
             <formatter type= "xml" outfile= "reports/pmd.xml"/>
         </phpmd>
    </target>
</project>

上記の build.xml ではレポートファイルの置き場所を reports ディレクトリとしているため、そのディレクトリを作成しておく必要があります。

$ mkdir /var/lib/jenkins/jobs/Product-PHPMD-UnUsedCodeCheck/workspace/reports/

設定は以上です。では、改めてビルドを実行してみましょう。

01

ビルド履歴にビルドの進捗がゲージで表示されます。このゲージをクリックするとビルド中なら進捗状況が、ビルド後 (失敗) であればどこで止まったかを参照できます。

01

実行後、ビルド履歴のビルド日時をクリックすると以下のように表示されます。これで未使用コードの一覧を参照することができます。リンクを手繰るとどのファイルにどの程度の未使用コードがあるか、実際にコードのどの部分かを追っていくことができます (その画面は後述の「普段の運用」の部分でお見せしますね)。

01

このように 1 度目のビルドでは未使用のコードについて網羅的に検出を行ってくれます。その後のビルドでは、前回ビルドとの差 (新しく出てきたもの、修正されたもの) についての情報も表示してくれます。

01

 

普段の運用

私の場合、1 度目の結果をざっと確認した後の 2 度目以降の確認では新しい警告についてのみ確認を行い、未定義変数などが無いかをチェックしています。今の運用では未使用コードをゼロにすることが目的ではなく、変更が加わった部分に未定義変数など問題があるコードがないかを早期に発見することが目的なので、毎日のチェックの流れは以下のようにしています。

  1. 早朝に Jenkins 側で自動ビルドとレポートの作成 (上記設定で自動化)
  2. 出社後にビルド結果のレポートを確認 (主に新しい警告の有無)
  3. 01

  4. 新しい警告が出ている場合はコードをチェック
    • 上記画面の「XXX 個の新しい警告」をクリックすると、警告が生じたプログラムの一覧が表示されます。
    • 01

    • 更にそのプログラムをクリックすると、実際に未使用コードが検出された場所をハイライト表示してくれます。
    • 01

  5. 未定義変数など問題があるコードを見つけたら開発チームに共有

こんな感じで日々のコードチェックを効率化しています。だいぶいい感じでチェックできてますが、もっと効率が良い方法あれば是非教えて下さい!

参考サイトやオススメ本

参考サイト: PHPMD(PHP Mess Detector)をjenkinsで利用してみる

オススメ本: 「Jenkins実践入門 ~ビルド・テスト・デプロイを自動化する技術」

t.sayamaJenkins,PHPMD,typo,コード解析

Posted by s-24