Showing posts with label linux. Show all posts
Showing posts with label linux. Show all posts

October 11, 2014

CentOSでcompass watchをSupervisorで永続化してOS起動時に自動起動する

以下、普通にインストールして設定する手順ですが、Vagrant環境に仕込んでチームで共有する。とかが現実的な使い方かなと思います。

Compassのインストール
$ sudo gem install compass
Supervisorのインストール
$ sudo yum install python-setuptools
$ sudo easy_install supervisor
/etc/supervisord.conf の作成(echo_supervisord_conf の内容に以下を追記)
[program:compass-watch]
command     = compass watch --poll --app-dir /path/to/app-dir/ -c /path/to/config.rb
autostart   = true
autorestart = true
/etc/rc.d/init.d/supervisord の作成
#!/bin/sh
#
# /etc/rc.d/init.d/supervisord
# sudo chkconfig --add supervisord
# sudo chkconfig --level 35 supervisord on
#
# chkconfig: - 64 36
# description: Supervisor Server
# processname: supervisord

. /etc/rc.d/init.d/functions

NAME="supervisord"
COMMAND="/usr/bin/supervisord"
PIDFILE="/var/run/$NAME.pid"
CONFIG="/etc/supervisord.conf"

start()
{
  echo -n $"Starting $NAME: "
  daemon $COMMAND -c $CONFIG --pidfile $PIDFILE
  [ -f $PIDFILE ] && success $"$NAME startup"
  echo
}

stop()
{
  echo -n $"Shutting down $NAME: "
  [ -f $PIDFILE ] && killproc $NAME || success $"$NAME shutdown"
  echo
}

case "$1" in

  start)
    start
  ;;

  stop)
    stop
  ;;

  status)
    status $NAME
  ;;

  restart)
    stop
    start
  ;;

  *)
    echo "Usage: $0 {start|stop|restart|status}"
  ;;

esac
/etc/rc.d/init.d/supervisord のサービス登録と自動起動設定
$ sudo chkconfig --add supervisord
$ sudo chkconfig --level 35 supervisord on

June 11, 2014

CentOS6.5でidn_to_ascii()とidn_to_utf8()を使えるようにする

メモです。

