LoginSignup
12
11

More than 5 years have passed since last update.

PHP+Subversion+Capistrano

Posted at

概要

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

参考

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11