開発環境でsymfonyのプロジェクトをpost-commit + svn update + Capistrano + rsync + sshで簡単デプロイする方法

Share on Facebook
このエントリーをはてなブックマークに追加
Bookmark this on Google Bookmarks
Bookmark this on FC2 Bookmark
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip

Ruby on Rails用のデプロイツールであるCapistranoは、
Symfony等のPHPフレームワークのデプロイにも使用できますが、
普通(?)に使うと、svn export等でファイルを全取得する処理が入ったりするため、
デプロイに結構時間がかかります。

# ロールバック等が行えるため、本番環境でのデプロイでは非常に便利なのですが、
# 開発環境におけるデプロイにおいてはちょっと非効率な感じです。

そのため、Capistranoの標準的な手法は使わずに、
svnのpost-commitスクリプト/svn update/rsync/sshを組み合わせて使う方法を紹介します。

前提条件
 
・helloworldプロジェクトのsvnリポジトリ:     /var/www/svn/helloworld
・Capistranoスクリプトの保存先ディレクトリ:   /home/hoge/deploy
・シェルスクリプトの保存先ディレクトリ:       /home/hoge
・デプロイ先のDocumentRoot:                   /var/www/html/current
・svnにhogeユーザーでアクセス可能なこと。
・デプロイ元とデプロイ先のサーバーにそれぞれhogeユーザーが同じパスワードで作成されており、
  さらにパスワードを指定せずにsshでアクセス可能なこと。

# デプロイ元とデプロイ先のサーバーにsshでパスワード無しでアクセスする方法関しては
# こちらのページで解説されている方法が非常に参考になりました。

それでは以下、実際のスクリプトの作成方法を説明していきます。

# ————————————————
# Capistrano用スクリプトの作成
# ————————————————

# hogeユーザーで作業する
su – hoge

# デプロイ用のCapistranoスクリプトを配置するディレクトリを作成
mkdir -p /home/hoge/deploy

# デプロイ用のCapistranoスクリプトを作成
vi /home/hoge/deploy/deploy.rb

set :deploy_from, '/home/hoge/repos/helloworld'
set :deploy_to, '/var/www/html/current'
 
role :web, *%w[
  192.168.0.11
  192.168.0.12
]
 
task :rsync_task, :roles => ['web'] do
  find_servers_for_task(current_task).each do |server|
    `rsync -avz --delete -e ssh --exclude-from=#{deploy_from}/config/rsync_exclude.txt #{deploy_from} #{server.host}:#{deploy_to}`
    `ssh #{server.host} 'cd #{deploy_to}; chmod 777 cache/ log/; php #{deploy_to}/symfony cc;'`
  end
end

# デプロイ先のディレクトリを「current」にしていますが、
# Capistranoを本番用(?)に使うと、「current」ディレクトリがルートになるため、
# 本番環境のことを想定して「current」というディレクトリにデプロイしています。

# –exclude-fromにはsymfonyプロジェクトにデフォルトで作成されるrsync_exclude.txtを使用しています。
# 基本的には大体このファイルに書かれている設定で問題ないと思います。

# 実行権限を付加
chmod 755 /home/hoge/deploy/deploy.rb

# ————————————————
# svn updateとCapistranoスクリプトの呼び出しを行うシェルスクリプトを作成
# ————————————————

# hogeユーザーで作業する
su – hoge

# デプロイ元となるディレクトリを作成
mkdir -p /home/hoge/repos

# svnのソースをチェックアウト
cd /home/hoge/repos
svn checkout file:///var/www/svn/helloworld

# svnサーバーがデプロイ元と別のサーバーに存在する場合は
# 「svn checkout http://192.168.0.10/repos/helloworld」など。

# デプロイ用のメインスクリプトを作成
vi /home/hoge/deploy.sh

#!/bin/sh
 
HOME=/home/hoge
export HOME
cd /home/hoge/repos/helloworld
/usr/bin/svn update
 
/usr/local/bin/cap -f /home/hoge/deploy/deploy.rb rsync_task
 
# HOME環境変数を設定する箇所に関してですが、
# これはsvnの「post-commit」スクリプトから実行する場合を考慮しています。
 
# post-commitスクリプトは(私の環境では)apacheユーザーによって実行されますが、
# deploy.shスクリプトはhogeユーザーとして実行する必要があるため、
# post-commitスクリプト内部で「sudo -u hoge」してdeploy.shスクリプトを呼び出しています。
 
# しかし、sudo -u でhogeユーザーとしてsvn updateを実行しても、
# HOME環境変数はapacheユーザーの設定をそのまま引き継いでしまうため、
# 「svn: warning: Can't open file '/root/.subversion/servers': Permission denied」
# というエラーが発生します。
 
# HOME=/home/hogeはそのエラーに対処するためのコードになります。

# スクリプトに実行権限を付加
chmod 755 deploy.sh

# ————————————————
# svnにコミットした後で自動実行されるpost-commitスクリプトを作成
# ————————————————

# rootユーザーとして作業する。
su -

# svnのpost-commitスクリプトを編集
cd /var/www/svn/helloworld/hooks
cp post-commit.tmpl post-commit
chmod a+x post-commit
chown apache:apache post-commit

vi /var/www/svn/helloworld/hooks/post-commit

REPOS="$1"
REV="$2"
#mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
 
sudo -u hoge /home/hoge/deploy.sh > /dev/null 2>&1

# sudo -uを実行するためにvisudoで設定ファイルを変更
visudo

Defaults requiretty

Defaults !requiretty
に変更

# これをやらないと、apacheユーザーでsudoを実行した際に
# sudo: sorry, you must have a tty to run sudo
# という、「端末から実行してください」というエラーになります。

apache ALL=(hoge) NOPASSWD: /home/hoge/deploy.sh
hoge ALL=(hoge) ALL

# 上記により、apacheユーザーがsudo -u hogeでデプロイスクリプトを
# パスワード入力なしで実行する権限が設定され、
# さらにsudo -u の引数にhogeを指定可能になります。

以上でスクリプトの作成と設定は完了です。
クライアントからsvnのhelloworldプロジェクトにファイルをコミットすれば、
post-commitスクリプトが自動的に実行され、各サーバーへのデプロイが行われます。

Leave a Reply