皆さんは作成したプログラムをどうやって検証環境や本番環境にデプロイしていますか?
最近では GitHub と連携して自動デプロイするホスティングサービスなど色々ありますが、僕は SFTP/FTPS/FTP での手動アップが多かったです。
手動アップだと差し替えミスがあったり単純に面倒くさかったりするので、そろそろ手動アップ卒業したいなと思い、 Deployer を使ってみました。
Deployer とは
PHP で作られた CLI のデプロイツールです。
各種フレームワークをデプロイするレシピを備えており、簡単にデプロイ環境を構築することができます。
詳しくは公式を確認ください。
Deployer – A deployment tool for php
前提条件
Deployer を使うには対象サーバーへ ssh 接続ができることと、 Git がインストールされていることが必要です。
インストール
何種類か方法があるみたいですが、今回は composer を使って落とします。
グローバルでもいいのですが、プロジェクトメンバーも検証環境とかにデプロイすることができるように今回はプロジェクトディレクトリに落とすようにします。
composer require deployer/deployer --dev composer install
これで vendor 以下にダウンロードされているはずなので、 dep
コマンドが叩けるようになります。
試しに dep
コマンドを叩いてみましょう。
php vendor/bin/dep
コマンドのオプションが一覧でズラッとでてきたらインストールできています。
設定ファイルの作成
次に、デプロイ設定を記述するファイルを作成します。
以下の手順を進めると deploy.php という設定ファイルがカレントディレクトリに作成されますが、プロジェクトルートで作成するよう公式にも書かれていますので、プロジェクトルートで実行するようにしましょう。
php vendor/bin/dep init
すると下記の様に、プロジェクトタイプを聞かれるので該当のプロジェクトにあった種類の数字を入力して Enter キーを押しましょう。
Please select your project type [Common]: [0 ] Common [1 ] Laravel [2 ] Symfony [3 ] Yii [4 ] Yii2 Basic App [5 ] Yii2 Advanced App [6 ] Zend Framework [7 ] CakePHP [8 ] CodeIgniter [9 ] Drupal [10] TYPO3
今回はサンプルなので Common
を選択します。
その後はリポジトリの URL など聞かれるので入力して Enter を押します。
すると deploy.php
という設定ファイルが作成されるので、このファイルに環境に合わせて設定を記載していきます。
deploy.php に設定を記載する
設定する項目は以下の通りです。
プロジェクト名
set('application', 'プロジェクト名');
リポジトリ URL
ここで設定したリポジトリがデプロイ対象となります。
dep init
で deploy.php
を生成する際に入力していれば最初から入力されているはずです。
set('repository', 'リポジトリ URL');
リリースバージョン間での共有ファイルの設定
ログファイルなどバージョンをまたいで共有したいファイルやディレクトリを shared_files
や shared_dirs
で指定します。
ここで指定したファイルやディレクトリはデプロイ後に shared_dirs
に格納され、バージョン間で共有することができるようになります。
set('shared_files', []); set('shared_dirs', []);
デプロイ先ホストの設定
deploy.php に直接記述します。
host('hogehoge.com') ->port(22) ->user('root') ->stage('test') ->set('branch', 'master') ->set('deploy_path', '/var/www/html');
host
デプロイ先のホスト名または IP アドレスを入力します。
port
デプロイ先の ssh ポート番号を入力します。
user
デプロイ先の ssh 接続ユーザー名を入力します。
stage
dep コマンドを叩く際にデプロイ先ホストを識別するためのステージ名を設定する
例: test というステージ名にした場合は php vendor/bin/dep deploy test
みたいな感じです。
set('branch', 'master')
デプロイするブランチを入力します。
set('deploy_path', '/var/www/html')
デプロイ先のパスを入力します。
ちなみに hosts 部分は yml ファイルに分けることもできます。
上記の設定を分けた場合はこんな感じになります。
hogehoge.com: stage: test port: 1235 user: root branch: master deploy_path: /var/www/html
inventory('hosts.yml');
タスクの設定
実行するタスクを設定します。
単純にデプロイするだけでいいならデフォルトの下記設定で良いと思いますが、自分で task を作成し、所定のタスクが実行された後に自分で作成した task を実行するということもできます。
task('deploy', [ 'deploy:info', 'deploy:prepare', 'deploy:lock', 'deploy:release', 'deploy:update_code', 'deploy:shared', 'deploy:writable', 'deploy:vendors', 'deploy:clear_paths', 'deploy:symlink', 'deploy:unlock', 'cleanup', 'success' ]);
// deploy タスクが終了した後に test_task を実行する desc('test_task'); task('test_task', function () { $result = run('cd /var/www/html; pwd'); writeln("Current dir: $result"); }); after('deploy', 'test_task');
他の Task に関する情報は公式のページを確認してください。
これで主要な設定は終了です。
一応 deploy.php の内容を載せておきます。
namespace Deployer; require 'recipe/common.php'; // Project name set('application', 'my_project'); // Project repository set('repository', 'repository url'); // [Optional] Allocate tty for git clone. Default value is false. set('git_tty', true); // Shared files/dirs between deploys set('shared_files', []); set('shared_dirs', []); // Writable dirs by web server set('writable_dirs', []); set('allow_anonymous_stats', false); // Hosts inventory('./hosts.yml'); // Tasks desc('Deploy your project'); task('deploy', [ 'deploy:info', 'deploy:prepare', 'deploy:lock', 'deploy:release', 'deploy:update_code', 'deploy:shared', 'deploy:writable', 'deploy:clear_paths', 'deploy:symlink', 'deploy:unlock', 'cleanup', 'success' ]); desc('test_task'); task('test_task', function () { $result = run('cd /var/www/html; pwd'); writeln("Current dir: $result"); }); after('deploy', 'test_task'); // [Optional] If deploy fails automatically unlock. after('deploy:failed', 'deploy:unlock');
hogehoge.com: stage: test port: 22 user: root branch: master deploy_path: /var/www/html
デプロイする
それでは実際にデプロイしてみましょう。
デプロイするには dep
コマンドに deploy.php の task で定義した task 名とホストで設定したデプロイ対象のホストの stage を入力します。
php vendor/bin/dep deploy test
すると task の内容が順番に実行されていき、デプロイ先のサーバーに指定した branch の内容が反映されます。
ちなみに Deployer では設定した deploy_path
に current
と releases
と shared
というディレクトリが生成されます。
releases
ディレクトリの中に世代別にリリースしたタイミングのプロジェクトファイルが格納されています。
デフォルトだと 5 世代までしか保存されませんが、保存する世代数は設定することも可能のようです。
current
ディレクトリはシンボリックリンクになっており、 releases
の最新リリースバージョンのディレクトリにリンクが貼られています。
shared_dirs や shared_files で指定したファイル達は shared
ディレクトリに格納され、全リリースバージョンで共有できるようになっています。
ついでに releases の中身はこんな感じです。
ロールバックする
リリースしたもののエラーでてる、すぐ前の状態に戻したい!
こんなときも Deployer ではコマンド一発入魂で戻すことができます。
php vendor/bin/dep rollback
リリース用のブランチなどを分けて運用している場合はとても簡単に戻すことができます。
とっても安心ですね。
最後に
以上で今回の解説は終了です。
以下のリンクは今回の記事で参考にさせていただいた記事です。
とても参考になりました、有難うございました。
Deployer では npm のインストールやデプロイ後の Slack 通知などのレシピ集を公開しているので興味のある方は下記の GitHub リポジトリからどうぞ。
GitHub - deployphp/recipes: Deployer Recipes
Deployer は ssh 接続と git の環境が必要になるので、レンタルサーバーを利用している場合は使えなかったり、サーバー側での調整が必要になってきます。
私もレンタルサーバーで試し、若干つまりましたが動かすことができました。。
こんな感じで割と簡単に使えますので、皆さんも一度使ってみてはいかがでしょうか。