Envoy はとてもシンプルなデプロイツールでLaravel の Blade を使ったことがあれば直感的に記述できます。
ただ、複数のサーバを対象とする場合、基本的には記述されたすべてのServerがデプロイ対象となり、対象を選択するようなオプションが標準では準備されていません。
(@task
のオプションである on
を利用すればタスク毎に対象サーバを絞ることができますが、実行時に対象サーバの選択はできない。)
そこで試行錯誤して複数環境にリリースできるようにしてみました。
@servers(['production' => 'example.com', 'staging' => 'staging.example.com'])
@story('deploy')
git
composer
migration
cache
autoload
@endstory
@setup
$docRoot = '/var/www/html';
if (empty($server)) {
$server = 'production';
}
@endsetup
@task('git', ['on' => $server])
cd {{ $docRoot }}
git pull origin master
@endtask
@task('composer', ['on' => $server])
cd {{ $docRoot }}
composer install --no-interaction --no-dev
@endtask
@task('migration', ['on' => $server, 'confirm' => true])
cd {{ $docRoot }}
php artisan migrate
@endtask
@task('cache', ['on' => $server])
cd {{ $docRoot }}
php artisan cache:clear
@endtask
@task('autoload', ['on' => $server])
cd {{ $docRoot }}
composer dump-autoload
@endtask
@finished
@slack('webhook-url', '#example', $server . 'にデプロイしました')
@endfinished
実行方法
# production
$ envoy run deploy
# staging
$ envoy run deploy --server=staging
production は、serverを指定してもOK
解説
実行対象を分けるだけであれば、実はそれほど難しくありません。
@story
を分けて
@story('production', ['on' => 'production'])
...
@endstory
@story('staging', ['on' => 'staging'])
...
@endstory
のように記述すればできます。
ただ、この方法ではSlack通知のメッセージを出し分けることができませんでした。
理由は以下の制約があるからです。
-
@setup
内じゃないと変数代入できない。 -
@finished
内じゃないと@slack
が使えない。
ということでコマンドのオプション変数で対応しました。
(まさか on
に変数を直接書けるとは思わなかった)
--server
オプションを必ず指定するのであれば、各 @task
の on
を削除して以下の記述でもいけます。
@story('deploy', ['on' => $server])
...
@endstory
この場合 --server
が未指定の場合に @setup
で補完する処理を記述しても、すでに on
の記載されている @story
が呼ばれているためなのか効果がありませんでした。
まとめ
これで、1ファイルでデプロイ先のサーバを切り替えることができそうです。
もし、もっとスマートなやり方を知っている方は教えてください!