FuelPHPの継続的インテグレーション環境をVagrantとJenkinsを使って構築する

今日は、FuelPHPのプロジェクトのためのJenkinsサーバを構築してみます。

この設定で完璧というわけではないですが、いろいろなものが一通り動くレベルにはなってます。

FuelPHPプロジェクトを作成する

FuelPHPのプロジェクトとして、ここでは、『はじめてのフレームワークとしてのFuelPHP 第2版(改訂版)』のコンタクトフォームを使います。

はじめてのフレームワークとしてのFuelPHP第2版(3) 実践編 はじめてのフレームワークとしてのFuelPHP第2版(2) 入門編 はじめてのフレームワークとしてのFuelPHP第2版(1) 環境構築編

develop-2ブランチをgit cloneします。

$ git clone --depth=5 -b develop-2 https://github.com/kenjis/fuelphp1st-2nd-contact-form.git

以下は、プロジェクトがGitで管理されていることを前提としています。

Vagrantを使いサーバを構築する

Vagrant CentOS6 PHP Development Environment(vagrant-centos6-php)を使います。

FuelPHPプロジェクトのトップフォルダでgit cloneします。

$ cd fuelphp1st-2nd-contact-form
$ git clone -b develop https://github.com/kenjis/vagrant-centos6-php.git

vagrant-centos6-php/Vagrantfileを変更し、Jenkins、FuelPHPを使うようにします。

--- a/Vagrantfile
+++ b/Vagrantfile
@@ -23,7 +23,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
   # mailcatcher web
   config.vm.network :forwarded_port, guest: 1080, host: 1080
   # (optional) jenkins
-  #config.vm.network :forwarded_port, guest: 8080, host: 8080
+  config.vm.network :forwarded_port, guest: 8080, host: 8080

   # Create a private network, which allows host-only access to the machine
   # using a specific IP.
@@ -91,14 +91,14 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
      #chef.add_recipe "mongodb"
      #chef.add_recipe "redis"
      #chef.add_recipe "elasticsearch"
-     #chef.add_recipe "jenkins"
+     chef.add_recipe "jenkins"

      chef.add_recipe "phpunit"
      chef.add_recipe "php-project"

      # (optional) Framework of your choice
      #chef.add_recipe "codeigniter"
-     #chef.add_recipe "fuelphp"
+     chef.add_recipe "fuelphp"
      #chef.add_recipe "phalcon"

      # (optional) Update all yum packages

仮想マシンを構築します。

$ cd vagrant-centos6-php
$ vagrant up

これで、PHP開発環境を兼ねたJenkinsサーバが構築されました。

▼Jenkinsのダッシュボード Jenkinsのダッシュボード

Webアプリケーションの設定をする

仮想マシンにSSHして、Webアプリケーションの設定をします。

$ vagrant ssh

ホストOSでのfuelphp1st-2nd-contact-formフォルダが、仮想マシン内では~/fuelphp(実体は/mnt/project)になっています。

composer installし、MySQLにrootでログインします。

[vagrant@localhost ~]$ cd fuelphp
[vagrant@localhost fuelphp]$ php composer.phar self-update
[vagrant@localhost fuelphp]$ php composer.phar install
[vagrant@localhost fuelphp]$ mysql -u root -proot

データベースとユーザを作成します。

mysql> CREATE DATABASE `fuel_dev` DEFAULT CHARACTER SET utf8;
mysql> CREATE DATABASE `fuel_test` DEFAULT CHARACTER SET utf8;
mysql> GRANT ALL PRIVILEGES ON fuel_dev.* TO username@localhost IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON fuel_test.* TO username@localhost;
mysql> exit

マイグレーションでテーブルを作成します。

[vagrant@localhost fuelphp]$ oil refine migrate:current
[vagrant@localhost fuelphp]$ FUEL_ENV=test oil refine migrate:current
[vagrant@localhost fuelphp]$ oil refine migrate:current --packages=auth
[vagrant@localhost fuelphp]$ FUEL_ENV=test oil refine migrate:current --packages=auth

Jenkinsでのジョブを作成する

FuelPHPプロジェクト用のジョブを作成します。

http://localhost:8080/にアクセスし、左のメニューから「新規ジョブ作成」をクリックします。

「ジョブ名」を「contact-form」とし、「既存ジョブのコピー」を選択し「コピー元」に「fuelphp-template」を入力し、「OK」を押します。

新規ジョブ作成

「fuelphp-template」はvagrant-centos6-phpに用意されているFuelPHP用のひな形です。

Jenkinsのジョブを設定する

プロジェクト「contact-form」の「設定」をクリックします。

まず、「ビルド無効化」のチェックを外します。

ビルド無効化のチェックボックス

「ソースコード管理」の「Git」の「Branches to build」を「*/develop-2」に変更します。ビルドに使用するブランチの設定です。

ソースコード管理の設定

設定が完了したら、下の「適用」ボタンを押します。

ビルドを実行する

プロジェクト「contact-form」の「ビルド実行」をクリックすると、ビルドが実行されます。

ビルド実行

▼ビルド中のコンソール出力 コンソール出力

たまに、PHPのメモリ不足でビルドが失敗することがあります。もう一度ビルドを実行するとたぶん成功します。

うまくいかない場合は、PHPのメモリ割当を増やしてください。

▼プロジェクトcontact-form プロジェクトcontact-form

Gitにコミットしたら自動的にビルドを実行する

.git/hooks/post-commitファイルを作成します。

#!/bin/sh

curl -s http://localhost:8080/job/contact-form/build?token=triggerString
echo "run Jenkins build."

triggerStringは認証トークンですが、今は設定されていないので必要(関係)ありません。

「Jenkinsの管理」→「グローバルセキュリティの設定」で「セキュリティを有効化」すると、ジョブの設定の「ビルド・トリガ」の選択肢に「リモートからビルド」が追加され、「認証トークン」を設定できるようになります。

フックファイルに実行権限を設定します。

$ chmod +x .git/hooks/post-commit

これで、Gitリポジトリにコミットすると、ビルドが実行されるようになります。

push時にビルドを実行したい場合は、.git/hooks/post-updateを作成します。

関連

参考

Date: 2015/01/30

Tags: fuelphp, jenkins, vagrant, database, continuous-integration