January 5, 2013

FuelPHPとGitLabとJenkinsで継続的インテグレーションする雛形を考えてみた

2013/01/06 GitHubに最新のメモを追加しました。
https://github.com/mp-php/fuel-myapp/blob/master/jenkins.md

--

2013/01/05 必要なJenkinsプラグインと必要なPHPモジュール等を追記しました。
2013/01/05 Phing用のテンプレート(コビー用)ジョブについて追記しました。

--

これまで、Jenkins + Phing + FuelPHP + αで、以下を確認しました。

JenkinsとPhingとPHPUnitでFuelPHPのHTMLカバレッジレポートを作成する
http://madroom-project.blogspot.jp/2013/01/jenkinsphingphpunitfuelphphtml.html

JenkinsとPhingとPHPUnitでFuelPHPのテスト統計を作成する
http://madroom-project.blogspot.jp/2013/01/jenkinsphingphpunitfuelphp.html

JenkinsとPhingとphpDocumentor 2でFuelPHPのPHPDocを作成する
http://madroom-project.blogspot.jp/2013/01/jenkinsphingphpdocumentor-2fuelphpphpdoc.html

JenkinsとPhingとPHPMDでFuelPHPのPMDレポートを作成する
http://madroom-project.blogspot.jp/2013/01/jenkinsphingphpmdfuelphppmd.html

JenkinsとPhingとPHPCPDでFuelPHPのCPDレポートを作成する
http://madroom-project.blogspot.jp/2013/01/jenkinsphingphpcpdfuelphpcpd.html


上記を、以下の方法で全自動化してみます。(とりあえず、DL直後のFuelPHPでやってみます。)とは言っても、各手順は上記の通りなので、この記事は、主に、後述するbuild.xmlに対する設定のメモになります。(build.xmlは、上記のURLの内容から修正されています。)

Gitoliteに触れずにGitLabのhookからJenkins側でビルドする
http://madroom-project.blogspot.jp/2013/01/gitolitegitlabhookjenkins.html


尚、以下のように、Jenkins側で権限設定を行なっていても特に問題有りませんでした。

Jenkinsの権限設定メモ
http://madroom-project.blogspot.jp/2013/01/jenkins_5.html

--

以下、手順等です。


JenkinsとGitLabは同一サーバ上で、以下のようにアクセスするイメージです。
* http://example.com/jenkins/
* http://example.com/gitlab/


必要なJenkinsプラグインは、以下になります。
* HTML Publisher plugin
PHPUnitのHTMLカバレッジレポートとPHPDoc用
* xUnit Plugin
PHPUnitのテスト統計用
* PMD Plugin
PHPMDのPMDレポート用
* DRY Plugin
PHPCPDのCPDレポート用


必要なPHPモジュール等は、以下になります。
* PHPUnit
http://madroom-project.blogspot.jp/2013/01/ubuntuphpunit.html
* Xdebug
http://madroom-project.blogspot.jp/2013/01/ubuntuxdebug.html
* Phing
http://madroom-project.blogspot.jp/2013/01/ubuntuphing.html
* phpDocumentor 2とGraphViz
http://madroom-project.blogspot.jp/2012/12/phpdocumentor-2macwin.html
* PHPMDとPHPCPD
PHPUnitとPhingを-a(--alldeps)オプション付きでインストールしたら入っていました。


この記事で使用するbuild.xmlとphpunit.xmlは、以下にUPしてあります。
* https://github.com/mp-php/fuel-myapp/blob/master/build.xml
* https://github.com/mp-php/fuel-myapp/blob/master/phpunit.xml
一応、2013/01/05現在の内容を貼っておきます。
-- build.xml --
<?xml version="1.0" encoding="utf-8"?>
<project name="FuelPHP Project" basedir="." default="all">

    <property name="phing_dir_name" value="phing" />
    <property name="phpunit_dir_name" value="${phing_dir_name}/phpunit" />
    <property name="phpdoc_dir_name" value="${phing_dir_name}/phpdoc" />
    <property name="phpmd_dir_name" value="${phing_dir_name}/phpmd" />
    <property name="phpcpd_dir_name" value="${phing_dir_name}/phpcpd" />

    <target name="init">
        <delete dir="${phing_dir_name}" includeemptydirs="true" />
        <mkdir dir="${phing_dir_name}" />
    </target>

    <target name="phpunit">
        <mkdir dir="${phpunit_dir_name}" />
        <exec dir="." command="
            phpunit
            -c fuel/app/phpunit.xml
            --coverage-html ${phpunit_dir_name}/coverage/html
            --log-junit ${phpunit_dir_name}/junit.xml
        "/>
    </target>

    <target name="phpdoc">
        <mkdir dir="${phpdoc_dir_name}" />
        <exec dir="." command="
            phpdoc
            -d fuel/app/
            -t ${phpdoc_dir_name}/
        "/>
    </target>

    <target name="phpmd">
        <mkdir dir="${phpmd_dir_name}" />
        <exec dir="." command="
            phpmd
            fuel/app/
            xml
            codesize,design,naming,unusedcode
            --reportfile ${phpmd_dir_name}/pmd.xml
        "/>
    </target>

    <target name="phpcpd">
        <mkdir dir="${phpcpd_dir_name}" />
        <exec dir="." command="
            phpcpd
            --log-pmd ${phpcpd_dir_name}/cpd.xml
            fuel/app/
        "/>
    </target>

    <target name="all" depends="init,phpunit,phpdoc,phpmd,phpcpd" />

