deployer使ってみた忘備録

deployerを使った時に困ったことなどメモ程度に。

deployer.org

 

前提条件

2017年8月時点で調べた事
v5.1.3の話 (ubuntu16.04のcomposerのデフォルトだったので)
 

調べたこ

  • デプロイサーバーからソースコードをセットアップして本番サーバーにrsyncしたい
  • 本番とステージングが同じサーバーに同居させたい  

デプロイサーバーからソースコードをセットアップして本番サーバーにrsyncしたい

deployerにはデプロイ時の基本的な処理がrecipeとして用意されているが、それらの処理はデプロイ先サーバーで実行されるようになっている。

デプロイの際、最新のソースコードをクローンしてきたあと、必要に応じてgulpタスクとcomposer installの実行をした上で複数サーバーに設置したく、それぞれのサーバーでわざわざ別々に同じことを実行させる必要もなかったのでデプロイサーバー上でソースをセットアップした上でデプロイ先に送るようにしたかった。

deployer用意されているrecipeではrun()で様々な処理を用意しているが、これはすでに書いたとおりデプロイ先サーバーで実行するようのファンクションであった。

ではローカル上で処理を行うには、ということでdeployerにはrunLocally()と言うものも用意されている。ただしrunLocally()ではデプロイサーバーからデプロイ先それぞれのサーバーに対して実行するファンクションであり、これでcomposer installなどしようとすればローカル上でデプロイ対象サーバーの数と同じ回数composer installすることになる。当初deployerでの処理を作るにあたりこれを利用していたが、開発用に用意していたデプロイ先サーバーは1台だったのに対し、本番サーバーは複数台構成だったため、いざ本番環境で実行しようとした際に思うように行かなかった。

というわけで、このような場合にはrunLocally()は使えず、

task('build', function () {

...

})->local();

Deployer — Tasks

taskの最後にアローでlocal()とつなげばデプロイ元サーバー上で一度だけ実行される。(run、runLocally共に)
これで解決。

rsyncの処理は公式サイトに載っているサードパーティrecipeを使えばOK。
Deployer — Deployer Recipes
※deployerは更新時に下位互換を結構切ってるようなので使うバージョンの注意が必要かも

本番とステージングが同じサーバーに同居してる場合

deproyerのデプロイ先ホストとパスの指定は基本的には以下の通り。

host('domain.com')
    ->stage('production')
    ->roles('app')
    ->set('deploy_path', '~/app');

  Deployer — Hosts

これで本番とステージングが同じサーバーに同居させようとすると

host('domain.com')
    ->stage('production')
    ->roles('app')
    ->set('deploy_path', '~/app/production');


host('domain.com')
    ->stage('staging')
    ->roles('app')
    ->set('deploy_path', '~/app/staging');

例えばこんな感じに設定すると実行時にエラーになる。
なんかバグらしい。。
Fix bug with parallel deploy to same host by antonmedv · Pull Request #1271 · deployphp/deployer · GitHub

host('production')
    ->hostname('domain.com')
    ->stage('production')
    ->roles('app')
    ->set('deploy_path', '~/app/production');


host('staging')
    ->hostname('domain.com')
    ->stage('staging')
    ->roles('app')
    ->set('deploy_path', '~/app/staging');

hostには適当な名前をつけ、hostnameでデプロイ先のホストを指定することで解決。
無事デプロイできた。

おしまい。