VimからPHPUnitを実行する

必要なもの

quickrun
vimproc

quickrunのインストール

VundleでVimプラグインを管理している場合は簡単。

.vimrcに

Bundle 'git://github.com/thinca/vim-quickrun'
Bundle 'git://github.com/karakaram/vim-quickrun-phpunit'

を追加し、

:BundleInstall

するだけ。

vimprocのインストール

.vimrcに

Bundle 'git://github.com/Shougo/vimproc'

を追加し、

:BundleInstall

続いてコンパイルを行う。

 $ cd $HOME/.vim/bundle/vimproc/
 $ make -f make_unix.mak

 .vim/bundle/vimproc/autoload/ の下に vimproc_unix.so ができていればOK
 $ ls -la $HOME/.vim/bundle/vimproc/autoload/vimproc_unix.so
 -rwxr-xr-x. 1 keynodes wheel 19354  8月 25 01:24 2012 /home/keynodes/.vim/bundle/vimproc/autoload/vimproc_unix.so

quickrunの設定

ここからが本題
$ vim $HOME/.vim/userautoload/quickrun.vim
http://www.karakaram.com/vim/quickrun-phpunit/を参考に、コメントを適度に追加

"--------------------------------------------------
" コマンドのグループ化
"--------------------------------------------------
augroup QuickRunPHPUnit
    " グループのコマンドを初期化
    autocmd!
    " BufWinEnter バッファがウィンドウに表示された後
    " BufNewFile  存在しないファイルの編集を開始する
    "  => *Test.php 新規/編集で開いた時、filetype を phpunit にセットする
    autocmd BufWinEnter,BufNewFile *Test.php set filetype=phpunit
augroup END

"--------------------------------------------------
" quickrun設定
"--------------------------------------------------
let g:quickrun_config = {}
let g:quickrun_config['_'] = {}
" runnerにvimprocを設定。phpunitの実行中にVimがフリーズしなくなる
let g:quickrun_config['_']['runner'] = 'vimproc'
let g:quickrun_config['_']['runner/vimproc/updatetime'] = 100

"--------------------------------------------------
" filetype:phpunit の時の設定
"--------------------------------------------------

"--------------------------------------------------
" 通常の表示(横分割して結果表示)
"let g:quickrun_config['phpunit'] = {}
"let g:quickrun_config['phpunit']['outputter/buffer/split'] = 'vertical 35'
"let g:quickrun_config['phpunit']['command'] = 'phpunit'
"let g:quickrun_config['phpunit']['cmdopt'] = ''
"let g:quickrun_config['phpunit']['exec'] = '%c %o %s'
"--------------------------------------------------

"--------------------------------------------------
" ステータスラインの下に結果を表示
let g:quickrun_config['phpunit'] = {}
let g:quickrun_config['phpunit']['outputter'] = 'phpunit'
let g:quickrun_config['phpunit']['command'] = 'phpunit'
let g:quickrun_config['phpunit']['exec'] = '%c %o %s'

let g:quickrun_config['phpunit']['outputter/phpunit/height'] = 3
let g:quickrun_config['phpunit']['outputter/phpunit/running_mark'] = 'running...'
let g:quickrun_config['phpunit']['outputter/phpunit/auto_open'] = 0
"--------------------------------------------------

実行

PHPUnitのテストコードをVimで開いている状態で 「\r」でいつでもPHPUnitを実行、結果をステータスラインの下で確認。
エラーが出た場合、:lw (:lwindow)コマンドでロケーションリストを開くことができる。

ハイライトの設定

VimではデフォルトでPHP用のハイライトをしてくれているが、PHPUnitのコードは新たにfiletype:phpunitを設定しているため
PHPのハイライトが適用されない。

