Capistranoでデプロイ環境を構築する

今までずっと使わず嫌いだったCapistranoをやっと使ってみようと思う。

やりたい事はこんな感じ

  1. テスト環境で開発したソースをSVNにコミットする
  2. ステージ環境にて、テスト環境でコミットされたソースをアップデートで取得
  3. デプロイ後の公開環境と、現在の公開環境の修正差分をrsyncで確認し、修正差分を取得する
  4. 3.で作成したデータを元に、修正差分のみデプロイする

※前提として、同じサーバ内にステージ環境と公開環境があるものとする
※修正差分のみデプロイの部分は、rsyncで実現してみる

とりあえずCapistranoをインストールしなきゃ始まらない。

$ gem install -y capistrano
$ cap --version
Capistrano v2.12.0

こんな感じでバージョンが帰ってきたらインストール完了。

通常だと、次にはcapifyコマンドでCapfileとdeploy.rbを生成し、そこを修正していく感じになるようだが、今回は直接deploy.rbファイルを作成して、それを編集する方法でやってみた。

で、その時にいくつかエラーが出たので、一応記録しておく。

connection failed for: localhost (Errno::ECONNREFUSED: Connection refused – connect(2))エラー

そもそも何も指定していないと、SSHでアクセスにいく場合22番ポートを見に行くようなのだが、設定しているサーバのSSHポートは22じゃなかったのでエラーが出たらしい。
以下のようにdeploy.rbでポートを設定。

set :ssh_options, :port => "ポート番号"

sorry, you must have a tty to run sudo エラー

TTYがないとsudoが実行できないよってエラーらしい。
回避するには、/etc/sudoersの「Defaults requiretty」の記述をコメントアウトしたり、sshに-tオプション付けたりするらしいが、一番良いのはdeploy.rbに以下の記述を追加する事っぽい。

default_run_options[:pty]= true

これでエラーが消えたので、デプロイの準備が整った。

で、今回やりたい事を実現するdeploy.rubyはこんな感じになった。
※細かいところが全然設定できていないので、そのまま使わないようにしてください。

default_run_options[:pty]= true

set :application, "deploy.test" # アプリケーション名
set :ssh_options, :port => "XXXX" # ポート指定
set :user, "SSH_USER" # sshでログインするユーザー(要sodo権限)
set :password, "SSH_PASSWORD" # パスワード
set :svn_repo, "SVN_URL" # svnリポジトリ
set :svn_user, "SVN_USER" # svnユーザー
set :svn_pass, "SVN_PASSWORD" # svnパスワード
set :export_dir, "/path/to/export" # export先ディレクトリ
set :deploy_dir, "/path/to/deploy" # deploy先ディレクトリ
# サーバ定義
role :cap, "localhost" # ファイル管理サーバ
role :ap1, "localhost" # アプリケーションサーバ(deploy先)

# exportタスク
task :export_, :roles => [:cap] do
sudo "rm -rf #{export_dir}"
sudo "svn export --username #{svn_user} --password #{svn_pass} #{svn_repo} #{export_dir}"
sudo "chown -R #{user} #{export_dir}"
end

# rsyncタスク
task :rsync_, :roles => [:cap] do
sudo "rsync -av --delete #{export_dir}/ #{deploy_dir}/"
end

task :deploy_, :roles => [:cap] do
export_
rsync_
end

で、コマンドをたたく。

$ sudo cap -f deploy.rb deploy_

これでデプロイできる事が確認できた。
次は、jenkinsと連動させてみようかな。

今回はここら辺の情報を非常に参考にさせていただきました。m(__)m

任意のリビジョン間で更新したファイルだけを抽出したい – Tips&Tricks/
CentOS5にrubygems+Capistrano(カピストラーノ)を入れてSVNからデプロイ設定 – oggataの日記
Capistrano(カピストラーノ)でPHPプロジェクトをデプロイ – yamada6789の日記

2012/7/25追記
jenkinsと連携するには以下のようなコマンドを、ビルド>シェルの実行に設定すればOK
ただこのままだとビルドしたときに勝手に本番に公開されてしまうので、今の構成では使えないかな。

/usr/local/bin/cap -f _setting/deploy.rb deploy_