</project>
-- phpunit.xml --
<?xml version="1.0" encoding="UTF-8"?>
<phpunit colors="true" stopOnFailure="false" bootstrap="../core/bootstrap_phpunit.php">

    <php>
        <server name="doc_root" value="../../"/>
        <server name="app_path" value="fuel/app"/>
        <server name="core_path" value="fuel/core"/>
        <server name="package_path" value="fuel/packages"/>
    </php>

    <testsuites>
        <testsuite name="core">
            <directory suffix=".php">../core/tests</directory>
        </testsuite>
        <testsuite name="packages">
            <directory suffix=".php">../packages/*/tests</directory>
        </testsuite>
        <testsuite name="app">
            <directory suffix=".php">../app/tests</directory>
        </testsuite>
    </testsuites>

    <filter>
        <blacklist>
            <directory suffix=".php">../core</directory>
            <directory suffix=".php">../packages</directory>
            <directory suffix=".php">../app/vendor</directory>
        </blacklist>
    </filter>

</phpunit>

(1)
http://www.fuelphp.com/ からzipをDLします。
解凍したディレクトリ(以下、"ルート")のfuelディレクトリ、publicディレクトリ、oilファイルのみを残して、他を削除します。
ルートにbuild.xmlを配置します。
fuel/app/にphpunit.xmlを配置します。

(2)
GitLabの任意なグループ(仮に"xxx"とします。)にプロジェクト(仮に"FuelPHP"とします。)を作成して、(1)一式をpushします。
また、このプロジェクトには http://madroom-project.blogspot.jp/2013/01/gitolitegitlabhookjenkins.html のように、jenkins用ユーザをReporter以上で登録しておきます。
hookの設定も済ませておきます。以下を入力します。
http://example.com/jenkins/git/notifyCommit?url=git@example.com:xxx/fuelphp.git

(3)
Jenkinsのシステム設定で"Git plugin"の"Global Config user.name Value"と"Global Config user.email Value"を入力します。
Jenkinsで"Build a free-style software project"な新規Jobを作成します。
"Source Code Management"は"Git"を選びます。
レポジトリのURLは"git@example.com:xxx/fuelphp.git"になります。
"Repository browser"は"gitlab"を選択して、URLは"http://example.com/gitlab/xxx/fuelphp/"になります。
"Repository browser"の右側辺りの"Advanced..."で"Skip internal tag"にチェックを入れます。
"Build Triggers"の"Poll SCM"にチェックを入れます。
"Build"に"Invoke Phing targets"を追加して、"Targets"を"all"とします。

Post-build Actionsに以下を追加します。

▼Publish PMD analysis results
"PMD results"は"phing/phpmd/pmd.xml"です。

▼Publish duplicate code analysis results
"Duplicate code results"は"phing/phpcpd/cpd.xml"です。

▼Publish HTML reports(PHPUnit用)
"HTML directory to archive"はphing/phpunit/coverage/html"です。
"Index page[s]"はindex.html"です。
"Report title"は"Coverage"です。(ここは何でも良いです。)

▼Publish HTML reports(PHPDoc用)
"HTML directory to archive"はphing/phpdoc"です。
"Index page[s]"はindex.html"です。
"Report title"は"PHPDoc"です。(ここは何でも良いです。)

▼Publish xUnit test result report - PHPUnit-3.x (default)
"Pattern"は"phing/phpunit/junit.xml"です。

"Save"して"Build Now"します。1度では右側にTrendが表示されないようなので、2度行います。

"Coverage"、"PHPDoc"、"PMD Trend"、"Duplicate Code Trend"、"Test Result Trend"が表示されたことを確認します。

(4)
適当に何らかの修正を行い、GitLabにPushして、ビルドが走る事を確認します。


P.S.
長かった。。。ところでJenkinsのJob設定は雛形を作れないのかなー。

--

上記の(3)を毎回行うのは面倒そうなので、コピー用のジョブを作りました。差分のみ記述します。

1. Project name: PhingTemplate
2. Disable Build: チェック
3. GitのRepository URL: 適当なURL
4. Repository browser: 適当なURL
その他の設定は、上記の(3)と同様です。

コピー後は、上記の2/3/4を修正するのみです。

最後に、タイトルには"FuelPHP"とありますが、FuelPHPに依存しているのはbuild.xml(と、build.xmlで指定しているphpunit.xml)のみで、他はPhing周りの話になります。なので、build.xmlを差し替えるだけで、他のPHPプロジェクトでも使えるかなと。

2013/01/06 続き書きました。

FuelPHPとGitLabとJenkinsで継続的インテグレーションする雛形を考えてみた 2
http://madroom-project.blogspot.jp/2013/01/fuelphpgitlabjenkins-2.html

No comments:

Post a Comment