読者です 読者をやめる 読者になる 読者になる

日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

PHP(Laravel)製TaskRunner「Envoy」を試してみた

PHP AdventCalendar Laravel Envoy

この記事は PHP Advent Calendar 2015 - Qiita の20日分として書かれています。
個人的な開発でLaravel製マイクロフレームワークLumenを利用しているので、デプロイ等に使えないかと思いLaravel製のTask Runner「Envoy」を試してみました。
結論から言うと私は今後多分使わないです。
※Envoyは、Bladeのシンタックスを利用してタスクを定義し、リモートサーバに対してそれらのタスクを適用させることが出来るタスクランナーです。

ドキュメント laravel.com

レポジトリ github.com

今回試した色々はこちらのレポジトリで試せます。 github.com

この後の話の流れはある程度Envoyのドキュメントにそって試していこうと思っています。

  • インストール
  • タスクとマクロの実行
  • 通知機能

1. インストール

インストールはcomposerを利用することで可能です。 ara-ta3/envoy-getting-started · GitHub では make install でおkです。

$curl -sS https://getcomposer.org/installer | php
$php composer.phar require "laravel/envoy: ~1.0"

これで /path/to/directory/vendor/bin/envoy が利用できるようになります。 そして、envoy initを実行するとテンプレートを作成することが出来ます。

$./vendor/bin/envoy init vagrant@192.168.33.10
Envoy file created!
$cat Envoy.blade.php
@servers(['web' => 'vagrant@192.168.33.10'])

@task('deploy')
    cd /path/to/site
    git pull origin master
@endtask

2. タスクとマクロの実行

ダミーサーバとしてvagrantcentosのサーバをローカルに立てています。 書いてみたタスクはこんな感じです。

  • Envoy.blade.php
@include("./vendor/autoload.php")

@servers (['vm' => 'vagrant@192.168.33.10'])

@setup
    $start = date('Y/m/d H:i:s');
@endsetup

@task ('ls', ['on' => 'vm'])
    ls -la /tmp
@endtask

@task ('touch', ['on' => 'vm'])
    touch /tmp/hoge
@endtask

@task ('fail', ['on' => 'vm'])
    test -f /tmp/fuga
    echo "failed"
@endtask

@macro ('all')
    touch
    ls
@endmacro

@macro ('all-fail')
    touch
    fail
    ls
@endmacro

@after
    echo "after" . PHP_EOL;
    echo "started: " . $start . PHP_EOL;
    echo "endted: " . date('Y/m/d H:i:s');
@endafter

簡単な文法

  • @includeはrequire_onceのエイリアス
  • @serversはデプロイ対象のサーバを設定できる
  • @taskはシェルスクリプトが書ける
  • @taskのシェルスクリプトが途中で終了コード0以外が出た場合、@taskはその終了コードで終了する。
  • @macroは@taskの名前が書ける
  • @setupはマクロまたはタスクの開始前に呼ばれ、phpのコードが書ける
  • @afterはマクロまたはタスクが終わった後に呼ばれ、phpのコードが書ける

あぁ・・・って思ったこと

@servers ([
  'vm1' => 'vagrant@192.168.33.10',
  'vm2' => 'vagrant@192.168.33.11'
])

みたいなことしたいじゃないですか。
できないです。
アノテーションはその行しか見てくれないんです。くっ・・・

  • @macroの中のタスクが異常終了しても@macroは止まらない。
@task ('ls', ['on' => 'vm'])
    ls -la /tmp
@endtask

@task ('touch', ['on' => 'vm'])
    touch /tmp/hoge
@endtask

@task ('fail', ['on' => 'vm'])
    test -f /tmp/fuga
    echo "failed"
@endtask

@macro ('macro-fail')
    touch
    fail
    ls
@endmacro

↑でenvoy run macro-failを実行すると途中のfail taskで失敗します。
が、failタスクの後のlsタスクも実行され、macro-failマクロは正常終了します。くっ・・・

  • @serversのサーバはsshコマンドの形式と全く同じ
@servers (['vm' => 'vagrant@192.168.33.10'])

のようになってる時、port変えてたらどうするんだ・・・みたいになるじゃないですか。
その時はこのようにします。

@servers (['vm' => 'vagrant@192.168.33.10 -p 10022'])

sshコマンドと同じですね。
別にいいんだけど、なんかなぁみたいな気持ちです。

3. 通知機能

slackとhipchatに通知が出来るらしいです。
下みたいな感じです。 タスクやマクロがまともだったらすごく便利だなぁーみたいに思ったかもしれません。

@after
    @hipchat('token', 'room', 'Envoy', "$task ran on [$environment]")
@endafter

@after
    @slack('https://hooks.slack.com/services/ZZZZZZZZZ/YYYYYYYYY/XXXXXXXXXXXXXXX', '#general', 'test with envoy')
@endafter

4. まとめ

bladeのテンプレートといいつつ、blade感あまりないですね。
PHP製といいつつPHPあんまり出てなくて、PHPで作られたツールみたいな立ち位置っぽいです。
マクロの途中でタスクが失敗してもマクロは失敗しないのはちょっと厳しい気がしました。
これならMakefileで良さそう。たぶんEnvoyは使いません。
調べている間に似たようなものにRoboというのも見つけたのでそっちもそのうち試してみたいと思います。

github.com

明日のアドベントカレンダーhidakatsuya - Qiita さんによる記事です!