FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

開発合宿に行ってきた@日光

こんにちは。三竹です。

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

簡単に説明すると以下の通り。
f:id:taketor:20150722145041p:plain


見極めたかったことは、
1)自動化すること
どこまでできるのか?
2)テストすること
どこまで自動化できるのか、できるとしたら、どこまでやるべきなのか、を見極めること
です。
では、やってきたことを纏めましょうー。
1)環境
使ってみたのは、以下の通りです。
・Jenkins
・Nginx
・Phing(デプロイツール/Antみたいなもの)
PHPUnit
Selenium
・コードインスペクション等(PHPCS/PHPMD)
CakePHP

2)インストール
最初は各種インストール。話が長くなるので、前回のエントリーを参照。
ここは割愛します。

3)Jenkinsの設定
Jenkinsの設定内容は以下の通り。

まずは、ソースの取得。Gitから取得してます。※sshkeyをGit側に登録することにつまづきました…
f:id:taketor:20150722145120p:plain

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

今回は、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>


詳細はこちらまで。英語ですがこのスライドは理解しやすかったです。

最後に、デプロイ後の処理です。デプロイ後、どのような処理を行うかを纏めている場所です。色々と指定ができます。
f:id:taketor:20150722145221p:plain

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

そして、レポーティング。処理実行後の集計結果です。
f:id:taketor:20150722145341p:plain

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

はい。ここまで。あっという間に終わってしまった感じでした。
想像以上に環境構築と、デプロイに時間がかかってしまったため、使った結果、どうすべきかを判断する所までは到達できず。
少し消化不良気味。

さて、私は開発というか技術のみの合宿は初めてでした。時間を忘れるくらい集中できたと思います。
場所を変えて集中するってのもいいなー、と感じました。

お互いにやってきたことを発表することで、技術習得への刺激にもなったと思います。
私は、他の人が発表したvagrant + chef に興味が出てきたので、早速取組中です。これ、便利です。ほんと。