DeployerによるPHPデプロイ
2016年 12月 09日
デプロイシステム、みなさんは何で構築していますか?
今回はPHPでデプロイシステムを構築できるDeployerを紹介したいと思います。
Deployerとは

- PHPでシステム化されたデプロイシステムです。
- 「task」、「recipe」といった各機能ごとの管理。
- Capistranoのようにデプロイ先でシンボリックリンクを切り替える仕様
- 開発が現在進行系。今後のバージョンアップも期待あり。
- PHPによる開発をメインとしている現場ならメンテナンス性とプロジェクトへの導入も容易い。
私感も混じっていますが上記のような性質を持つデプロイライブラリです。
エキサイトのサービスはPHPで作られているシステムが多く、
PHPプロジェクトならばDeployerの導入が容易でした。
また同一言語での実装のためか、デプロイ仕様の理解率がチーム内で高いと感じられました。
ではDeployerの各性質をざくっと説明していきます。
インストールと実行
インストール手順は本家サイトに書いてある通り行えば、ライブラリdeployer.pharを落としてくる事ができます。
プロジェクトへのインストール、または/usr/local/bin/へのインストールをお好きにお選びください。
- deployer.pharのインストール
- サーバー設定、タスクを定義
- 実行
以上のステップでデプロイシステムが完結します。
ディレクトリ構成は下記のような感じでやっています。
project_dir ├──project_file deploy ├── config │ └── configmain.yml(定数、設定値など。必要とあれば) │ └── server.yml(サーバー設定。必要とあれば) ├── recipe │ └── recipe.php(レシピファイル。必要とあれば) ├── other(その他あれば用意します) ├── deployer.pharを直接置く、もしくはインストールしたDeployerへのリンク └── deploy.php(基本処理など)
また、recipeを使えばタスクの微修正のみでdeployシステムが作れることもありそうです。
※ recipeに関しては以降で触れます。
準備
基本処理などを書くdeploy.phpに処理を作成。ライブラリ、レシピ、configなどの設定ファイルの読み込みをさせます。
require 'recipe/common.php'; Deployerライブラリ側のメインファイル require 'config/configmain.php'; require 'recipe/recipe.php';
その他、taskの明記や処理の作成orファイルを作成してrequireさせたりなど行います。
taskについて
Deployerはtaskといわれる、デプロイ時のフローです。またタスクをずらっと並べる事でフロー進行の管理タスクも作れます。
task('deploy', [ 'deploy:prepare', サーバに接続、ソースコードを配置するディレクトリを作る 'deploy:release', デプロイするソースコードを配置するためのディレクトリを整備 'deploy:update_code', git cloneでソースを落とす 'deploy:vendors', composer install 'deploy:shared', リリースバージョン跨いだ共有ディレクトリを設置 'deploy:update_dir', ファイルの権限等を変更 'clear:cache', キャッシュクリア 'deploy:symlink', シンボリックリンク差し替え 'cleanup', 前リリースバージョンを削除 ])->desc('Deploy project');
基本的にtaskの内容は、Deployer本家ソースのcommon.php または、deployレシピ
に明記されていて、こちらの内容を編集したい場合、同じtask名のメソッドを作り、本家のtaskをオーバーライドさせる形になります。
※もちろん新規でtaskを用意しても良いです。
例えば、
deploy:vendors
に関して、composer.pharのインストールさせるコードが下記のようになっています。
set('bin/composer', function () { if (commandExist('composer')) { $composer = run('which composer')->toString(); } if (empty($composer)) { run("cd {{release_path}} && curl -sS https://getcomposer.org/installer | {{bin/php}}"); $composer = '{{bin/php}} {{release_path}}/composer.phar'; } return $composer; });
もし、composer.phar毎回落としてくるなんて、ちょっと時間かかりそうだなぁ。。という思いがあった場合、
ファイルの有無を見てcomposer.pharをインストールさせれば良いなど。
run("cd $deployPath && if [ ! -e composer.phar ]; then curl -sS https://getcomposer.org/installer | {{bin/php}}; fi");
上記のようにオーバーライドさせたメソッドをデプロイソース上に置いておく、また新規で作る、などでtaskを構成させてゆきます。
recipeとは
いわゆる、タスクをまとめたDeployerへのライブラリです。
PHPフレームワーク仕様に則ったrecipe(laravel、Fuel PHP、CakePHP、、)や、機能毎のrecipe(Slack、Hipchat、npm、rsync)などがあります。
うまく組み合わせるのも良し、recipeからプロジェクトに合わせたタスクにmodifyしていく事ができます。
https://github.com/deployphp/deployer/tree/master/recipe
我らがBearフレームワークの創設者&監修koriym氏のrecipeも用意されています!
https://github.com/bearsunday/deploy
実行
デプロイ開始
./deployer.phar deploy

