こんにちは。三竹です。
このエントリーにあるように、先週の8月22日、23日で開発合宿に行ってきました。
場所は日光の民宿/はじめのいっぽ。
貸切で、かつ涼しい、というよりTシャツでは寒いぐらいの環境の中、1泊2日の開発漬けの時間を過ごしてきました。
今回、私が目標にしたことは、Jenkins/継続インテグレーション環境の構築です。
業務で本格的に使ったことがないので、どこまでできるのか、できるとしても、どこまでやるべきか、などが判断んできればと思い、合宿に臨みました。
簡単に説明すると以下の通り。

見極めたかったことは、
1)自動化すること
どこまでできるのか?
2)テストすること
どこまで自動化できるのか、できるとしたら、どこまでやるべきなのか、を見極めること
です。
では、やってきたことを纏めましょうー。
1)環境
使ってみたのは、以下の通りです。
・Jenkins
・Nginx
・Phing(デプロイツール/Antみたいなもの)
・PHPUnit
・Selenium
・コードインスペクション等(PHPCS/PHPMD)
・CakePHP
2)インストール
最初は各種インストール。話が長くなるので、前回のエントリーを参照。
ここは割愛します。
3)Jenkinsの設定
Jenkinsの設定内容は以下の通り。
まずは、ソースの取得。Gitから取得してます。※sshkeyをGit側に登録することにつまづきました…

次に、デプロイ
Jenkisでは、シェル、Ant、Maven等を利用可能です。まあ、やろうと思えば、なんでもできる感じですね。

今回は、Phingを使いました。AntのPHP版とったものなので、xmlに定義を書き、それを読み込んで処理を実行してもらいます。
設定ファイルは以下の通り。初期処理でディレクトリ等々と作り、各種処理を実施していく流れです。
<?xml version="1.0" encoding="UTF-8"?>
<project name="jenkins" default="build">
<!-- Properties -->
<property name="basedir" value="." />
<property name="appdir" value="../app" />
<property name="logdir" value="./logs" />
<!-- Build -->
<target name="build"
depends="clean,prepare,caketest,phpcs,phpcpd,phpmd,phpdoc"/>
<!-- Clean up -->
<target name="clean" description="Cleanup build artifacts">
<delete dir="${logdir}"/>
<delete dir="${basedir}/coverage"/>
<delete dir="${basedir}/phpdoc"/>
</target>
<!-- Prepare -->
<target name="prepare" depends="clean" description="Prepare for build">
<mkdir dir="${logdir}"/>
<mkdir dir="${basedir}/coverage"/>
<mkdir dir="${basedir}/phpdoc"/>
</target>
<!-- CakePHP unit test with PHPUnit -->
<target name="caketest" description="Run CakePHP unit tests with PHPUnit">
<exec dir="${basedir}" executable="${appdir}/Console/cake" output="${logdir}/caketest.log">
<arg line="test" />
<arg line="--configuration=${basedir}/phpunit.xml" />
<arg line="--log-junit=${logdir}/phpunit.xml" />
<arg line="--coverage-html=${basedir}/coverage/" />
<arg line="--coverage-clover=${logdir}/coverage.xml" />
<arg line="app" />
<arg line="AllTests" />
</exec>
</target>
<!-- PHPCodeSniffer -->
<target name="phpcs" description="Find coding standard violations using PHP_CodeSniffer.">
<exec dir="${basedir}" executable="phpcs" output="${logdir}/phpcs.log">
<arg line="--standard=${basedir}/phpcs.xml" />
<arg line="--report=checkstyle" />
<arg line="--report-file=${logdir}/phpcs.xml" />
<arg line="${appdir}" />
</exec>
</target>
<!-- PHPMD -->
<target name="phpmd" description="Perform project mess detection using PHPMD">
<exec dir="${basedir}" executable="phpmd" output="${logdir}/phpmd.log">
<arg line="${appdir}" />
<arg line="xml" />
<arg line="${basedir}/phpmd-rule.xml" />
<arg line="--reportfile ${logdir}/phpmd.xml" />
<arg line="--exclude ${appdir}/Plugin,${appdir}/Config/Schema,${appdir}/Config/Migration" />
<arg line="--suffixes php,cpt" />
</exec>
</target>
<!-- PHPCPD -->
<target name="phpcpd" description="Perform project mess detection using PHPMD">
<exec dir="${basedir}" executable="phpcpd" output="${logdir}/phpcpd.log">
<arg line="--log-pmd ${logdir}/phpcpd.xml" />
<arg line="--exclude Config/Schema" />
<arg line="--exclude Config/Migration" />
<arg line="--exclude Plugin" />
<arg line="--exclude webroot" />
<arg line="--names *.php,*.cpt" />
<arg line="${appdir}" />
</exec>
</target>
<!-- PHPDocumentor -->
<target name="phpdoc" description="Generate Application Documentation using PHPDocumentor2">
<exec dir="${basedir}" executable="phpdoc" output="${logdir}/phpdoc.log">
<arg line="run" />
<arg line="-t ${basedir}/phpdoc" />
<arg line="-d ${appdir}" />
<arg line="-p" />
</exec>
</target>
</project>
詳細はこちらまで。英語ですがこのスライドは理解しやすかったです。
最後に、デプロイ後の処理です。デプロイ後、どのような処理を行うかを纏めている場所です。色々と指定ができます。

今回はレポート集計がメインです。デプロイ時実施した結果ファイルの取り込みを行います。

そして、レポーティング。処理実行後の集計結果です。

例えば、PHPMDについては、こんな感じでエラー内容が纏められます。

はい。ここまで。あっという間に終わってしまった感じでした。
想像以上に環境構築と、デプロイに時間がかかってしまったため、使った結果、どうすべきかを判断する所までは到達できず。
少し消化不良気味。
さて、私は開発というか技術のみの合宿は初めてでした。時間を忘れるくらい集中できたと思います。
場所を変えて集中するってのもいいなー、と感じました。
お互いにやってきたことを発表することで、技術習得への刺激にもなったと思います。
私は、他の人が発表したvagrant + chef に興味が出てきたので、早速取組中です。これ、便利です。ほんと。