ファイルタイプ別のハイライトは
$VIMRUNTIME/syntax/*.vim で定義されていて、
$HOME/.vim/syntax/*.vim でその設定を上書きできる

PHPUnitで使うテストコードもPHPとしてハイライトをしたいので、コピーして使うことにする。

まずは$VIMRUNTIMEの値を確認し

 :echo $VIMRUNTIME
 /usr/share/vim/vim72

コピーする

[root@localhost ]# cp /usr/share/vim/vim72/syntax/php.vim /home/keynodes/.vim/syntax/phpunit.vim

ちゃんとハイライトが適用された!

Key mappingの設定を確認する

いつも新しいプラグインを入れて、.vimrcにショートカットキーを割り当てる記述をするときに、どのキーが空いてて、どのキーがデフォルトで埋まってて、どのキーに自分がキーを割り当てたか、がすぐにわからなくて悩む。

そんな時は↓
:h index.txtでVimデフォルトで割り当てられていないかを確認後、
:verb mapで自分またはプラグインが割り当てていないかを確認すればおk

参考:http://vim-users.jp/2010/05/hack148/

map コマンドモードのキーマップ
imap 入力モードのキーマップ
cmap コマンドラインにカーソルがあるときのキーマップ

 :map 
 s          * a

↑の意味は
(1)モード
s セレクトモード
(2)展開前の文字列

(3)展開後の文字列

 * 再マップされません。つまり、noremap 系で定義された Key mapping です。
 @ バッファローカルなマップです。<buffer> 付きで定義された Key mapping です。
 & スクリプトローカルなマップだけが再マップされます。<script> 付きで定義された Key mapping です。

verbose ではキーマップがどこで定義されたかが確認できる。

 :verbose map 
 s          * a
        Last set from ~/.vim/bundle/neocomplcache-snippets-complete/autoload/neocomplcache/s
ources/snippets_complete.vim

Jenkinsのインストール

やること

 Javaのインストール
 Jenkinsのインストール

参考、というかここに全て書いてあったり
https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+RedHat+distributions

Javaのインストール

JenkinsはJava上で動作するので、まずはJavaをインストールする

[root@localhost ]#yum install java-1.6.0-openjdk

インストールの確認

[root@localhost ]#java -version
java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.6) (rhel-1.43.1.10.6.el6_2-i386)
OpenJDK Client VM (build 20.0-b11, mixed mode)
OpenJDK Client VM (build 20.0-b11, mixed mode)

Jenkinsのインストール

[root@localhost ]#yum install jenkins

で最新版がインストールされるが、たまに最新版が見つからずインストールに失敗することがある。
こんな風に。(8/20 23:45時点)

Error Downloading Packages:
  jenkins-1.478-1.1.noarch: failure: jenkins-1.478-1.1.noarch.rpm from jenkins: [Errno 256] No more mirrors to try.

http://pkg.jenkins-ci.org/redhat/ にパッケージの一覧があるので新しいものからいくつか試してみる。

jenkins-1.478-1.1.noarch.rpm 2012/08/20 46.5M ←見つからず
jenkins-1.477-1.1.noarch.rpm 2012/08/08 46.5M
jenkins-1.476-1.1.noarch.rpm 2012/08/06 46.5M

[root@localhost ]#yum install jenkins-1.477-1.1

iptablesの設定変更

iptablesの設定を追加する。Jenkinsはデフォルトでは8080ポート。

vi /etc/sysconfig/iptables

 -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
 # 外部からのTCP80番ポート(HTTP)へのアクセスを許可
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
 # 外部からのTCP443番ポート(HTTPS)へのアクセスを許可
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
 -A INPUT -j REJECT --reject-with icmp-host-prohibited
 # for Jenkins
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

iptablesを再起動

[root@localhost ]# service iptables restart
iptables: ファイアウォールルールを消去中:                  [  OK  ]
iptables: チェインをポリシー ACCEPT へ設定中filter         [  OK  ]
iptables: モジュールを取り外し中:                          [  OK  ]
iptables: ファイアウォールルールを適用中:                  [  OK  ]

[:large]
ひとまず動くところまで。

PHPUnitとか、その他ツールのインストール

pearチャンネルの登録

pear channel-discover pear.phing.info
pear channel-discover pear.pdepend.org
pear channel-discover pear.phpmd.org
pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear channel-discover pear.phpdoc.org

Phing

Phingとは・・?Apache Ant というJAVAのビルドツールのPHPクローン
参考:Phingについて PHPUnit – The PHP Testing Framework

[root@localhost ~]# pear install phing/phing
[root@localhost ~]# phing -v
Phing 2.4.12

PHP_Depend

[root@localhost ~]# pear install pdepend/PHP_Depend
[root@localhost ~]# pdepend --version
PHP_Depend 1.0.7 by Manuel Pichler

PHPMD

[root@localhost ~]# pear install phpmd/PHP_PMD
[root@localhost ~]# phpmd --version
PHPMD 1.3.3 by Manuel Pichler

phpcpd

[root@localhost ~]# pear install phpmd/PHP_PMD
[root@localhost ~]# phpcpd -v
phpcpd 1.3.5 by Sebastian Bergmann.

phpDocumentor

[root@localhost ~]# pear install phpdoc/phpDocumentor-alpha
[root@localhost ~]# phpdoc --version
phpDocumentor version 2.0.0a10

参考:phpDocumentor2を試してみたのでそのセットアップ手順など – 打つか投げるか

PHPUnit

[root@localhost ~]# pear config-set auto_discover 1
config-set succeeded
[root@localhost ~]# pear install --alldeps phpunit/PHPUnit
[root@localhost ~]# phpunit --version
PHPUnit 3.6.12 by Sebastian Bergmann.

DBUnit

[root@localhost ~]# pear install pear.phpunit.de/DbUnit

PHP_CodeSniffer

[root@localhost ]# pear install pear/PHP_CodeSniffer

PHP apc Xdebugのインストール

PHPと各種ライブラリのインストール

yum --enablerepo=remi,epel,rpmforge install php php-mbstring php-devel php-pear php-mysql php-gd php-mcrypt php-pcre php-xml

インストールに必要なパッケージをインストール

PECLを使うためにmake, gccAPCインストール時にpcre-develが必要になる。

yum --enablerepo=remi,epel,rpmforge install make gcc pcre-devel

他にも後々必要になると思われるパッケージをここでまとめてインストールしておく。
(minimalでインストールしているのでほとんど何も入っていない状態)

yum --enablerepo=remi,epel,rpmforge install readline-devel curl-devel ImageMagick ImageMagick-devel
yum --enablerepo=remi,epel,rpmforge install wget rsync subversion git

APCのインストール

いくつか入力を求められるが全てデフォルトで設定

pecl install apc

インストール完了後に出るメッセージにしたがって設定ファイルを編集する

Build process completed successfully
Installing '/usr/lib/php/modules/apc.so'
Installing '/usr/include/php/ext/apc/apc_serializer.h'
install ok: channel://pecl.php.net/APC-3.1.9
configuration option "php_ini" is not set to php.ini location
You should add "extension=apc.so" to php.ini

/etc/php.ini には、

; Note: packaged extension modules are now loaded via the .ini files
; found in the directory /etc/php.d; these are loaded by default.

とあるので、apc用の設定ファイル(apc.ini)を作り、extension=apc.so も含めて管理する。

vi /etc/php.d/apc.ini

extension=apc.so
apc.enabled=1

apc.shm_segments=1
apc.shm_size=128M
apc.ttl=7200
apc.user_ttl=7200
apc.num_files_hint=1024
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.enable_cli=1

APCの確認

[root@localhost ]# php -i | grep APC
APC Support => enabled

タイムゾーンの設定

date.timezoneの設定をしないと、Warningが発生するのでphp.iniに設定しておく。

PHP Warning:  Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in Unknown on line 0

vi /etc/php.ini

 [Date]
 ; Defines the default timezone used by the date functions
 ; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
 date.timezone = "Asia/Tokyo"

Xdebugのインストール

pecl install xdebug

インストール完了時に下記メッセージが出るので、APCと同様にxdebug.iniを作る

Build process completed successfully
Installing '/usr/lib/php/modules/xdebug.so'
install ok: channel://pecl.php.net/xdebug-2.2.1
configuration option "php_ini" is not set to php.ini location
You should add "extension=xdebug.so" to php.ini

remote_host にはXdebugを利用するクライアント、今回だとホストOSのWMnet8のIPアドレスを設定する。

vi /etc/php.d/xdebug.ini

extension=xdebug.so
zend_extension=/usr/lib/php/modules/xdebug.so
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=192.168.136.1
xdebug.remote_port=9000

apacheを再起動して・・

[root@localhost ]# /etc/init.d/httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

確認

[root@localhost ]# php -i | grep xdebug
PHP Warning:  Xdebug MUST be loaded as a Zend extension in Unknown on line 0
PHP Warning:  Module 'xdebug' already loaded in Unknown on line 0

インストール時に出た「You should add "extension=xdebug.so" to php.ini」はウソってことか・・
Xdebug: Documentation にも
> Note: You should ignore any prompts to add "extension=xdebug.so" to php.ini ― this will cause problems.
とあった。

extension=xdebug.so の設定を削除し、apacheを再起動

vi /etc/php.d/xdebug.ini

 - extension=xdebug.so

再度確認

[root@localhost ]# php -i | grep xdebug
xdebug support => enabled

apacheのインストール、設定とSELinux

Apache のインストール (yum使用)

# yum --enablerepo=remi,epel,rpmforge install httpd httpd-devel

Apacheの起動

# service httpd start
httpd を起動中: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName

起動はできるが、上記エラーが出る。ServerNameを設定しなさい、という事らいしい。

vi /etc/httpd/conf/httpd.conf

 - #ServerName www.example.com:80
 + ServerName www.example.com:80

もしくは

sed -i 's/#ServerName www.example.com:80/ServerName www.example.com:80/' /etc/httpd/conf/httpd.conf

Apacheの再起動

# service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

自動起動の設定

自動起動の設定をしておく

# chkconfig httpd on

SELinuxを無効化

SELINUXの値をenforcingからdisabledにする

vi /etc/sysconfig/selinux

 SELINUX=disabled

システムを再起動すると変更が反映される(あとで再起動)

ファイアウォールの設定変更

まずは設定の確認

 [root@localhos]# cat /etc/sysconfig/iptables
 # Firewall configuration written by system-config-firewall
 # Manual customization of this file is not recommended.
 *filter
 :INPUT ACCEPT [0:0]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [0:0]
 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 -A INPUT -p icmp -j ACCEPT
 -A INPUT -i lo -j ACCEPT
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
 -A INPUT -j REJECT --reject-with icmp-host-prohibited
 -A FORWARD -j REJECT --reject-with icmp-host-prohibited
 COMMIT

HTTPとHTTPSを許可する
vi /etc/sysconfig/iptables
# 22番ポート(ssh)の下に下記を追加

 -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
 # 外部からのTCP80番ポート(HTTP)へのアクセスを許可
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
 # 外部からのTCP443番ポート(HTTPS)へのアクセスを許可
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
 -A INPUT -j REJECT --reject-with icmp-host-prohibited

iptablesを再起動

[root@localhost]# service iptables restart
iptables: ファイアウォールルールを消去中:                  [  OK  ]
iptables: チェインをポリシー ACCEPT へ設定中filter         [  OK  ]
iptables: モジュールを取り外し中:                          [  OK  ]
iptables: ファイアウォールルールを適用中:                  [  OK  ]

その後、SELinuxを無効化したので、OSを再起動する