CodeIgniter2 + CIUnit2 + Jenkinsで継続的インテグレーションをやってみた


なんか、色々と意気消沈気味だったので、東京から上海に戻ってくる時にVMの構築を途中まで行っていたJenkinsを少し触ってみることにしました。とりあえず、目的としては、表題にも書いている通り、CodeIgniter2(2.0.2), CIUnit2(カスタム版), Jenkinsを使って、ビルドからテスト、コードチェックまで行える環境を作ることです。

また、今回使用したソースは下記のリポジトリにアップしています。

fukata/ciunit2_and_jenkins – GitHub

PHPによるJenkinsのインストールなどについては、下記のサイトがとても参考になりました。

PHPでTDD&CIワークショップ、Jenkins + PHP の各種プラグインパート資料 – Yamashiro0217の日記
Symfony2でJenkinsを使ってCI « symfonyで開発日記

今回はUbuntu 10.04 Server版を使ったため、Jenkinsはapt版を入れています。インストール方法はここに書かれている通りです。

wget -q -O - https://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo vim /etc/apt/sources.list
> 末尾に追加: deb https://pkg.jenkins-ci.org/debian binary/
sudo apt-get update
sudo apt-get install jenkins

build.xml作成

Jenkinsからプロジェクトをビルドする際に使用するbuild.xmlは上記のサイトでも行われているppwコマンドを利用しました。今回のプロジェクトだと下記のようになりました。

cd ciunit2_and_jenkins
ppw --name ciunit2_and_jenkins --source ./src/application/ --tests ./src/application/tests/ --bootstrap ./src/application/third_party/CIUnit/bootstrap_phpunit.php --phpcs PEAR .

ただ、CIUnitの場合、sourceで指定したディレクトリ内にCIUnitやtestsコードが含まれている為、これらを解析対象から除外したい場合には下記のように、生成されたbuild.xmlを修正します。

--- build.xml	2011-07-27 10:41:01.164477818 +0800
+++ build.xml.new	2011-07-27 10:40:51.814477818 +0800
@@ -49,7 +49,8 @@
    <arg line="${source}
               xml
               codesize,design,naming,unusedcode
-              --reportfile ${basedir}/build/logs/pmd.xml"></arg>
+              --reportfile ${basedir}/build/logs/pmd.xml
+              --exclude third_party/CIUnit/" />
 
 
 
@@ -61,7 +62,7 @@
 
  <target name="phploc" description="Generate phploc.csv">
   <exec executable="phploc">
-   <arg line="--log-csv ${basedir}/build/logs/phploc.csv ${source}"></arg>
+   <arg line="--log-csv ${basedir}/build/logs/phploc.csv --exclude ${source}third_party/CIUnit ${source}"></arg>
   </exec>
  </target>
 
@@ -70,13 +71,14 @@
    <arg line="--report=checkstyle
               --report-file=${basedir}/build/logs/checkstyle.xml
               --standard=PEAR
+              --ignore=tests/,third_party/CIUnit
               ${source}"></arg>
 
 
 
  <target name="phpdoc" description="Generate API documentation using PHPDocumentor">
   <exec executable="phpdoc">
-   <arg line="-d ${source} -t ${basedir}/build/api"></arg>
+   <arg line="-d ${source} -t ${basedir}/build/api -i third_party/CIUnit/"></arg>
   </exec>
  </target>

CodeIgniter用のCodeSniffer

ppwコマンドの–phpcsオプションでコードのスタイルチェックのモジュールを選べます。先ほどのコマンドではPEARを選択(デフォルトでもPEAR)したのですが、PEARのコード規約とCodeIgniterのコード規約がところどころ異なっており、CodeIgniterの規約的には正しいのに間違ってると警告されます。

上記のページを参考にphpcsをインストールした場合、linuxの場合、下記のディレクトリにインストールされていると思います。

/usr/share/php/PHP/CodeSniffer/Standards

初期でインストールされているのは、下記のみです。

phpcs -i
The installed coding standards are PEAR, MySource, PHPCS, Squiz and Zend

インストールされているものを参考にCodeIgniter用のCodeSnifferを作成すれば、コードチェックについても正常に行えるようになります。

で、少し探してみたのですが、CodeIgniter用のCodeSnifferが見つからなかったので、作る必要があるかもしません。とりあえず、先走り気味にリポジトリだけ作成しました。

fukata/codesniffer_codeigniter – GitHub

@yterajimaさんから下記のリポジトリを教えてもらったので、これをforkすることにしました。
thomas-ernest/CodeIgniter-for-PHP_CodeSniffer – GitHub

おまけ:githubのプライベートリポジトリを利用する

jenkinsのgit pluginからgithubのプライベートリポジトリを利用する機会があったので、その時にはまったことについて書いておきます。

はまったのは、gitへ接続する際に利用するssh keyの設定についてです。

apt版jenkinsの場合、jenkinsの実行にはjenkinsユーザが行っているかと思います。そのjenkinsユーザのホームディレクトリが/var/lib/jenkinsに設定されており、/var/lib/jenkins/.sshがあるので、そこに必要な鍵等を入れます。で、次にjenkinsユーザでログインし、下記のコマンドでgithubに一度繋いでおきます。

ssh git@github.com

これで、jenkinsで、githubのプライベートリポジトリに対してgit cloneを正常に行えるようになります。

関連記事