15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel Envoy でデプロイ対象サーバを指定してデプロイする

Last updated at Posted at 2019-06-07

Envoy はとてもシンプルなデプロイツールでLaravel の Blade を使ったことがあれば直感的に記述できます。

ただ、複数のサーバを対象とする場合、基本的には記述されたすべてのServerがデプロイ対象となり、対象を選択するようなオプションが標準では準備されていません。
@task のオプションである on を利用すればタスク毎に対象サーバを絞ることができますが、実行時に対象サーバの選択はできない。)

そこで試行錯誤して複数環境にリリースできるようにしてみました。

Envoy.blade.php
@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 オプションを必ず指定するのであれば、各 @taskon を削除して以下の記述でもいけます。

@story('deploy', ['on' => $server])
    ...
@endstory

この場合 --server が未指定の場合に @setup で補完する処理を記述しても、すでに on の記載されている @story が呼ばれているためなのか効果がありませんでした。

まとめ

これで、1ファイルでデプロイ先のサーバを切り替えることができそうです。
もし、もっとスマートなやり方を知っている方は教えてください!

15
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?