ICUライブラリをインストールする (最新版は http://site.icu-project.org/download で確認)
$ wget http://download.icu-project.org/files/icu4c/53.1/icu4c-53_1-src.tgz
$ tar zxvf icu4c-52_1-src.tgz
$ cd icu/source/
$ ./configure --prefix={PREFIX}
$ make
$ make install
PECLのintlパッケージをインストールする
$ sudo pecl install intl
# 略
Specify where ICU libraries and headers can be found [DEFAULT] :{PREFIX}
php.iniに以下を記述
extension=intl.so
確認
$ php -r "var_dump(function_exists('idn_to_ascii'));"
bool(true)

$ php -r "var_dump(function_exists('idn_to_utf8'));"
bool(true)
以下、ICUライブラリに関して参考にさせて頂きました。
http://qiita.com/emegane/items/f8f66eeb6dbac95c662d

March 16, 2014

Ubuntuでフォントのインストールメモ

グローバルにインストールする場合
$ sudo apt-get install -y fontconfig
$ sudo apt-get install -y ttf-sazanami-gothic ttf-sazanami-mincho
ローカルにインストールする場合(~/.fonts/以下にインストールする)
~/.fonts$ ll
total 67440
drwxrwxr-x  2 vagrant vagrant     4096 Mar 16 18:00 ./
drwxr-xr-x 18 vagrant vagrant     4096 Mar 16 18:01 ../
-rw-r--r--  1 vagrant vagrant 20104092 Dec  8 00:41 HanaMinA.ttf
-rw-r--r--  1 vagrant vagrant 24169832 Dec  8 08:58 HanaMinB.ttf
-rwxrwxrwx  1 vagrant vagrant 24737240 Mar 16 18:00 hanazono-20131208.zip*
-rw-r--r--  1 vagrant vagrant     5852 Dec  8 12:33 LICENSE.txt
-rw-r--r--  1 vagrant vagrant    17304 Dec  8 12:41 README.txt
-rw-r--r--  1 vagrant vagrant     1444 Dec  8 12:32 THANKS.txt

January 27, 2014

apt-get updateでNO_PUBKEYエラーが出た

ubuntu13.04でapt-get updateしたら以下のエラーが出ました。td-agentをインストールしていたので、それ絡みなはずです。
W: GPG error: http://packages.treasure-data.com precise Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY
http://docs.fluentd.org/articles/install-by-deb#gpg-key を参考に、以下を実行してみると、発生しなくなりました。
$ wget http://packages.treasure-data.com/debian/RPM-GPG-KEY-td-agent
$ sudo apt-key add RPM-GPG-KEY-td-agent
$ rm RPM-GPG-KEY-td-agent

November 2, 2013

Ubuntu13.04にPECLのgearmanパッケージをインストールして簡単なサンプルを実行してみる

Gearman公式
http://gearman.org/

PECL :: Package :: gearman
http://pecl.php.net/package/gearman

PHP: Gearman - Manual
http://us3.php.net/gearman

1. 必要なパッケージをインストールします。
# Gearman Job Serverがリモートならlibgearman-devのみで良いかもしれません。
$ sudo apt-get -y install gearman libgearman-dev

$ sudo pecl install gearman-1.0.3
PECLのgearmanパッケージを最新バージョン(今日現在で1.1.2)でインストールしようとすると、libgearmanのバージョンとの関係で以下のエラーが出ました。
configure: error: libgearman version 1.1.0 or later required
このエラーはgearman-1.1.0をインストールすれば解決出来ましたが、更に以下のエラーが出たのでgearman-1.0.3にしています。
http://www.phamviet.net/2012/10/10/ubuntu-php-5-4-x-and-gearman-troubleshooting/
(ホントは頑張って最新にすべきなのかもしれませんが、とりあえず。。。)

コマンドから使用されるphp.iniに以下を追記します。
extension=gearman.so
Gearman Job Serverを起動してステータスを確認してみます。
$ sudo gearmand -d
$ gearadmin --status
.
何のジョブもないので、ドットが一つ表示されるだけです。



2. ジョブを実行するworker.phpを作成します。
<?php

// GearmanWorkerのインスタンスを作成します。
$worker = new GearmanWorker();

// 第一引数はホスト(デフォルト127.0.0.1)、第二引数はポート(デフォルト4730)です。
$worker->addServer();

// ジョブ名とコールバック関数を対にして登録します。
// $countは動作確認のために渡しています。
$count = 0;
$worker->addFunction('my_first_job', 'callback_function', $count);

// 無限ループで常駐させます。
while ($worker->work());

// "my_first_job"に対するコールバック関数です。
function callback_function(GearmanJob $job, &$count)
{
    $data = json_decode($job->workload());
    $count++;
    return "Hello {$data->name}! You have visited {$count} times.";
}
起動します。
$ php worker.php
別のコンソールでGearman Job Serverのステータスを確認すると、"my_first_job"に対する1つのワーカー(右端の数値)が確認できます。
$ gearadmin --status
my_first_job 0 0 1
.
各数値は左から順に"未実行タスク"、"実行中タスク"、"ワーカー数"。らしいです。

尚、ワーカーを永続化するには、Supervisorあたりが良いでしょうか。
http://supervisord.org/



3. ジョブを登録するclient.phpを作成します。
<?php

// GearmanClientのインスタンスを作成します。
$client = new GearmanClient();

// 第一引数はホスト(デフォルト127.0.0.1)、第二引数はポート(デフォルト4730)です。
$client->addServer();

// ジョブ名とパラメータを対にして登録します。
$result = $client->do('my_first_job', '{"name":"mamor"}');

// 結果をコンソールに出力します。
echo $result.PHP_EOL;
3回ほど実行してみます。
$ php client.php
Hello mamor! You have visited 1 times.
$ php client.php
Hello mamor! You have visited 2 times.
$ php client.php
Hello mamor! You have visited 3 times.
尚、結果を待つ必要がないジョブの場合、GearmanClientのdo()ではなくdoBackground()でバックグラウンド実行ができるっぽいです。
http://www.php.net/manual/en/gearmanclient.dobackground.php

April 20, 2013

UbuntuでApacheのポートを変更するメモ

メモです。

1. /etc/apache2/sites-available/default
<VirtualHost *:80>

<VirtualHost *:8000>
に変更。

2. /etc/apache2/ports.conf
Listen 80

Listen 8000
に変更。

3. Apacheを再起動。
$ sudo service apache2 restart

April 19, 2013

UbuntuにLibeventをインストールしてみる

引き続き、Ratchet関連です。


Ratchetドキュメントの商用環境関連の記載に、Libeventなるものの記載があったので、とりあえずインストールしてみました。
http://socketo.me/docs/deploy

Libeventについては、以下が非常に参考になりそうです。

C言語 libeventとは イベント通知とI/Oバッファ
http://kaworu.jpn.org/kaworu/2008-11-29-1.php

liveventの意義
http://nippondanji.blogspot.jp/2008/09/livevent.html


以下、インストール手順ですが、色々とエラーが出たので、あまり参考にならないかもしれませんm(_ _)m

とりあえず記載の通り
$ sudo apt-get install libevent libevent-dev
とすると
E: Unable to locate package libevent
が発生。
$ sudo apt-get install libevent-dev
ならインストールできたので、dpkgで確認してみると
$ dpkg -l | grep libevent
ii  libevent-2.0-5                            2.0.16-stable-1                                     Asynchronous event notification library
ii  libevent-core-2.0-5                       2.0.16-stable-1                                     Asynchronous event notification library (core)
ii  libevent-dev                              2.0.16-stable-1                                     Asynchronous event notification library (development files)
ii  libevent-extra-2.0-5                      2.0.16-stable-1                                     Asynchronous event notification library (extra)
ii  libevent-openssl-2.0-5                    2.0.16-stable-1                                     Asynchronous event notification library (openssl)
ii  libevent-pthreads-2.0-5                   2.0.16-stable-1                                     Asynchronous event notification library (pthreads)
と出ました。(これで良いのだろうか。)

続いて、PECL拡張モジュールのインストールです。
$ sudo pecl install libevent
として、またエラーが出ました。
Failed to download pecl/libevent within preferred state "stable", latest release is version 0.0.5, stability "beta", use "channel://pecl.php.net/libevent-0.0.5" to install
install failed
調べてみると、以下が見つかりました。
https://groups.google.com/forum/?fromgroups=#!topic/phpdaemon/KulET8lECIA
http://serverfault.com/questions/271554/problems-installing-php-libevent-pecl-package

真似して
$ sudo pecl install channel://pecl.php.net/libevent-0.0.5
とすると
configure: error: Cannot find libevent headers
と出ました。

諦めたくなって来ましたが、ソースからインストールしてみます。
http://pecl.php.net/package/libevent
$ cd ~/src/
$ wget http://pecl.php.net/get/libevent-0.0.5.tgz
$ tar xzvf libevent-0.0.5.tgz
$ cd libevent-0.0.5/
$ phpize
$ ./configure
$ make
$ sudo paco -D make install

----------------------------------------------------------------------
Libraries have been installed in:
   /home/xxx/src/libevent-0.0.5/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
Installing shared extensions:     /usr/local/php/php-5.4.10/lib/php/extensions/no-debug-zts-20100525
(おお。進んだ。)

php.iniに以下を記述。
extension=libevent.so
Apacheを再起動。
$ sudo service apache2 restart
phpinfoを確認。
(0.0.5をDLしたはずだけど0.0.4となっているぞ。)


正しくインストール出来たのだろうか。。。

--

関連:
FuelPHPでWebSocketを扱うパッケージを作りました
http://madroom-project.blogspot.jp/2013/04/fuelphpwebsocket.html

April 18, 2013

UbuntuでApacheのmod_rewriteを有効にするメモ

メモです。

1. コマンドの実行
$ sudo a2enmod rewrite
2. /etc/apache2/sites-available/default の修正
<Directory /var/www/>
# 省略
    AllowOverride None
# 省略
</Directory>

<Directory /var/www/>
# 省略
    AllowOverride All
# 省略
</Directory>
に変更。

3. Apacheの再起動
$ sudo service apache2 restart

April 10, 2013

Ubuntu + PHPでZeroMQを使えるようにする

2013/10/29 追記
以下、最新のインストール手順です。
http://mp-php.github.io/reveal-fuel-ratchet/#/7/3

--

MacとWinでは確認済みですが、一応、Linux(Ubuntu)でも。まあ、一番簡単でした。尚、pacoはパッケージ管理ツールなので、必須ではありません。

(1) libzmqとphp-zmq(とpaco)のインストール
$ sudo apt-get install -y libzmq-dev paco
$ cd ~/src/
$ git clone git://github.com/mkoppanen/php-zmq.git
$ cd php-zmq/
$ phpize
$ ./configure
$ make
$ sudo paco -D make install
(2) Apacheで使用するphp.iniに以下を記述
extension=zmq.so
(3) 以下のコマンドで表示されるphp.iniにも上記を記述
$ php -i | grep 'Configuration File'
関連:

MAMP(Mac)でZeroMQを使えるようにする
http://madroom-project.blogspot.jp/2013/04/mampmaczeromq.html
XAMPP(Windows)でZeroMQを使えるようにする
http://madroom-project.blogspot.jp/2013/04/xamppwindowszeromq.html

April 6, 2013

UbuntuにSentryをインストールしてみた

先に、以下を相当参考にさせて頂きました。

Sentryをインストールした
http://www.kyamada.com/28

--

以下、手順のバックアップを兼ねて、記述します。
尚、DBはMySQLを使用しています。

(1) 下準備(必要らしいパッケージをインストール等)
$ sudo apt-get install python-setuptools
$ sudo apt-get install python-virtualenv
$ sudo apt-get install python-mysqldb
$ sudo apt-get install python-dev
$ sudo virtualenv /var/www/sentry/
$ source /var/www/sentry/bin/activate
(2) Sentryのインストールと設定
$ sudo easy_install -UZ sentry
$ sentry init
$ cp ~/.sentry/sentry.conf.py ~/.sentry/sentry.conf.py.org
$ vim ~/.sentry/sentry.conf.py
$ diff ~/.sentry/sentry.conf.py.org ~/.sentry/sentry.conf.py
14c14
<         'ENGINE': 'django.db.backends.sqlite3',
---
>         'ENGINE': 'django.db.backends.mysql',
16,18c16,18
<         'NAME': os.path.join(CONF_ROOT, 'sentry.db'),
<         'USER': 'postgres',
<         'PASSWORD': '',
---
>         'NAME': 'sentry',
>         'USER': 'xxx',
>         'PASSWORD': 'yyy',
(3) DBを作成
$ mysql -u root -proot
mysql> create database sentry;
mysql> quit
(4) マイグレーションしようとしてエラー発生
$ sentry upgrade # ImportError: No module named request
(5) マイグレーションのエラー要因になっているパッケージをダウングレードして再実行
* 新しいバージョンの方のeggはリネームして避けました。
$ sudo easy_install -U "cssutils <= 0.9.9"
$ sudo easy_install -U "raven <= 3.2" # これは別のエラー関係
$ sentry upgrade
参考:
https://bugs.launchpad.net/singing-dancing/+bug/1164486
(つい最近じゃん。。。)

(6) スーパーユーザを作成しようとしてエラー発生。。。
$ sudo sentry createsuperuser # TypeError: decode() argument 1 must be string, not None
(7) 言語設定をして再度スーパーユーザを作成
$ export LANG=ja_JP.UTF-8
$ export LC_ALL=ja_JP.UTF-8
$ sudo sentry createsuperuser
(8) 起動してhttpでポート9000にアクセス、スーパーユーザでログイン
$ sentry start
# ctrl + c で終了
(9) Sentryをサービスとして起動
$ sudo easy_install supervisor
$ sudo vim /etc/supervisord.conf
$ more /etc/supervisord.conf
[unix_http_server]
file=/tmp/supervisor.sock   ; (the path to the socket file)
;chmod=0700                 ; socket file mode (default 0700)
;chown=nobody:nogroup       ; socket file uid:gid owner
;username=user              ; (default is no username (open server))
;password=123               ; (default is no password (open server))

;[inet_http_server]          ; inet (TCP) server disabled by default
;port=127.0.0.1:9001        ; (ip_address:port specifier, *:port for all iface)
;port=172.16.1.20:9001       ; (ip_address:port specifier, *:port for all iface)
;username=hoge              ; (default is no username (open server))
;password=hoge              ; (default is no password (open server))

[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)
;umask=022                   ; (process file creation umask;default 022)
;user=chrism                 ; (default is current user, required if root)
;identifier=supervisor       ; (supervisord identifier, default is 'supervisor')
;directory=/tmp              ; (default is not to cd during start)
;nocleanup=true              ; (don't clean up tempfiles at start;default false)
;childlogdir=/tmp            ; ('AUTO' child log dir, default $TEMP)
;environment=KEY=value       ; (key value pairs to add to environment)
;strip_ansi=false            ; (strip ansi escape codes in logs; def. false)

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris              ; should be same as http_username if set
;password=123                ; should be same as http_password if set
;prompt=mysupervisor         ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history  ; use readline history if available

[include]
files = /etc/supervisord.d/*.ini

$ sudo mkdir /etc/supervisord.d
$ sudo vim /etc/supervisord.d/sentry.ini
$ more /etc/supervisord.d/sentry.ini
[program:sentry-web]
directory=/var/www/sentry/
command=/usr/local/bin/sentry start http
autostart=true
autorestart=true
redirect_stderr=true

$ supervisord
$ supervisorctl status
sentry-web                       RUNNING    pid 1989, uptime 0:00:05
(10) httpでポート9000にアクセス

--

関連:
Sentryを使ってJavaScriptのエラーレポートを集計してみた
http://madroom-project.blogspot.jp/2013/04/sentryjavascript.html

January 13, 2013

duplicityでバックアップを取ってみる

参考:
duplicityを使って暗号化バックアップ
http://ambiesoft.ddo.jp/blog/archives/1766

以下、コマンドのメモです。とりあえず、ローカルの適当な場所にfrom、to、restoreという3つのディレクトリを作成します。fromをtoにバックアップして、toからrestoreにリストアしてみます。

# インストール
$ sudo apt-get install -y duplicity

# 準備
$ cd ~/tmp/
$ mkdir from
$ mkdir to
$ mkdir restore
$ touch from/test.txt

# fromをtoにバックアップ
$ duplicity from/ file:///home/xxx/tmp/to/
Import of duplicity.backends.sshbackend Failed: No module named paramiko
Import of duplicity.backends.giobackend Failed: No module named gio
Synchronizing remote metadata to local cache...
Deleting local /home/xxx/.cache/duplicity/cf916ece6cdee728e6def39a70bc3db8/duplicity-full-signatures.20130112T171351Z.sigtar.gz (not authoritative at backend).
Deleting local /home/xxx/.cache/duplicity/cf916ece6cdee728e6def39a70bc3db8/duplicity-full.20130112T171351Z.manifest (not authoritative at backend).
Last full backup date: none
GnuPG passphrase: 
Retype passphrase to confirm: 
No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1358011229.58 (Sun Jan 13 02:20:29 2013)
EndTime 1358011229.59 (Sun Jan 13 02:20:29 2013)
ElapsedTime 0.00 (0.00 seconds)
SourceFiles 2
SourceFileSize 4096 (4.00 KB)
NewFiles 2
NewFileSize 4096 (4.00 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 2
RawDeltaSize 0 (0 bytes)
TotalDestinationSizeChange 215 (215 bytes)
Errors 0
-------------------------------------------------

$ ls -la to/
total 20
drwxrwxr-x 2 xxx xxx 4096 Jan 13 02:20 .
drwxrwxr-x 5 xxx xxx 4096 Jan 13 02:13 ..
-rw------- 1 xxx xxx  234 Jan 13 02:20 duplicity-full-signatures.20130112T172025Z.sigtar.gpg
-rw------- 1 xxx xxx  189 Jan 13 02:20 duplicity-full.20130112T172025Z.manifest.gpg
-rw------- 1 xxx xxx  215 Jan 13 02:20 duplicity-full.20130112T172025Z.vol1.difftar.gpg

# toをrestoreにリストア
$ duplicity restore file:///home/xxx/tmp/to/ restore/
Import of duplicity.backends.sshbackend Failed: No module named paramiko
Import of duplicity.backends.giobackend Failed: No module named gio
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Sun Jan 13 02:20:25 2013
GnuPG passphrase: 
$ ls -la restore/
total 8
drwxrwxr-x 2 xxx xxx 4096 Jan 13 02:13 .
drwxrwxr-x 5 xxx xxx 4096 Jan 13 02:13 ..
-rw-rw-r-- 1 xxx xxx    0 Jan 13 02:13 test.txt
上手くいっているような失敗しているような。。。様子を見ながら使っていこう。。。

January 6, 2013

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

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

--

以下の続きです。

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

Template for Jenkins Jobs for PHP Projects ( http://jenkins-php.org/ ) を参考にして、Checkstyle(PHP_CodeSniffer)/JDepend(PHP_Depend)/Plot(phploc)を追加してみました。内容を把握しきれていないものもありますが、とりあえず入れておくことにします。尚、phpcsコマンド、pdependコマンド、phplocコマンドは依存関係から既にインストールされていました。

build.xmlについては、以下を参考にして頂ければと思います。
https://github.com/mp-php/fuel-myapp/blob/master/build.xml
(相変わらずコマンド直書きですみません。。。)


▼Checkstyle(PHP_CodeSniffer)
(1) PHP_CodeSniffer Fuel PHP Standardをインストール
$ cd ~/tmp
$ wget https://github.com/eviweb/fuelphp-phpcs/archive/master.zip
$ unzip master.zip
$ cd fuelphp-phpcs-master/Standards/
$ sudo mv FuelPHP/ /usr/local/php/latest/lib/php/PHP/CodeSniffer/Standards/
$ phpcs -i
The installed coding standards are PEAR, FuelPHP, Zend, PSR2, MySource, PHPCS, PSR1 and Squiz
"FuelPHP"が表示されていればOKと思います。

(2) phpcsのコマンド例
phpcs --standard=FuelPHP --report-checkstyle=checkstyle.xml fuel/app/

(3) Jenkinsの設定
Checkstyle Pluginをインストールして、ジョブの設定からpost-build actionにPublish Checkstyle analysis resultsを追加。
Checkstyle resultsに出力ファイルを指定。

(4) build.xmlを編集してビルドして結果の確認
ジョブの画面に"Checkstyle Warnings"が表示されます。


▼JDepend(PHP_Depend)
(1) pdependのコマンド例
pdepend --jdepend-xml=jdepend.xml fuel/app/

(2) Jenkinsの設定
JDepend Pluginをインストールして、ジョブの設定からpost-build actionにReport JDependを追加。
Pre-generated JDepend Fileに出力ファイルを指定。

(3) build.xmlを編集してビルドして結果の確認
ビルドの画面に"JDepend"が表示されます。


▼Plot(phploc)
(1) phplocのコマンド例
phploc --log-csv plot.csv fuel/app/

(2) Jenkinsの設定
Plot Pluginをインストールして、ジョブの設定からpost-build actionにPlot build dataを追加。
Plot groupに任意なグループ名を入力。
Data series fileに出力ファイル名を指定。
Load data from csv fileを選択。

(3) build.xmlを編集してビルドして結果の確認
ジョブの画面に"Plots"が表示されます。

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

Gitoliteに触れずにGitLabのhookからJenkins側でビルドする

GitLabのプロジェクトの"Services"に"Jenkins CI An extendable open source continuous integration server Not implemented yet"という表示があるので、そのうち対応するのかなという楽観から、とりあえず、Gitoliteを触らない方法を取りました。尚、この方法は、GitLabのプロジェクト毎に、後述のJenkins用のユーザを"Reporter"以上で登録する必要があり、その点は面倒です。

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


-- Linux(Ubuntu)での作業 --
(1)
/var/lib/jenkins/.ssh/gitlab/id_rsa(パーミッションは600)と/var/lib/jenkins/.ssh/gitlab/id_rsa.pubを用意します。
* /var/lib/jenkins/はjenkinsユーザのホームディレクトリです。
* 同一サーバ上で作成した公開鍵だと後述のGitLabへの登録時に"Key can't be fingerprinted"というエラーが出て登録出なかったので、とりあえず、他所で鍵を作って、それを登録しました。

(2)
/var/lib/jenkins/.ssh/config を編集します。
Host example.com
User git
Hostname example.com
IdentityFile /var/lib/jenkins/.ssh/gitlab/id_rsa


-- GitLabでの作業 --
(1)
任意のグループにプロジェクト(レポジトリ)を作成して、初期化コミットしておきます。以下、仮に"xxx"グループに"yyy"レポジトリを作成したとします。
* 何のコミットも無いと、後述の、プロジェクトへのメンバー追加が出来ませんでした。

(2)
HookのURLを、以下の形式で設定をしておきます。
http://example.com/jenkins/git/notifyCommit?url=git@example.com:xxx/yyy.git

(3)
GitLabにJenkins用のユーザを作成します。

(4)
(1)で作成したプロジェクトに、(2)で作成したJenkins用のユーザを"Reporter"以上で登録します。
* ある意味、最強の"Reporter"です。。。

(5)
Jenkinsユーザでログインしなおして公開鍵を登録します。この公開鍵は、前述の"/var/lib/jenkins/.ssh/gitlab/id_rsa.pub"です。


-- Jenkinsでの作業 --
(1)
Jobを"Build a free-style software project"で新規作成します。

(2)
"Source Code Management"で"Git"を選択して"git@example.com:xxx/yyy.git"を入力します。

(3)
"Advanced..."から"Skip internal tag"にチェックを入れます。
Manage Jenkins > Configure System > Git plugin で
"Global Config user.name Value"と"Global Config user.email Value"を入力します。

(4)
"Build Triggers"で"Poll SCM"にチェックを入れます。

(5)
"Build Now"してビルドが成功すれば、Jenkins側の設定はOKです。また、GitLabにコミットして、Jenkins側でビルドが走れば一通りOKです。

--

これで、Phingとつなげれば。。。

Jenkinsで誰もログイン出来なくなってしまったら

Jenkinsは権限設定をうっかり間違えると、誰もログイン出来なくなってしまうようです。実験がてら、実際にやってみました。

この場合の対策ですが、以下に書いてありました。
https://wiki.jenkins-ci.org/display/JENKINS/Disable+security

Jenkinsを停止して、$JENKINS_HOMEのconfig.xmlを以下のように編集します。
* useSecurityをfalseにする
* authorizationStrategyとsecurityRealmを削除する

編集が終わったらJenkinsを起動します。

尚、$JENKINS_HOMEはUbuntuだと/var/lib/jenkinsでした。

January 4, 2013

JenkinsとPhingとPHPCPDでFuelPHPのCPDレポートを作成する

2013/01/05 以下に、まとめ記事を書きました。
FuelPHPとGitLabとJenkinsで継続的インテグレーションする雛形を考えてみた
http://madroom-project.blogspot.jp/2013/01/fuelphpgitlabjenkins.html

--

前回の内容に、PHPCPDによるCPDレポートの出力を加えてみます。
* 「JenkinsとPhingとxxxでFuelPHPのyyyを作成する」シリーズはこれで落ち着きます。。。

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

尚、前回のPHPMDと同様、PHPCPDはPEARでインストールできますが、PHPUnit(あるいはPhing??)を-a(--alldeps)オプション付きでインストールすると、一緒に入ってくるようです。既に入ってました。


PHPCPDは、PHPのコードの重複を自動で検出してくれます。
PHPCPD公式??(GitHub): https://github.com/sebastianbergmann/phpcpd


(1)
Jenkinsで"DRY Plugin"をインストールします。


(2)
Jobの設定からPost-build Actionsで"Publish duplicate code analysis results"を選択して、以下を入力します。
Duplicate code results: phpcpd/cpd.xml


(3)
build.xmlを編集します。(前回の内容に、「target name="phpcpd"」を追加して、「target name="all"」の"depends"に"phpcpd"を追加しています。)
<?xml version="1.0" encoding="utf-8" ?>
<project name="FuelPHP Project" basedir="." default="all">

    <target name="phpunit">
        <delete dir="phpunit" includeemptydirs="true" />
        <mkdir dir="phpunit" />
        <exec dir="." command="
            phpunit
            -c fuel/app/phpunit.xml
            --coverage-html phpunit/coverage/html
            --log-junit phpunit/junit.xml
        "/>
    </target>

    <target name="phpdoc">
        <delete dir="phpdoc" includeemptydirs="true" />
        <mkdir dir="phpdoc" />
        <exec dir="." command="
            phpdoc
            -d fuel/app/
            -t phpdoc/
        "/>
    </target>

    <target name="phpmd">
        <delete dir="phpmd" includeemptydirs="true" />
        <mkdir dir="phpmd" />
        <exec dir="." command="
            phpmd
            fuel/app/
            xml
            codesize,controversial,design,naming,unusedcode
            --reportfile phpmd/pmd.xml
        "/>
    </target>

    <target name="phpcpd">
        <delete dir="phpcpd" includeemptydirs="true" />
        <mkdir dir="phpcpd" />
        <exec dir="." command="
            phpcpd
            --log-pmd phpcpd/cpd.xml
            fuel/app/
        "/>
    </target>

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

</project>

(4)
ビルド後、サイドメニューに"Duplicate Code"が表示されれば成功です。尚、問題がない場合(空のディレクトリをスキャンした等)、表示されませんでした。(2回実行すると右側に"Duplicate Code Trend"と出ました。)



とりあえず、これで残すはGitLabのhookからの全自動化か。。。

JenkinsとPhingとPHPMDでFuelPHPのPMDレポートを作成する

2013/01/05 追記:
以下に、まとめ記事を書きました。
FuelPHPとGitLabとJenkinsで継続的インテグレーションする雛形を考えてみた
http://madroom-project.blogspot.jp/2013/01/fuelphpgitlabjenkins.html

--

前回の内容に、PHPMDによるPMDレポートの出力を加えてみます。

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

PHPMDは、PHPのコードの問題を自動で検出してくれます。
PHPMD公式: http://phpmd.org/

尚、PHPMDはPEARでインストールできますが、PHPUnit(あるいはPhing??)を-a(--alldeps)オプション付きでインストールすると、一緒に入ってくるようです。既に入ってました。


(1)
Jenkinsで"PMD Plugin"をインストールします。
* HTMLレポートも出力できるので、前回と同様"HTML Publisher plugin"を用いても良いですが、情報量の観点から、今回は"PMD Plugin"を使います。


(2)
Jobの設定からPost-build Actionsで"Publish PMD analysis results"を選択して、以下を入力します。
PMD results: phpmd/pmd.xml


(3)
build.xmlを編集します。(前回の内容に、「target name="phpmd"」を追加して、「target name="all"」の"depends"に"phpmd"を追加しています。)
<?xml version="1.0" encoding="utf-8" ?>
<project name="FuelPHP Project" basedir="." default="all">

    <target name="phpunit">
        <delete dir="phpunit" includeemptydirs="true" />
        <mkdir dir="phpunit" />
        <exec dir="." command="
            phpunit
            -c fuel/app/phpunit.xml
            --coverage-html phpunit/coverage/html
            --log-junit phpunit/junit.xml
        "/>
    </target>

    <target name="phpdoc">
        <delete dir="phpdoc" includeemptydirs="true" />
        <mkdir dir="phpdoc" />
        <exec dir="." command="
            phpdoc
            -d fuel/app/
            -t phpdoc/
        "/>
    </target>

    <target name="phpmd">
        <delete dir="phpmd" includeemptydirs="true" />
        <mkdir dir="phpmd" />
        <exec dir="." command="
            phpmd
            fuel/app/
            xml
            codesize,controversial,design,naming,unusedcode
            --reportfile phpmd/pmd.xml
        "/>
    </target>

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

</project>

(4)
ビルド後、サイドメニューに"PMD Warnings"が表示されれば成功です。 尚、PHPMDのルールで"controversial"を指定するとキャメルケース関係の警告が出るようになります。今回は、サンプルということで書いてありますが、FuelPHP 1.xのコーディング規約はスネークケースなので、必要に応じて外して下さい。

参考: http://phpmd.org/rules/index.html


JenkinsとPhingとphpDocumentor 2でFuelPHPのPHPDocを作成する

2013/01/05 追記:
以下に、まとめ記事を書きました。
FuelPHPとGitLabとJenkinsで継続的インテグレーションする雛形を考えてみた
http://madroom-project.blogspot.jp/2013/01/fuelphpgitlabjenkins.html

--

前回の内容に、phpDocumentor 2によるPHPDocの出力を加えてみます。

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


phpDocumentor 2のインストールは、以下を参考にして下さい。

phpDocumentor 2のインストール手順(Mac/Win/Linux)
http://madroom-project.blogspot.jp/2012/12/phpdocumentor-2macwin.html


(1)
Jobの設定のPost-build ActionsのPublish HTML reportsに、以下を追加します。
HTML directory to archive: phpdoc
Index page[s]: index.html
Report title: PHPDoc


(2)
build.xmlを編集します。(前回の内容に、「target name="phpdoc"」を追加して、「target name="all"」の"depends"に"phpdoc"を追加しています。)
<?xml version="1.0" encoding="utf-8" ?>
<project name="FuelPHP Project" basedir="." default="all">

    <target name="phpunit">
        <delete dir="phpunit" includeemptydirs="true" />
        <mkdir dir="phpunit" />
        <exec dir="." command="
            phpunit
            -c fuel/app/phpunit.xml
            --coverage-html phpunit/coverage/html
            --log-junit phpunit/junit.xml
        "/>
    </target>

    <target name="phpdoc">
        <delete dir="phpdoc" includeemptydirs="true" />
        <mkdir dir="phpdoc" />
        <exec dir="." command="
            phpdoc
            -d fuel/app/
            -t phpdoc/
        "/>
    </target>

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

</project>

(3)
ビルド後、"PHPDoc"が表示されれば成功です。


コマンド直書きでゴリ押し気味。。。

JenkinsとPhingとPHPUnitでFuelPHPのテスト統計を作成する

2013/01/05 追記:
以下に、まとめ記事を書きました。
FuelPHPとGitLabとJenkinsで継続的インテグレーションする雛形を考えてみた
http://madroom-project.blogspot.jp/2013/01/fuelphpgitlabjenkins.html

--

前回の内容に、テスト統計の取得を加えてみます。

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


(1)
Jenkinsに"xUnit Plugin"をインストールします。


(2)
Jobの設定からPost-build Actionsで"Publish xUnit test result report"を選択して、"PHPUnit-3.x (default)"をAddして、以下を入力します。
Pattern: phpunit/junit.xml

* "Publish JUnit test result report"でも似たようなことができますが、以下のエラーが出てしまいました。
Build step 'Publish JUnit test result report' changed build result to UNSTABLE
Finished: UNSTABLE

(3)
build.xmlを編集します。(前回の内容に、"--log-junit phpunit/junit.xml"を付け足しただけです。)
<?xml version="1.0" encoding="utf-8" ?>
<project name="FuelPHP Project" basedir="." default="all">

    <target name="phpunit">
        <delete dir="phpunit" includeemptydirs="true" />
        <mkdir dir="phpunit" />
        <exec dir="." command="
            phpunit
            -c fuel/app/phpunit.xml
            --coverage-html phpunit/coverage/html
            --log-junit phpunit/junit.xml
        "/>
    </target>

    <target name="all" depends="phpunit" />

</project>

(4)
ビルド後、画面右側に"Test Result Trend"と表示されれば成功です。(2回目以降に表示されます。)

JenkinsとPhingとPHPUnitでFuelPHPのHTMLカバレッジレポートを作成する

2013/01/05 追記:
以下に、まとめ記事を書きました。
FuelPHPとGitLabとJenkinsで継続的インテグレーションする雛形を考えてみた
http://madroom-project.blogspot.jp/2013/01/fuelphpgitlabjenkins.html

--

以下が済んでいる環境で、手順を確認しました。

UbuntuにPHP 5.4.10をインストールする
http://madroom-project.blogspot.jp/2013/01/ubuntu550alpha2.html

UbuntuにPHPUnitをインストールする
http://madroom-project.blogspot.jp/2013/01/ubuntuphpunit.html

UbuntuにXdebugをインストールする
http://madroom-project.blogspot.jp/2013/01/ubuntuxdebug.html

UbuntuにPhingをインストールする
http://madroom-project.blogspot.jp/2013/01/ubuntuphing.html

JenkinsとPhingの連携サンプル
http://madroom-project.blogspot.jp/2013/01/jenkinsphing.html

なので、要点は
* コマンドでPHPUnitによるカバレッジレポートの作成が出来る
* Phingのインストールが完了している
になります。

以下、FuelPHPのHTMLカバレッジレポートを作成する手順です。


(1)
Manage Jenkins > Configure System > Global properties > Environment variables で以下のように入力して、PHPにパスを通します。
name: PATH
value(例): ${PATH}:/usr/local/php/latest/bin/

Manage Jenkins > Configure System > Jenkins URL が正しいか確認します。間違っていると、後で出力するHTMLレポートのリンクがおかしくなります。


(2)
Jenkinsに"HTML Publisher plugin"をインストールします。インストール後、Jobの設定からPost-build ActionsでPublish HTML reportsを選択して、以下を入力します。
HTML directory to archive: phpunit/coverage/html
Index page[s]: index.html
Report title: Coverage


(3)
build.xmlを作成します。(今回は、コマンド直書きしました。)
<?xml version="1.0" encoding="utf-8" ?>
<project name="FuelPHP Project" basedir="." default="all">

    <target name="phpunit">
        <delete dir="phpunit" includeemptydirs="true" />
        <mkdir dir="phpunit" />
        <exec dir="." command="
            phpunit
            -c fuel/app/phpunit.xml
            --coverage-html phpunit/coverage/html
        "/>
    </target>

    <target name="all" depends="phpunit" />

</project>
尚、fuel/app/phpunit.xmlは、以下の内容を想定しています。
https://github.com/mp-php/fuel-myapp/blob/master/phpunit.xml
また、後々、"--log-junit"とかを追加する予定です。(後ほど、別記事で書く予定です。)


(4)
Jobの設定をします。具体的には、以下の「3. Jobの設定」を参考にして下さい。尚、今回の場合、Targetsは"all"となります。
http://madroom-project.blogspot.jp/2013/01/jenkinsphing.html
* "../core"と"../packages"と"../app/vendor"を除外していますが、必要に応じて調整して下さい。


(5)
ビルドを実行後、リロードして、"Coverage"が表示されていれば成功です。


build.xmlのちゃんとした書き方を覚えなくては。