laravel/envoyでデプロイしてみる
PHPで作られているシステムをデプロイをするために、Envoyを使ってみました。
CapistranoやRocketeerとかと似たような立ち位置のものですね。
ただこれらよりはずっとシンプルです。
簡単な機能しかないですが、シンプルなものであれば全然問題ないと思う。
Envoyはこれ↓ github.com
これって、Laravelでしか使えないの?
Laravelってついてるけど、Laravelに限らずどこで使えます。
自分はCakePHP3と組み合わせて使ってます。
Envoyインストール
composer require "laravel/envoy=~1.0"
Envoyファイルの作成
# 127.0.0.1がデプロイ先になります。 php vendor/bin/envoy init 127.0.0.1
上記コマンドを実行すると Envoy.blade.php が作成されます。
こんなやつ
// Envoy.blade.php @servers(['web' => '127.0.0.1']) @task('deploy') cd /var/www/html git pull origin master @endtask
taskからendtaskの間がデプロイ先で実行するスクリプトになります。
複数サーバーにデプロイするような場合は、 @servers(['web1' => '127.0.0.1', 'web2' => '127.0.0.1']) のように単純に複数並べます。
実行してみる
deploy が実行するタスク名になります。
以下を実行すると、リモートサーバーにログインして、 /var/www/html に移動して、 git pull をする
というものになります。簡単!
php vendor/bin/envoy run deploy
story
storyは、複数のタスクをまとめて実行することができる機能です。
storyに、実行したいタスク名を羅列するだけです。
@servers(['web' => '192.168.1.1'])
@story('deploy')
git
composer
@endstory
@task('git')
git pull origin master
@endtask
@task('composer')
composer install
@endtask
setup
デプロイ処理をするときに必ず初期化したいような処理を書いておくのが、 setup です。
setupは PHPで記述します
タスクでPHPの変数を使いたい場合は、{{}} で変数を囲みます。
@setup
$date = date('Y/m/d');
@endsetup
@task('deploy'])
echo {{$date}}
@endtask
特定のサーバーに限定してタスクを実行したい
特定のサーバーに限定する場合は、タスクのパラメーターとして、 on にサーバー名を追加します。
@servers(['web1' => '192.168.1.1', 'web2' => '192.168.1.2'])
@task('deploy', ['on' => ['web1']])
cd site
git pull origin master
@endtask
並列処理
基本的に処理は、1サーバーごとに実行されます。
たた、同時に実行して問題がない場合は並列でデプロイしたほうがいいかもしれません。
並列処理も簡単で、並列に処理したいタスクのパラメーターとして、 parallel をtrueに設定するだけです
@servers(['web1' => '192.168.1.1', 'web2' => '192.168.1.2'])
@task('deploy', ['parallel' => true])
cd site
git pull origin master
@endtask
ifやforを使いたい
使いどころがいまいち思いついてないですが、ループや分岐も使えます。
マニュアルにも載ってないので、必要ないかも?
@servers(['web1' => '192.168.1.1'])
@setup
$list = ['one', 'two', 'three'];
@endsetup
@task('deploy')
@foreach ($list as $user)
@if ($user == 'aaa')
echo {{$user}}
@endif
@endforeach
@endtask
終了処理
これもマニュアルに載ってない。。。
タスクごと、デプロイ自体の終了処理も書くことが可能です。
// タスクごとの終了処理
@after
echo "タスク完了";
@endafter
// デプロイ自体の終了処理
@finished
echo "デプロイ終了";
@endfinished
Slack通知
デプロイとは関係ないですが、Slack、Hipchatへの通知機能を持ってます。
setupやafter、finishedで使うといい感じかも
@servers(['web1' => '192.168.1.1'])
@finished
@slack('Incoming WebHooks URL', '通知先チャンネル', 'デプロイ終わったよー')
@endfinished