Deployerでrsyncを使う

昨日の記事「PHPプロジェクトを簡単にデプロイするならDeployerがお薦め」が思ったより「はてブ」されたので、フォローの記事を書いておきます。

昨日のまとめに書きましたが、

  • Deployerは非常にシンプルなツールで必要最低限の機能も不足しているかも知れません。

なので、自分の要求に足りない機能というのが、たぶん出てくると思います。

標準のワークフローでは、デプロイ先のサーバからgit cloneしてソースを取得してデプロイします。

PHPプロジェクトを簡単にデプロイするならDeployerがお薦め — A Day in Serenity (Reloaded) — PHP, FuelPHP, Linux or something

試してみたけど、デプロイ先のサーバー側でgit cloneコマンド実行するからcloneできる設定をいちいちするのがめんどいな。git cloneはデプロイサーバーの1回で済ませたい。.gitもついちゃうし。。

2015/06/02 22:12

というような感想も出てきます。

  • でも大丈夫。Deployerは簡単にレシピを拡張できます。

足りないものや合わないものは自分で書いていけばいいじゃん、ということです。で、それが簡単に書けるのがDeployerです。

なんとなくUnix的な感じです。機能が多い方がいいという人には今のところ向きません。

rsyncを使ってみる

ということで、例えば、rsyncを使うようなタスクを書いてみます。

標準のワークフローに乗っかりやすいように、

  1. ローカルからデプロイ先にGitリポジトリをrsync
  2. デプロイ先ではrsyncしたGitリポジトリからgitでデプロイ

というフローにします。これだと標準のワークフローに追加するだけで使えます。

rsync元(rsync_from)とリポジトリ(repository)を定義します。

set('rsync_from', '/home/deploy/your-project');         // rsync元(ローカル)
set('repository', '/var/www/repository/your-project');  // rsync先(サーバ上)

rsyncするタスクrsyncを定義します。

task('rsync', function () {
    $server = \Deployer\Task\Context::get()->getServer()->getConfiguration();
    $host = $server->getHost();
    $port = $server->getPort();
    $user = $server->getUser();

    // rsync to server
    $rsync_from = get('rsync_from');
    $rsync_to   = get('repository');
    runLocally(
        "rsync -e \"ssh -p $port\" -avz --delete \
        --exclude 'vendor' --exclude '*~' --exclude '*.bak' \
        \"$rsync_from/\" \"$user@$host:$rsync_to\""
    );
})->desc('Rsync repository to server');

タスクrsyncをタスクdeployの前に実行するように設定します。

before('deploy', 'rsync');

これで完了です。

別にgitいらないという場合は、common.phpで定義されているタスクdeploy:update_codeをオーバーライドして、rsyncで直接ソースを更新するようにすればOKです。

まとめ

  • Deployerを使うとPHPプロジェクトを簡単にデプロイできます。
  • Deployerは非常にシンプルなツールで必要最低限の機能も不足しているかも知れません。
  • でも大丈夫。Deployerは簡単にレシピを拡張できます。

関連

Date: 2015/06/03

Tags: php, deployment