Laravelのタスクランナーenvoyを実装

この記事は 早稲田大学AdventCalendar 24日目の記事です。

こんにちは。早稲田大学授業レビューサイト「A+plus」の開発を担当している @taiyo です。
このAdventCalendarに出てくるのは二度目で、現在は逃げ恥ロスと闘っています。恋ダンスは完コピしました。

さて、この記事ではLaravel製のA+plusにまだなかったタスクランナーを実装した手順を書きます。[Laravelはphp界隈で今最もHOTなwebフレームワークとしてどんどん普及している](https://mayonez.jp/1374)ようで、Laravelの開発自体もとても活発なようです。

A+plusも開発が進み、Laravelの様々な機能を使ってきましたが、まだ使っていないenvoyというタスクランナーがあることに気がつきました。今まで温かみのある手作業で行ってたのをもっと単純化したりできるかなってことでひとまずenvoyが実行できるところまで簡単に実装します。実装にあたっては[こちら](https://laravel.com/docs/5.2/envoy#envoy-running-tasks)を参考にしています。

## 開発環境
簡単に、以下の通りです。

* MacOSX El Capitan v10.11.6
* PHP v5.6
* Laravel v5.2

## Envoy
前提としてですが、Laravelのタスクランナーには`envoy`というライブラリを用います。

>## introduction
>Laravel Envoy provides a clean, minimal syntax for defining common tasks you run on your remote servers. Using a Blade style syntax, you can easily setup tasks for deployment, Artisan commands, and more. Currently, Envoy only supports the Mac and Linux operating systems.

イントロにもあるように、envoyはMacOSとLinuxにのみ対応しているようですが、bladeと同じsyntaxで書けるので新たなキャッチアップは不要なので取り入れやすいですね。

## 導入手順
順にやっていきますよー
### envoyのインストール
インストールします。
コンソール上で`envoy`コマンドを実行するので、グローバルインストールが必要です。

```
$ composer global require 'laravel/envoy=~1.0'
$ composer global update
```
念のためupdateも行います。ここまでやると、 `~/.composer/vendor/bin`に`envoy`のexecuterが入ります。

```
$ envoy -v
-bash: envoy: command not found
```
で確認すると、私は`command not found`と返ってきました。
パスを通したらいけました。

```
$ echo 'export PATH=$HOME/.composer/vendor/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
$ envoy -v
Laravel Envoy 1.3.2
```
インストールdone

## タスク定義
タスク定義は、Laravelのプロジェクトルートに置いた`Envoy.blade.php`に記述していきます。
とりあえず簡単に、 ファイルリストを表示するタスクを定義してみます。

```Envoy.blade.php
@servers(['localhost' => '127.0.0.1'])

@task('foo', ['on' => 'localhost'])
    ls -la
@endtask
```
`Envoy.blade.php`が置かれているディレクトリで実行してみます。

```
$ envoy run foo
[127.0.0.1]: total 424
[127.0.0.1]: drwxr-xr-x   32 user  staff    1088 12 23 22:41 .
[127.0.0.1]: drwxr-xr-x   30 user  staff    1020 12 15 19:15 ..
[127.0.0.1]: -rw-r--r--@   1 user  staff    6148  5 29  2016 .DS_Store
[127.0.0.1]: -rw-r--r--    1 user  staff     286 12  3  2015 .env.example
...
```
無事一覧が表示されましたね！

## macro
いくつかのタスクをひとまとめにできるmacroというものも設定できます。

```Envoy.blade.php
@servers(['localhost' => '127.0.0.1'])

@task('foo', ['on' => 'localhost'])
    ls -la
@endtask

@task('hoge', ['on' => 'localhost'])
  git status
@endtask

@macro('tasks')
  foo
  hoge
@endmacro
```
macroを実行します。

```Envoy.blade.php
$ envoy run tasks
[127.0.0.1]: total 424
[127.0.0.1]: drwxr-xr-x   32 user  staff    1088 12 23 22:41 .
[127.0.0.1]: drwxr-xr-x   30 user  staff    1020 12 15 19:15 ..
[127.0.0.1]: -rw-r--r--@   1 user  staff    6148  5 29  2016 .DS_Store
[127.0.0.1]: -rw-r--r--    1 user  staff     286 12  3  2015 .env.example
...
[127.0.0.1]: On branch task_runner
[127.0.0.1]: Untracked files:
[127.0.0.1]: (use "git add <file>..." to include in what will be committed)
[127.0.0.1]: Envoy.blade.php
[127.0.0.1]: Envoy28037481713759f8a501e91e97527eaa.php
[127.0.0.1]: tasks/
```
`git status`の結果も表示されていますね。最高に見辛いけど。。

## チームのslackにpostしてみる
envoyからhipchatやslackに通知を送ることができるようです。
コードは以下の通りな感じです。

```Envoy.blade.php
@servers(['localhost' => '127.0.0.1'])

@task('foo', ['on' => 'localhost'])
  ls -al
@endtask

@after
  @slack('https://hooks.slack.com/services/xxxxxx/xxxxxxx/xxxxxxx', '#general', '浸透力、はんぱなーーーーーーーーーーーーーーーい!!！')
@endafter
```
タスクを走らせると、、、

```
$ envoy run foo
```
![スクリーンショット 2016-12-24 0.15.16.png](https://qiita-image-store.s3.amazonaws.com/0/95646/721ea5ee-c584-2d17-ab51-685e3884e509.png)

できた。浸透力はんぱない。

## envoyの活かし方
今の所有用だと思える場面はデプロイ作業のマクロ化くらいでしょうか...？
コンソールでやってた作業をひとまとめにするくらいでしか使えませんね。

slackへのhookは、各タスクの実行後の通知などに用いることができるでしょう。

### laravelリソースを使えるscriptの実行がしたいな
バッチ処理としてenvoyからscriptを実行してデータを操作できるようにしたいなぁと思ってちょっとやってみましたが、`tasks/`配下に作ったscriptファイル上で `require_once('../vendor/autoload.php')`するだけでは、少なくともModelからDB上のデータをのfetchはできませんでした。

本当はそれを実現したかったのですが、残念。。envoyの今後に期待しましょう。

## まとめ
ちょっと時間がなかったので簡単にenvoyの導入手順の紹介をしました。
機能としてはもう少し期待したいところはあるので、今後のLaravel/envoyの発展に期待ですね。

ここまで読んで頂きありがとうございました！
明日がラストとなりますが、引き続き早稲田大学AdventClendarをお楽しみください！