sakutarou’s blog

とりあえずWeb系技術をゆるく書いていく

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