概要
PHPのレガシーなプロジェクトをCapistranoでdeployする
環境
- Ruby 1.9.3
- Capistrano 2.x
- PHP
- Subversion
備考
Capistrano 3.xはSubversionに未対応のようなので、2.xを使う。
Rubyはrbenvなどを使い、1.9.3以降をインストールする。2.0でも大丈夫な模様。
インストール
バージョンを指定するために、以下のようなGemfileを作成する。
source 'https://rubygems.org'
gem 'capistrano', '~> 2.0'
gem 'capistrano-ext'
gem 'capistrano_colors'
gem 'railsless-deploy'
bundleでインストールする。
$ gem install bundle
$ rbenv rehash
$ bundle install
$ rbenv rehash
ひながた作成
適当なディレクトリを決めて、capifyでひながたを作る。Capfileやconfig/deploy.rbが生成される。
$ capify .
設定
基本的なタスクは内蔵されているので、config/deploy.rbに少し追記するだけでよい。
capistrano-extで複数の環境にも対応できる。
config/deploy.rbに共通の設定を記述し、config/deploy/以下に環境ごとのファイルを置く。
デバッグなどでローカルからローカルにdeployする場合は、copy_remote_dirを指定してファイル名を変更する必要がある。
ログをファイルに出力したいときはloggerの部分をコメントアウトする。
config/deploy.rb
require 'capistrano/ext/multistage'
require 'capistrano/logger'
set :default_stage, "staging"
set :application, “hoge"
set :scm, :subversion
set :deploy_via, :copy
set :copy_exclude, [".svn", "**/.svn"]
set :use_sudo, false
#set :copy_remote_dir, "/home/www/tmp"
set :ssh_options, {
user: 'www-data',
keys: %w(~/.ssh/id_rsa_www-data)
}
#output = './capistrano.log'
#custom_logger = Capistrano::Logger.new(:output => output)
#custom_logger.level = Capistrano::Logger::TRACE
#self.logger = custom_logger
個別の環境のタスク。
define文で定義されている定数をsedで無理やり書き換えてみた。
config/deploy/staging.rb
set :repository, "https://hoge.com/svn/hoge/branches/hoge"
set :deploy_to, "/home/www/hoge-staging"
set :copy_cache, "./checkout/staging"
role :web, “localhost"
role :app, "localhost"
role :db, "localhost", :primary => true
role :db, "localhost"
def self.modify_constant(file, sym, val)
options = "s%define.*['\\\"]#{sym}['\\\"].*%define('#{sym}', #{val});%"
run "sed -i \"#{options}\" #{release_path}/#{file}"
end
namespace :deploy do
task :restart, :except => { :no_release => true } do
#do nothing.
end
task :finalize_update, :except => { :no_release => true } do
self.modify_constant(‘config/database.php’, ’MYSQL_HOSTNAME', “’localhost'")
run "mkdir -p #{release_path}/smarty/compile"
end
after "deploy:update", :except => { :no_release => true } do
cleanup
end
end
実行
defaultの環境の場合
$ cap deploy
環境を指定する場合
$ cap staging deploy