CentOS5にrubygems+Capistrano(カピストラーノ)を入れてSVNからデプロイ設定

CentOS5にrubygems+Capistrano(カピストラーノ)を入れる


(参考)
スライド
http://www.slideshare.net/T2J/capistrano-tips-tips
deploy.rbが分りやすい!
http://d.hatena.ne.jp/yamada6789/20110108/1294450383


オープンソーシャルゲームの「5秒ルール」に対抗する為に
アプリケーションサーバー台数を増やそうと計画中。
リリース作業の手間を減らすために、デプロイツールを導入したので
手順と運用をメモメモ。

http://ncloud.cocolog-nifty.com/blog/2011/05/capstranochef15.html
によるとCapistranoニフティクラウドのOS設定〜ミドルウェアのセットアップまで
行えるようですが、今回は
SVN上のソース-->本番サーバーへリリース
の流れのみを行う予定!

インストール編

yumでインストールできるrubyで動かないので、1.8.6をソースからインストール。

0)古いrubyを削除
yum remove ruby-libs
1)ruby1.8.6のインストール
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6.tar.gz
# tar zxvf ruby-1.8.6.tar.gz
# cd ruby-1.8.6
# ./configure --prefix=/usr
# make
# make install
2)gem1.3.1のインストール
# wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz
# tar xzf rubygems-1.3.1.tgz
# rm rubygems-1.3.1.tgz
# cd rubygems-1.3.1
# ruby setup.rb
3)capistoranoインストール
# sudo gem install capistrano -y
Successfully installed highline-1.6.9
Successfully installed net-ssh-2.2.1
Successfully installed net-sftp-2.0.5.......
Successfully installed capistrano-2.9.0
1 gem installed
4)バージョン確認
cap -v

[/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- openssl (LoadError)]
OpenSSLが入っていないというエラーが出力。

5)opensslをいれる
yum -y install gcc zlib-devel openssl-devel
6)RubyにOpenSSL対応でコンパイル
cd /tmp/ruby-1.8.6/ext/openssl <-rubyのソースがある場所へ移動
ruby extconf.rb --with-openssl
make install
7)capistoranoインストール
sudo gem install capistrano -y
8)cap -v
9)色づけ
gem install capistrano_colors

※rbファイルのなかで
require 'capistrano_colors'
が追加必須


失敗編

sudo yum install ruby ruby-rdoc ruby-devel ruby-libs
で行うとrailsのインストール時に
「ERROR: Error installing rails:rake requires Ruby version >= 1.8.6」
と怒られるのでrubyは1.8.6以上が必要そう。
またrailsなしにcapistoranoインストールしようとすると
「ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0 アボートしました」と怒られるので
railsも必要そう。

運用編

[別のサーバーに入ってディスク容量をチェックするコマンド]

cd /var/www/
mkdir capfile <-CAP用ディレクトリ
cd capfile 
vim Capfile
-------------------------------------
role :server, '192.168.0.1'

set :user, 'root'
set :password, 'XXXXXXX'

desc "reporting disk usage with 'df -h'"
task :check_disk, :roles => :server do
  run 'df -h'
end
-------------------------------------
#cap check_disk

[別のサーバーにファイルをアップロードするコマンド]

cd /var/www/
mkdir capfile <-CAP用ディレクトリ
cd capfile 
vim Capfile
role :server, '192.168.0.1'
set :user, 'root'
set :password, 'test'
desc "reporting disk usage with 'df -h'"
task :check_disk, :roles => :server do
  run 'df -h'
end
role :ap1, "192.168.0.2"  # アプリケーションサーバ(deploy先)
task :upload_, :roles => [:ap1] do
    upload("/var/www/html/aaa.txt", "/var/www/html/aaa.txt", :via => :scp)
end
#cap upload_

[SVNから本番環境へ自動デプロイ]

http://d.hatena.ne.jp/yamada6789/20110108/1294450383
を参照しました。ありがとうございました。

1点。apacheを利用したsvnの場合、下記の
SVNパスワードは適当で動く様子。

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

set :svn_repo,      "http://192.168.0.1/svn/repos/bank/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先ディレクトリ。このディレクトリを予めつくっておかないと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.0.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_


結果) [err :: localhost] sorry, you must have a tty to run sudo というエラーが起こる
原因)sudo がコンソールでのみの起動を想定しているため起こる。
解決策)
vim /etc/sudoers
#Defaults requiretty <-デフォルトのTTYをコメントアウトする