2015年5月21日木曜日

vagrant + phpstorm + phpunit 環境を構築しよう

今や主流の組み合わせである vagrant + phpstorm + phpunit の最新構築方法です。
ネットで検索しても古いバージョンの情報ばかりだったので、置いておきます。

phpstorm8(現時点最新)での導入方法となります。
要点のみの説明です。

まずはじめに
簡単にphpstorm8でphpunitと連動させるには、いくつかの制約がございます。
仕組みに詳しくない人は変な事をせず、さくっと設定しちゃいましょう。


①仮想環境(vagrant)にphpunitをインストール

必ずcomposerでインストールしてください。使ったことが無い人は「phpunit composer」でぐぐりましょう。
phpstormの設定ウインドウにはphpunitのダウンロードアドレスが載っていますが、手動インストールは設定難易度が一気に上がります。置いただけでは連動しません。


あと、sshでアクセスできる状態にしておいてくださいね。 phpstormからはssh経由でphpunitを実行されます。

②設定

Settings>Languages>PHP>PHPUnit で設定

「+」を押して By Remote Interpreter
プルダウンに何も無いので、右の「・・・」をクリックし Interpreters ウインドウを開く
何もないので「+」を押して追加
追加内容は、Vagrantを選び、適切な内容に。

さくさくっと進み、再び PHPUnit設定 に戻ってきます。
追加した設定を選択し、 Use Custom autoloder を選びます。 ここがポイント
composerでphpunitをインストールするとオートローダーが設置されていますので、探して指定してください。
最後に Default configuration file を指定して終わりです。

Default configuration fileとは、phpunit.xmlのことです。 めんどくさがらずに作りましょう!
ここで指定しない場合は、別途で指定になるかと思います。


以上で基本設定は終わります。
次に、テストの実行ですね。

phpstormの上部メニュー Run > Edit Configurations を開きます。
「+」を押して PHPUnit を選びます。「PHPUnit on Server」はhttp経由での実行(旧機能)なので無視してください。
PHPunitを選ぶとテスト内容の設定を行います。大規模になると複数作ることになりますね。
Defined in the configuration file を選ぶと、PHPUnitの設定「Default configuration file」で指定したテスト内容を実行してくれます。

これにて各設定終わり!
画面右上にPHPUnitのテスト実行ボタン等が出現したと思います。 そこから実行してください。



上記通りの設定をすると、ファイル名のみルール(xxxxTest.php)に従うのみで、ディレクトリ構造は自由です。
従わない場合ははオートローダーでテストケースを読み込みになるなどで、面倒なことになります。

2015年5月17日日曜日

tracの通知をslackへ飛ばそう

tracのチケット通知はメールアドレスを指定できるだけです。
しかしメールはちょっと不便ですよね。まず気がつきません!

リアルタイムに把握したい場合は、流行のslackが便利です。
slackについての説明や設定ははしょって、通知を飛ばす方法を紹介します。

Tracの通知メールはCCでいくつでも設定できるので、slack用メアドへ通知を送り、それをプログラムへ転送してslackへメール内容を送るという方法になります。

pythonの古い仕様のソースはgithubに上がってますが、そのままでは使えないしPHPが好きだしということで、PHPでの方法です。


メール転送は、ユーザディレクトリに「.forward」ファイルを設置し、この中に転送先を書きます。
とりあえず、「slack」というlinuxユーザを作って説明していきます。

ホームディレクトリありでslackユーザを作成すると
/home/slack ディレクトリが作られます。

/home/slack/.forward ファイルを作って
中身は


"|php slack.php"




とでもしておきましょう。
「|」がコマンド実行するよーという合図で
「php」がコマンド
「slack.php」が、コマンドに渡すパラメータで、まぁ、これを実行するわけですね。

ここから先はサーバ設定によってまったく異なりますのでご注意。


.forward で指定できる内容は、セキュリティー設定によりかなり制限されます。
・指定されたディレクトリに存在するコマンドしか使えない。
・コマンドのパス部分は無視され、ファイル名部分だけ認識。
・絶対パスは使えない。
|php /home/slack/slack.php と書いたら駄目です。 必ず相対パス。

以上3点がはまりやすいかもしれません。

phpコマンドを使えるように、設置
/etc/smrsh/ にあるコマンドのみ使えるので

# ln -s /usr/bin/php /etc/smrsh/
シンボリックリンクを置きます。

これで php コマンドが使えます。

次に、slackへメール転送するphpである slack.php。

<?php
require_once 'mimeDecode.php';

$WebHookURL = 'https://hooks.slack.com/services/xxxxxxx/xxxxxxx/xxxxxxxxxx';
$param = array(
 'channel'  => '#channel',
 'username' => 'username',
 'icon_emoji' => ':vertical_traffic_light:',
 'text'     => '',
 'color'    => '#cccccc',
);

$decoder = new Mail_mimeDecode(file_get_contents("php://stdin"));
$params = array("include_bodies"=>true);
$structure = $decoder->decode($params);
$param['text'] = $structure->body;
postRequest($WebHookURL, $param);

function postRequest($url, $param)
{
 $content = json_encode($param);
 $headers = array(
  "Content-Type: application/json",
  "Accept: application/json",
  "Content-Length: ".strlen($content),
 );

 $options = array('http' => array(
  'method' => 'POST',
  'content' => $content,
  'header' => implode("\r\n", $headers),
 ));
 $contents = file_get_contents($url, false, stream_context_create($options));
 return $contents;
}

こんな感じで適当につくりましょう。
mimeDecode.phpはpearのです。slack.phpと一緒に置いてください。


動かない時は、.forwardのセキュリティーが非常に宜しいです。

.forwardのオーナーをslackにし、パーミッションを600にしてみましょう。
これで動かないサーバは無いと思います。



最後のphpの中身を少し解説

Mail_mimeDecode:pearライブラリで、メール内容をヘッダ、タイトル、本文、添付ファイルと分けてくれる便利な物です。
メールを読み込んでいる部分は file_get_contents("php://stdin")
file_get_contentsは外部と通信するための万能ツールです。slackへの送信もこれで。