shigematsu

Deployer を使ってデプロイしてみる

皆さんは作成したプログラムをどうやって検証環境や本番環境にデプロイしていますか?

最近では 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 initdeploy.php を生成する際に入力していれば最初から入力されているはずです。

set('repository', 'リポジトリ URL');

リリースバージョン間での共有ファイルの設定

ログファイルなどバージョンをまたいで共有したいファイルやディレクトリを shared_filesshared_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_pathcurrentreleasesshared というディレクトリが生成されます。

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 の環境が必要になるので、レンタルサーバーを利用している場合は使えなかったり、サーバー側での調整が必要になってきます。

私もレンタルサーバーで試し、若干つまりましたが動かすことができました。。

こんな感じで割と簡単に使えますので、皆さんも一度使ってみてはいかがでしょうか。

新しいウェブ体験を作ろう TAMのPWA開発
お問い合わせはこちら