こんな感じで実行されます。
※上記はDeployerをプロジェクトに落とした上での実行です。
また、ロールバックもデフォルトで用意されています。
./deployer.phar rollback

画像では、コマンドの第一引数にタスクの指定、第二引数に環境を指定しています。
--verbose オプションも用意されています。開発時のデバッグ情報を出力しながら実行できます。
- -v for normal output,
- -vv for more verbose output,
- -vvv for debug.
※公式ドキュメントより
サーバーの設定
サーバーの設定です。サーバー設定を明記するファイルを「servers.yml」などとして用意し下記のように設定。
prod: host: deploytest.jp user: excite_deploy identity_file: ~ stage: production deploy_path: /var/www/production/
test: host: deploytest.jp user: excite_deploy identity_file: ~ stage: test deploy_path: /var/www/stage/
deploy.phpにこちらを読み込ませます。
serverList('servers.yml');
ymlファイルを用意しなくても、deploy.phpなどソースコード上に直接明記しても構いません。
server("prod_1", deploytest_a.jp, 22) ->user('excite_deploy') ->identityFile(~) ->stage('production') ->env('deploy_path', '/var/www/production/') ->env('keep_releases_size', 5);
server("prod_2", deploytest_b.jp, 22) ->user('excite_deploy') ->identityFile(~) ->stage('production') ->env('deploy_path', '/var/www/production/') ->env('keep_releases_size', 5);
deploy_path、keep_releases_sizeのように環境毎の設定値を指定もできます。
実行の仕組み
デプロイの全体の流れは、実行しているtaskの順番通りに進行します。
大まかには
- デプロイ先にリリースディレクトリを作成、そこにソースコードを落とす
- 最新リリースディレクトリ内の特定のディレクトリをsharedに向ける
- currentディレクトリを最新リリースディレクトリに向ける
- keep_releasesで指定した数以上のリリースディレクトリを削除の流れです。
デプロイ先のディレクトリ構成
デプロイ先に指定したディレクトリ ├──current(最新リリースディレクトリへのリンク) │ ↓ ├──releases ↓ │ ├── release20161209XXXX01(最新) │ │ │ ├── release20161209XXXX02 │ ├── release20161209XXXX03 │ ├── release20161209XXXX04 │ ├── release20161209XXXX05 └──shared
-
リリースディレクトリの数はkeep_releasesで設定されます。デプロイ先のリリースディレクトリが設定値以上になった場合に一番古いリリースディレクトリが削除されます
set('keep_releases', 5); -
sharedはリリースディレクトリを仰いでずっと残り続けるディレクトリです。logファイルやtmpファイルなどに使えます。こちらで設定できます。
set('shared_dirs', ['logs','temp']); -
その他機能は公式ドキュメントが分かりやすいです。
https://deployer.org/docs/functions
終わりに
個人的には、PHPプロジェクトにはDeployer!どんどん取り入れていきたいと思いました。何となくデプロイシステムは、作った本人に仕様把握が依存していく事も多いのかな?とも思っていましたが、やはりプロジェクトと同じ言語ゆえ、チームメンバー全員でチューンアップしてゆけるとも感じています。
まだまだDeployerの一部の機能しか触れていないのもあり、また、レシピもどんどん増えてきているのでこれからも色々試していきたいとも思いました!
明日は私と入社同期のtakada氏!php-dotenvについてです!お楽しみに!

より良いサービス目指して一緒にモノ作りしましょう!ぜひご応募おまちしてます!!