Capistrano(カピストラーノ)でPHPプロジェクトをデプロイ

Capistrano(カピストラーノ)は複数のリモートサーバにSSH接続して一括操作できる便利なツールです。
色々な用途に使えますが、今回はCapistranoPHPプロジェクトをデプロイしてみました。

概要図

Capistranoをインストールするサーバは一台だけです。
デプロイ先のアプリケーションサーバではログイン用アカウント(要sudo権限)を事前に作成しておきます。

インストール

上の図ではCapistranoソースコード管理サーバにインストールしています。
Capistranoを動かすにはRubyが必要になりますので、まずはRubyをインストールします。
Rubyのインストール方法は省略します。)
次に、以下のコマンドでCapistranoをインストール。

$ sudo gem install capistrano

使用方法

基本的にcapfileに一連の操作を記述し、あとはコマンド一発で実行です。
今回はdeploy.rbというファイルを用意しました。
deploy.rb

# 基本定義 
set :application,   "sample_app"    # アプリケーション名
set :user,          "deployer"      # sshでログインするユーザー(要sodo権限)
set :password,      "XXXXXX"        # パスワード

set :svn_repo,      "file:///usr/local/svn/repos/sample_app/trunk"  #svnリポジトリ
set :svn_pass,      "XXXXXX"                    # svnパスワード
set :checkout_dir,  "/home/deployer/checkout"   # checkout先ディレクトリ (*注意:ここで指定したディレクトリは一旦'rm -rf'で全消去されます)
set :tar_dir,       "/home/deployer"            # 圧縮ファイル置場
set :upload_dir,    "/home/deployer"            # 圧縮ファイルupload先ディレクトリ
set :deploy_dir,    "/var/www/sample_app"       # deploy先ディレクトリ (*注意:ここで指定したディレクトリは一旦'rm -rf'で全消去されます)

set :own_user,      "root"      # deploy後のown設定
set :own_group,     "root"      # deploy後のown設定


# サーバ定義 
role :cap, "localhost"      # ファイル管理サーバ
role :ap1, "192.168.10.2"  # アプリケーションサーバ(deploy先)


# check outタスク
task :checkout_, :roles => [:cap] do
    sudo "rm -rf #{checkout_dir}"
    sudo "mkdir #{checkout_dir}"
    sudo "svn co --username #{user} --password #{svn_pass} #{svn_repo} #{checkout_dir}"
    sudo "chown -R #{user} #{checkout_dir}"
    sudo "find #{checkout_dir} -name \".svn\" -type d | xargs rm -rf"
end

# 圧縮タスク
task :tar_, :roles => [:cap] do
    sudo "tar cvfz #{tar_dir}/dep.tar.gz -C #{checkout_dir} ."
    sudo "chown #{user} #{tar_dir}/dep.tar.gz"
end

# uploadタスク
task :upload_, :roles => [:ap1] do
    upload("#{tar_dir}/dep.tar.gz", "#{upload_dir}/dep.tar.gz", :via => :scp)
    sudo "rm -rf #{deploy_dir}"
    sudo "mkdir #{deploy_dir}"
    sudo "tar xvfz #{upload_dir}/dep.tar.gz -C #{deploy_dir}"
    sudo "chown -R #{own_user}:#{own_group} #{deploy_dir}"
    sudo "rm #{upload_dir}/dep.tar.gz"
end


task :deploy_, :roles => [:cap] do
    checkout_
    tar_
    upload_
end

以下のように実行します。

$ sudo cap -f deploy.rb deploy_


capfile(deploy.rb)解説

・基本定義
  ユーザーやパスワード、SVN設定、ディレクトリパスなどを定義しています。
・サーバ定義
  デプロイ元とデプロイ先のサーバを定義しています。
・check outタスク
 概要図の「check out」→「.svnディレクトリを削除」を実行します。
・圧縮タスク
 概要図の「圧縮」を実行します。
・uploadタスク
 概要図の「転送」→「前回のデプロイファイルを削除」→「展開」を実行します。

おわりに

上の例では使っていませんが、トランザクションロールバック機能などもあるようです。
Capistrano便利ですね!

参考サイト

http://doruby.kbmj.com/trinityt_on_rails/20080325/__Capistrano___1
http://d.hatena.ne.jp/japanrock_pg/20080729/