PHP製デプロイタスクランナー Envoy(Laravelファミリー)

Posted: 2015-05-11 00:12 |  PHP全般 
デプロイツール、最近は便利なものがたくさんありますね!
自分はいつもCapistrano3なんですが、最近Rocketeerを触ってみたりしてPHP製のデプロイツールもいいものが揃ってきました。
そんな中、日本国内ではほとんどエントリを見かけないのに実は結構使いやすいものを紹介しましょう。

その名もEnvoy

トランスフォーマーのコンボイと似てます。(これが言いたかっただけです)
EnvoyはLaravel作者のTaylor Otwell氏作のリモートサーバに接続してデプロイしたりするタスクランナーツールで、
Laravel Envoyとして紹介されていますが、実際のところ

Laravelとの親和性は皆無なので、なんでも使えます。

RocketterもCapistranoもものすごく便利で素晴らしいツールですが、
いろいろカスタマイズするのに覚えたりしないといけないことが多々あります。
それにRocketterは公式サイトのマニュアルが古いでし、使いこなすにはソースコードを読むのが一番です(経験者談)

Envoyの何がいいのか

タスクを書くのに全くと言っていいほど特別な書き方などを覚える必要がありません。
Laravel利用者にはおなじみのBladeテンプレートの記法で書いて、
実行するタスクは普通のコマンドを並べるだけです。
rsyncでデプロイスクリプトを作った方ならものすごく簡単にできますのでとってもシンプルです。
学習コストも数分です。

インストール

Composerを使います。
グローバルにインストールする方は
composer global require "laravel/envoy=~1.0"
プロジェクトの直下にインストールする方はcomposer.jsonに追加するだけです。
  "require-dev": {
    "mockery/mockery": "0.9.*",
    "phpunit/phpunit": "~4.0",
    "phpspec/phpspec": "~2.1",
    "barryvdh/laravel-ide-helper": "~2.0@dev",
    "satooshi/php-coveralls": "dev-master",
    "laravel/envoy": "1.*"
  },
ちなみにrequire-devは開発時のみに利用するものとかを書きましょう。
laravel-ide-helperなどは開発以外では利用しないのでrequireに書きません。
本番環境では
$ composer install --no-dev

としてrequire-devは利用しないようにしましょう!
インストールしたらEnvoyへパスを通しましょう。
グローバルの方は、~/.composer/vendor/bin、
プロジェクト直下の方はそのまま叩くか面倒くさい時はエイリアスにしてしまいましょう。
エイリアスは
alias envoy=vendor/bin/envoy
いらなくなったらunalias envoyです

準備

まずはリモートサーバに接続するための準備です。
接続先の情報を使ってコマンドを叩きます。
$ envoy init user@192.168.1.1
ユーザー名@リモートサーバ名やipなどとします。
実行したらプロジェクト直下にEnvoy.blade.phpができますので、
以降はそれを使ってタスクを書いていきます。

接続先と基本

LaravelのBladeテンプレートと同じ書き方です。
ファイルが生成されたら次のように書かれているはずです
@servers(['web' => 'user@192.168.1.1'])

@task('deploy')
    cd /path/to/site
    git pull origin master
@endtask
もう一目瞭然でしょう。
serversは接続するサーバを記述します。
@taskから@endtaskの間に実行する内容を書きます。
task名はdeployです。
これを実行するには
$ envoy run deploy
です。
なんてシンプル

複数の接続先とローカルとやり方

デプロイするサーバは複数台だよ!という方が多いでしょう!
複数台接続する場合は、こうなります
@servers(['web' => 'user@192.168.1.1'], 'web2' => 'user@192.168.1.2'])
配列で追加していきます。
このサーバだけのこのタスクを実行したい!そんな時はこうなります
@servers(['web' => 'user@192.168.1.1'], 'web2' => 'user@192.168.1.2'])

@task('deploy', ['on' => ['web']])
    cd /path/to/site
    git pull origin master
@endtask
タスクに対してonでどのサーバで実行するのかを記述します。
記述しない場合はserversに書いたサーバ全てが対象です。
ローカルで実行するタスク入れたいんだけど・・・
ローカルでも大丈夫です。ローカルはserverに次のように追加するだけです
@servers(['web' => 'user@192.168.1.1', 'local' => '127.0.0.1'])
localという名前はなんでもいいんですが、127.0.0.1かllocalか、localhostと指定します。
こうするとEnvoyの内部で勝手にローカルとしてくれます。

タスクの書き方

前述した@taskを利用しますが、これだけですと不憫です。
setupを使うことで変数を定義できます。
それにプロジェクト直下のライブラリ、たとえばleague/flysystemの何かを使いたい!という場合は
includeがあります。つまりこうなります
@include('vendor/autoload.php');
@setup
    $hoge = 1;
@endsetup

@servers(['web' => 'user@192.168.1.1', 'local' => '127.0.0.1'])

@task('deploy', ['on' => ['local']])
    echo {{ $hoge }}
@endtask
これを実行するには、
$ envoy run deploy
となります。
setupで書いたものは{{ }}デリミタ内に埋め込めます。1と表示されればOKです。
実行するときに引数足したいんだけど・・・
引数と埋め込む変数がマッチするようになってますので、
@task('deploy', ['on' => ['local']])
    echo {{ $hoge }};
    @if(isset($message))
        echo {{ $message }};
    @endif
@endtask
とすると、
$ envoy run deploy --message="hoge"
これで利用できます。
基本はこれだけです。タスク内に実行の確認メッセージを出したいときはconfirmを書くとか、
タスクを並列でやりたいときはparallelなど指定できます。
いくつかタスクを書いたらマクロを使ってまとめると良いです。
@macro('macro')
    deploy
    somethingTask
@endmacro
マクロ内のタスクは上から順に実行されます。
マクロ名はなんでも良く、実行するのもタスクと同じく
$ envoy run macro
だけです。引数が必要でしたら同じように指定するだけです。
なんて簡単超シンプル
機能が多いデプロイツールは使いこなせないからいいや!という方は
envoyを利用してみるのも良いのではないでしょうか!

 

about ytake

執筆に参加しています


Laravel お役立ち情報

share



このエントリーをはてなブックマークに追加

Categories

laravel 45

DTM 0

music 0

PHP全般 31

0

JAPAN 1

WORLD 1

javascript 4

RDBMS 1

NoSQL 1

NewSQL 1

Recent Posts

Ad

comments powered by Disqus

GitHub

Social Links

Author


クリエイティブ・コモンズ・ライセンス
Yuuki Takezawa 作『Ytake Blog』はクリエイティブ・コモンズ 表示 - 非営利 4.0 国際 ライセンス で提供されています。

© ytake/comnect All Rights Reserved. 2014