Easier Capistrano Deployment with legacy databases.
Saturday, May 17th, 2008As my last Rails project was drawing to a close and deployment tasks were closing in, it became apparent I’d have my work cut out for me when deploying each box. This project was in no way adhering to “the Rails way” with regards to database architecture(or anything else for that matter…..a topic for another post).
With this odd system setup I had to get creative with the Capistrano deployment file. I’ve include my solution to the legacy db problem. As you will see, I’ve added “before” and “after” method calls to handle the proper linking of the project and it’s database.yml after building it from within my deploy.rb file.
So what happens now?
Now when you run cap:deploy from your app root the :db namespace will be run prior to the usual setup. This will build the database.yml file from the entry examples below and process the symlink updates after the script has completed.
Voila! A nice, easy way to manage connections to multiple databases through capistrano.
require 'erb'
#require 'mongrel_cluster/recipes'
before “deploy:setup”, :db
after “deploy:update_code”, “db:symlink”
set :user, “–yourusername–”
set :used_sudo, “true”
set :svn_user, ENV[’svn_user’] || “yoursvnusername”
set :svn_password, Proc.new { Capistrano::CLI.password_prompt(’SVN Password: ‘) }
set :repository,
Proc.new { “–username #{svn_user} ” +
“–password #{svn_password} ” +
“–no-auth-cache ” +
“http://–yoursvnurl–/”}
set :spinner, “false”
set :application, “–yourappname–”
set :deploy_to, “/var/www/#{application}”
set :mongrel_conf, “#{deploy_to}/current/config/mongrel_cluster.yml”
role :app, “yourip”
role :web, “yourip”
# role :app, “yourip”
# role :web, “yourip”
# role :db, “yourip”, :primary => true
role :db, “yourip”, :primary => true
namespace :db do
desc “Create database.yml in shared/config”
task :default do
database_configuration = ERB.new <<-EOF
development:
adapter: sqlserver
mode: odbc
dsn: dsn1
username:
password:
test:
adapter: sqlserver
mode: odbc
dsn: dsn1
username:
password:
production:
adapter: sqlserver
mode: odbc
dsn: dsn1
username:
password:
legacy_db1:
adapter: sqlserver
mode: odbc
dsn: dsn2
username:
password:
legacy_db2:
adapter: sqlserver
mode: odbc
dsn: dsn3
username:
password:
legacy_db3:
adapter: sqlserver
mode: odbc
dsn: dsn4
username:
password:
EOF
run “mkdir -p #{deploy_to}/#{shared_dir}/config”
put database_configuration.result, “#{deploy_to}/#{shared_dir}/config/database.yml”
end
desc “Link in the production database.yml”
task :symlink do
run “ln -nfs #{deploy_to}/#{shared_dir}/config/database.yml #{release_path}/config/database.yml”
end
end