jenkinsでPHPプロジェクトを使えるようにする方法(windows環境)

誰も見ないけどここで書いとく。

ビルドにはantを使います。phingは使いません。

これ、テスト自動実行以外にも、
文法チェック、
怪しい書き方のコードを注意してくれたり、
ここコピペしただろ!ってところ指摘してくれたり、
コード規約も守れんの?とか、
踏んだり罵ったり、
俺得なことをプラグインでいろいろやってくれる。
さらに、それらレポートのグラフ化までしてくれる。

そこらへん一式を含んだ設定手順なので、開発諸氏は是非実践投入。
一人でも始められる。

■設定手順:http://jenkins-php.org/
上記サイトの説明はLinux向け。
Windows環境でも簡単・・・ってわけでもないが、基本はおんなじ。
適宜GUI画面操作に脳内変換すればいける。
関連する情報が多すぎるので残念ながら全てはここに書ききれない。
かなり端折ってはいるけど、はまるところはおさえた。
ここまでまとめた俺えらい。

ごたくはさておき以下手順。
思考錯誤にあたって、http://stackoverflow.com/は大変に役に立った。

1.jenkinsは面倒なのでインストーラ版で入れておく。

2.antのバイナリを落としておく。http://ant.apache.org/

3.msysgitをインストールしておく。http://code.google.com/p/msysgit/

※windowsコマンドラインでも使えるように設定してインストーラを進める。

4.環境変数の追加を必要に応じて行う。PATHにphpやantとかを追加。

※jenkins側でパスを指定するところがなんぼかある。

5.jenkinsのプラグイン管理で、サイトで示されているプラグインを全部放り込んでおく。

コマンドラインからいれてもいい。必要なjarファイルはhttp://localhost:8080/jnlpJars/jenkins-cli.jar

6.pearコマンドで、サイト手順で示されているchannelから必要なパッケージ群をインストール。

pear installは、同じコマンドを何度か実行したほうがいいかもしれない。
(1回で全部入らないことが結構ある。あとpear clear-cacheとか使うと幸せになれる)

7.jenkins用PHPプロジェクトテンプレートをgitで持ってきて、$JENKINS_HOME/jobsにphp-templateの名前で置く。

8.jenkinsを再始動。

9.jenkinsで新規ジョブを作成する。さきほど作ったphp-templateからジョブを作る。
※jenkinsにワークスペースが空だと言われるがここでは無視。

10.ここから、windows環境での特別対応をする。
/path/to/project/直下にhttp://jenkins-php.org/download/build.xmlを置いておく。
build.xml内に以下を追記。

<condition property="script-suffix" value=".bat" else="">
  <os family=windows></os>
</condition>
<condition property="dev_null" value=nul else="/dev/null">
  <os family=windows></os>
</condition>


上から順にそれぞれ、

※windowsだったときに実行コマンド拡張子を.batにするため。

※windowsには/dev/nullがないのでwindowsのnulというデバイス(linuxの/dev/nullと同等)を使うため。

続いて、

<exec executable=hoge>

という要素を全て

<exec executable="hoge${script-suffix}">

のように修正する。

"/dev/null"

という記述を全て
"${dev_null}"

に書き換える。

※分岐させないで、hoge.batとかnulって直接書いてもいい。

build.xml内のphpcsとphpcs-ciのargsの値を、

--standard=Zend
にする。
※Zendコーディング規約でチェックするということ。

以上でbuild.xml編集は終わり。

次、phpmd.xmlを作成して、/path/to/project/build/phpmd.xmlとして保存する。
内容は以下。

<phpmd failonerror=off failonruleviolation=off>
  <ruleset>unusedcode</ruleset>
  <ruleset>codesize</ruleset>
  <ruleset>design</ruleset>
  <ruleset>naming</ruleset>
 </phpmd>

11.次にjenkinsがgitリポジトリからソースをもってくるようにするため、ソース一式をリポジトリに入れる。
とりあえずgithubにリポジトリを作る。http://github.com/参照。

12.ソース一式をgit add & commit & push。
13.jenkins画面で今作ってソースをpushしたgitリポジトリを指定してやる。
14.ここまできてようやっとjenkinsから「ビルド実行」できる。

長い戦いだった。
これで各種レポートを見ることができる。

※注意点1
http://jenkins-php.org/download/build.xmlを使ってそのまま試す場合。
ソースとなるプロジェクトは、以下のディレクトリを含んでいる必要がある。
/path/to/workspace/src ※解析対象となるPHPソース
/path/to/workspace/tests ※test用PHPソース
上記以外の構成にしたい場合は、build.xmlを修正する。

※注意点2
対象ディレクトリ配下に、巨大な外部ライブラリなどがあるとlintやphpcsで鬼のように時間がかかる。
そういう更新しないものは対象から外してしまうこともできる。
これは、build.xml内で、内のfieldsetタグの記述を以下のようにすればいい。

   <fileset dir="${basedir}/src">
    <include name="**/*.php" />
    <exclude name="library/Zend/**/*.php" />
    <modified></modified>
   </fileset>

こうすることでこれらのソースがlint対象から外される。

lint以外でも基本的には、以下のようなargタグを仕込めば除外設定ができる。

<arg value="--ignore=${basedir}/apps/library/Zend"></arg>

または、

<arg value="--exclude=${basedir}/apps/library/Zend"></arg>

あるいは、

<arg value="--exclude ${basedir}/apps/library/Zend"></arg>

※除外設定は、実行するコマンドによって方法が微妙に異なる。
うまくいかないときは該当コマンドのソースを読んで引数の形式を調べると幸せになれる。
※パス文字列の解釈がうまくいかないことがある。
そういうときはとかタグでまとめて書いてしまうとうまくいくかもしれない。
※複数ディレクトリを指定するときは,(カンマ)で区切る。

知ってる人は結構前から知ってて実践してるぽく、いまさらな感じもあるかもだけど、使ってない人は是非実践投入を。
※これを入れたからといって、プロジェクトが火を噴かないわけではないし、品質が無条件に向上するわけでも、残業が無くなるわけでもない。
※使うならプロジェクト開始時から使う。あとから・・・とか考えない。
※実践は「自己責任で」&&「計画的に」。