PHP製デプロイツール「deployer」を試してみる

    

deployerについて

サーバにモジュールをアップロードするような行為をデプロイといいます。昔はFTPやSCPでファイルをアップロードしたものですが、運用をしているとキャッシュファイルを削除しなくてはならなかったりで手続きが煩雑になってきます。

それを自動化しようというのがデプロイツールなのですが、webまわりで有名なデプロイツールとして「Capiostrano」などがあげられます。これがRuby製だったりします。環境をつくるのもそうですが、デプロイツールにはレシピというデプロイ手順を定義する必要があったりするのですが、ここでRubyを見ることになります。勉強すればよいだけの話ですがPHP製のツールはないかと思いたどり着いたのがdeployerでした。(他にもrocketterというツールがありますが、こちらの方が導入しやすそうだったという理由でdeployerを取り上げます)

deployerのダウンロード&インストール

ダウンロードしてbinディレクトリに移し実行権限を付与します。

wget http://deployer.org/deployer.phar
mv deployer.phar /usr/local/bin/dep
chmod +x /usr/local/bin/dep

リンク切れの場合こちらを参照

タスクの作成

今回はfuelphp用のプロジェクトをローカルにデプロイさせる方法で試します。
タスクはプロジェクトディレクトリに配置することにしました。
/var/www/html/fuel/deploy/deploy.php

<?php

require 'recipe/fuelphp.php';

server('local', '127.0.0.1', 22 )
    ->user('name')
    ->password('password')
    ->stage('production')
    ->env('branch', '1.7/master')
    ->env('deploy_path', '/var/www/html');

set('repository', 'https://github.com/fuel/fuel.git');

詳細な設定方法はコチラを参照
他のフレームワークを用いる場合はrecipeのrequireの部分を変更します。
どんなレシピがあるのかはコチラを参照
カスタムレシピを利用する際は任意のディレクトリにphpファイルを作成しrequireの部分でフルパス参照させると良いと思います。

事後処理の追加

smartyを使用している場合、コンパイル済みテンプレートファイルを削除したいといった要件がある場合は下記の定義を行います。

編集中

タスクの実行

dep --file=/var/www/html/fuel/deploy/deploy.php deploy production

ソース管理がSVNな場合

デプロイファイルにちょっと記述を追加します
(タスクの内容をオーバーラードします)

<?php

require 'recipe/fuelphp.php';

server('local', '127.0.0.1', 22 )
    ->user('name')
    ->password('password')
    ->stage('production')
    ->env('deploy_path', '/var/www/html');

set( 'svnrepository' , 'http://svn-repository-url');
set( 'svnuser' , 'svn-user' );
set( 'svnpass' , 'svn-user-password' );


/**
 * Update project code, override git, use svn instead.
 */
task('deploy:update_code', function () {
    $svn = '/usr/bin/svn';
    $repository = trim(get('svnrepository'));
    $user = trim(get('svnuser'));
    $pass = trim(get('svnpass'));
    $cmd = "$svn export --force --username '$user' --password '$pass' $repository {{release_path}} 2>&1";
    run($cmd);
})->desc('Updating code');

? Executing task deploy:update_codeで固まる

コマンドを実行した際に、svnが入力プロンプロトを表示していたりすると該当現象が発生します。私の環境ではdeploy.phpで定義しているユーザでリポジトリに初めて接続する際ににパスワードを保存するか?といった表示で入力待ちになっているらしくこの状態になっていました。

この場合deploy.phpで定義しているユーザでログインし下記ファイルの末尾に下記の内容を追記します。(パスワードを保存しないようにする)

vi ~/.subversion/config

# 末尾に追記
store-passwords = no
store-plaintext-passwords = no

デプロイしたファイルは世代管理される

直接deploy_pathで指定したディレクトリに配置されるわけではなく、下記のような構成になります。

/var/www/html/
├── current -> /var/www/your/project/releases/20160608140000
└── releases/
     ├── 20160608120000/
     ├── 20160608130000/
     └── 20160608140000/

数世代分releasesフォルダに保持され、「/var/www/html/current」※1がシンボリックリンクとして最新版を参照しています。

PHPアプリケーションの場合、webサーバの設定で「/var/www/html/current」をWebの公開ディレクトリに設定します。今回はfuelphpのアプリケーションをデプロイしたので「/var/www/html/current/public」を公開ディレクトリとして指定しておきます。

保持する世代数は、deploy.phpにて「keep_releases」の値を設定することにより指定することができます。

set( 'keep_releases' , 5 );

操作ミス時などの要因により、1世代戻すといったことも可能で、この場合下記のコマンドを実行することでロールバックが可能です。

dep --file=/var/www/html/fuel/deploy/deploy.php rollback production

※1 デプロイ先の指定によりパスは変化します。