はじめに
Deployerを使用する場合、よくあるケースとしてプロダクション・ステージング環境があったり、プロダクション環境が冗長化されているなど、1つのソースを複数のサーバにデプロイしなければならないことがあると思います。
今回は、そのような場合にDeployerでデプロイする方法を紹介します。Deployerの初期設定が済んでいない場合は、こちらの記事を参考にセットアップしてみてください。
hosts.ymlファイルの作成
前回の記事ではdeploy.phpに
hosts()
関数を使用してデプロイ先を定義していましたが、今回は複数のデプロイ先を定義しやすくするため、ymlファイルに分けます。
hosts.ymlファイルを作成して、以下のように設定します。
1 2 3 4 5 6 7 8 9 | .base: &base identityFile: ~/.ssh/your-key.pem user: your-user prod-app01: # デプロイ先 <<: *base hostname: app01.project.com stage: production deploy_path: /var/www/{{application}} |
.base: &base
では、各デプロイ先で共通の設定を記述します。
prod-app01:
がデプロイ先の名前で、共通の設定を継承しています。
設定内容は、一旦前回
host()
関数で設定した内容を、設定しておきます。
上記のymlファイルを読み込むため、hosts.ymlに次のように追記します。
1 | inventory('hosts.yml'); |
deploy.phpに
host()
関数を使用したデプロイ方法が実装されている場合は、削除しておきましょう。
プロダクション・ステージング環境を分ける
プロダクション・ステージング環境を分けるにはstageを使用します。
ymlファイルの記載
先ほどのymlファイルに追記する形で、ステージング環境を追加してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | prod-app01: <<: *base hostname: app01.project.com stage: production deploy_path: /var/www/{{application}} #ここから追記 stg-app01: <<: *base hostname: stg-app01.project.com stage: staging deploy_path: /var/www/{{application}} |
stg-app01
を追加しました。
stage: staging
と指定するため、先ほどのプロダクション環境と別々にデプロイできるようになりました。
デプロイコマンド
この場合のデプロイコマンドは次のようになります。
1 2 | # ステージング環境にデプロイ $ ./vendor/bin/dep deploy staging |
複数台のサーバに同時リリースする
プロダクション環境では、複数のサーバで冗長構成を取っている場合が多いと思います。1回のデプロイで、複数のサーバにデプロイする設定を紹介します。
ymlファイルの記載
1 2 3 4 5 6 7 8 9 10 11 | prod-app01: <<: *base hostname: app01.project.com stage: production deploy_path: /var/www/{{application}} prod-app02: <<: *base hostname: app02.project.com stage: production deploy_path: /var/www/{{application}} |
例として、2台のプロダクション環境を想定して、2環境分の設定をしました。同じstageを設定することで、同時にデプロイされます。
デプロイコマンド
デプロイコマンドは先ほどと同じです。
1 2 3 4 5 6 7 8 9 10 | $ ./vendor/bin/dep deploy production ✈︎ Deploying master on app01.project.com ✈︎ Deploying master on app02.project.com ✔ Executing task deploy:prepare ✔ Executing task deploy:lock : : (省略) : ✔ Executing task cleanup Successfully deployed! |
このように、複数サーバがデプロイされます。
デプロイ先によってタスクを変更する
特定のサーバでのみ実行したいタスクがある場合は、サーバにrole(役割)を設定することで、それぞれの専用タスクを実行することができます。
SPAサイトで、フロントエンドとバックエンドが別々のサーバで、同時にデプロイいすることを例に、紹介します。
ymlファイルの記載
次のroleをそれぞれのサーバに割り振ります。
-
web
フロントエンドのサーバ。デプロイ時にJS/CSSのコンパイルを行う。 -
app
バックエンドのサーバ。デプロイ時にDBマイグレーションを行う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | .base: &base identityFile: ~/.ssh/your-key.pem user: your-user deploy_path: /var/www/{{application}} prod-app01: <<: *base hostname: app01.project.com stage: production role: app prod-app02: <<: *base hostname: app02.project.com stage: production role: app prod-web01: <<: *base hostname: www01.project.com stage: production role: web prod-web02: <<: *base hostname: www02.project.com stage: production role: web stg-app01: <<: *base hostname: stg-app01.project.com stage: staging role: app stg-web01: <<: *base hostname: stg-web01.project.com stage: staging role: web |
これでyamlファイルの設定は完了です。
deploy.phpの実装
定義したroleでのみ実行するタスクを定義します。
1 2 3 4 5 6 7 8 9 | // appサーバデプロイ時は、DBマイグレーションを実行する task('artisan:migrate', function () { run('{{bin/php}} {{release_path}}/artisan migrate --force'); })->onRoles('app'); // webサーバデプロイ時はnpm runを実行する task('npm:run', function () { run('npm run'); })->onRoles('web'); |
タスクの定義に
onRoles()
を設定することで、hosts.ymlで定義したロールのサーバに対してのみ、タスクが実行されます。
さいごに
hosts.ymlの定義の組み合わせで、実際によくありそうなデプロイ設定をすることができるので、ぜひ試してみてください。