Symfony2プロジェクトをGitLabで管理してVagrantで立てたJenkinsでCIする(3)

第3回です。

前回のおさらい
イテレーション A: Symfony2でプロジェクトをはじめる
Symfony2のプロジェクトをGitLabで管理し、PHPUnitを単体で実行できるようになりました。

今回の内容
Phingビルドツールを導入し、PHPUnitをPhingから実行できるようにします。


いまどこ?

  1. イテレーション 0: 準備
    1. タスク 0-1: 必要なソフトウェアをインストールする
    2. タスク 0-2: GitLabのアカウントを作成する
  2. イテレーション A: Symfony2でプロジェクトをはじめる
    1. タスク A-1: Symfony2プロジェクトを作成する
    2. タスク A-2: GitLabでソースコードを管理する
    3. タスク A-3: PHPUnitを導入する
  3. イテレーション B: Phingでプロジェクトをビルドする ←いまココ!
    1. タスク B-1: Phingを導入する
    2. タスク B-2: PhingとPHPUnitを連携する
  4. イテレーション C: JenkinsをVagrantで構築する
    1. タスク C-1: VMを初期化する
    2. タスク C-2: 構築に必要なCookbooksを取得・作成する
    3. タスク C-3: Jenkinsを起動する
  5. イテレーション D: JenkinsでCIする
    1. タスク D-1: Jenkinsにプロジェクトを設定する
    2. タスク D-2: テストレポートを表示できるように設定する
    3. タスク D-3: コードカバレッジレポートを表示できるように設定する
  6. イテレーション E: 各種ツールの導入
    1. タスク E-1 PHPMDを導入する
    2. タスク E-2 PHPCSを導入する


イテレーション B: Phingでプロジェクトをビルドする

Phingってなぁに?

PHing Is Not GNU make; it's a PHP project build system or build tool based on ​Apache Ant.

http://www.phing.info/
タスク B-1: Phingを導入する

  • composerで依存関係を追加
C:\workspace\Symfony2>php composer.phar require phing/phing 2.5.*
composer.json has been updated
Loading composer repositories with package information
(中略)
Installing assets using the hard copy option
Installing assets for Symfony\Bundle\FrameworkBundle into web/bundles/framework
Installing assets for Acme\DemoBundle into web/bundles/acmedemo
Installing assets for Sensio\Bundle\DistributionBundle into web/bundles/sensiodistribution

  • 実行してみる
C:\workspace\Symfony2>bin\phing
Buildfile: build.xml does not exist!

build.xmlがない!」と怒られます。


タスク B-2: PhingとPHPUnitを連携する

プロジェクトのルート(C:\workspace\Symfony2)に「build.xml」を作成します。

Gistでこんな素晴らしいものを発見したので、利用させてもらいます!
Phing build.xml for Symfony2 projects
ただし、phpmdとかphpcsとかphpdocとか、今は必要のないものが含まれているのでPHPUnitに絞ります。
結果、以下のような内容となりました。

<?xml version="1.0" encoding="UTF-8"?>
<project name="Symfony2" basedir="." default="build:main">
    <!-- Properties -->
    <property name="dir.app" value="${project.basedir}/app" />
    <property name="dir.src" value="${project.basedir}/src" />
    <property name="dir.bin" value="${project.basedir}/bin" />
    <property name="dir.build" value="${project.basedir}/build" />
    <property name="dir.reports" value="${dir.build}/logs" />
    <property name="dir.reports.coverage" value="${dir.reports}/coverage" />

    <!-- Filesets -->
    <fileset id="sourcecode" dir="${dir.src}">
        <include name="**/*.php" />
    </fileset>

    <!-- Default target -->
    <target name="build:main"
            depends="build:clean, build:prepare, build:test"
            description="Run all test and build everything" />

    <!-- Test target -->
    <target name="build:test"
            depends="test:unit"
            description="Executes all tests.." />

    <!-- Project build clean -->
    <target name="build:clean" description="Clean up build directories.">
        <echo msg="Cleaning build directories ..." />
        <delete dir="${dir.build}" verbose="true" />
    </target>

    <!-- Project build prepare -->
    <target name="build:prepare" description="Create build directories.">
        <echo msg="Creating build directories ..." />
        <mkdir dir="${dir.build}" />
        <mkdir dir="${dir.reports}" />
        <mkdir dir="${dir.reports.coverage}" />
    </target>

    <!-- Unit tests -->
    <target name="test:unit" description="Executes unit tests.">
        <echo msg="Running unit tests ..." />
        <exec command="${dir.bin}/phpunit
            --log-junit       ${dir.reports}/phpunit.xml
            --coverage-clover ${dir.reports.coverage}/clover.xml
            --coverage-html   ${dir.reports.coverage}/
            -c ${dir.app}"/>
    </target>
</project>

オリジナルのものからの変更点として、${dir.bin}プロパティを定義してphpunitコマンド呼出し時に利用しています、くらいです。

  • 実行してみる。
C:\workspace\Symfony2>bin\phing -logger phing.listener.DefaultLogger
Buildfile: C:\workspace\Symfony2\build.xml

Symfony2 > build:clean:

     [echo] Cleaning build directories ...
   [delete] Directory C:\workspace\Symfony2\build does not exist or is not a directory.

Symfony2 > build:prepare:

     [echo] Creating build directories ...
    [mkdir] Created dir: C:\workspace\Symfony2\build
    [mkdir] Created dir: C:\workspace\Symfony2\build\logs
    [mkdir] Created dir: C:\workspace\Symfony2\build\logs\coverage

Symfony2 > test:unit:

     [echo] Running unit tests ...

Symfony2 > build:test:


Symfony2 > build:main:


BUILD FINISHED

Total time: 1.9367 second

「-logger phing.listener.DefaultLogger」はANSIカラーシーケンスを出力しないようにするためにつけています。(コマンドプロンプトだとシーケンスがそのまま表示されてしまうので)

buildディレクトリ配下にテストの結果、カバレッジレポート等が出力されます。

確認として、HTML形式のカバレッジレポート「build\logs\coverage\index.html」を閲覧してみます。
以下のようになっていればOKです。

f:id:piccagliani:20130520163815p:plain

最後に

  • composer.json
  • composer.lock

がPhingの追加によって変更されています。
そして、

を新たに作成しました。
コミットして、GitLabへプッシュして(ry


以上です。

第4回はイテレーション C: JenkinsをVagrantで構築する