Jim Morris
2006-Feb-25 22:29 UTC
[Rails] a switchtower recipe to copy rather than checkout
For those who want use switchtower to deploy to a remote server that does not have access to the main subversion repository, here is a task I just hacked up to use switchtower to deploy to my servers by copying a local directory to the servers, rather than have the servers use svn checkout. I actually create my local directory using an svn export, but you can do whatever you like here, and just deploy a local copy of your development directory tree if you like. You can also exclude whatever directories or files you want using tar''s --exclude FILE option. I include my after_update_code as this seems something most people need to do. This could be done a lot better but it works :) desc "fix up database and .htaccess" task :after_update_code do run "cp #{release_path}/config/database.yml.templ #{release_path}/config/database.yml" run "cp #{release_path}/public/dot.htaccess.deploy #{release_path}/public/.htaccess" end desc <<DESC Update all servers with the latest release of the source code. This is a modified version that copies a local copy to the remote site DESC task :update_code, :roles => [:app, :db, :web] do on_rollback { delete release_path, :recursive => true } #puts "doing my update_code" temp_dest= "tmp_code" #puts "...get a local copy of the code into #{temp_dest} from local svn" # but this could also just be your local development folder system("svn export -q #{configuration.repository} #{temp_dest}") #puts "...tar the folder" # you could exclude files here that you don''t want on your production server system("tar -C #{temp_dest} -c -z -f code_update.tar.gz .") #puts "...Sending tar file to remote server" put(File.read("code_update.tar.gz"), "code_update.tar.gz") #puts "...detar code on server" run <<-CMD mkdir -p #{release_path} && tar -C #{release_path} -x -z -f code_update.tar.gz && rm -rf code_update.tar.gz && rm -rf #{release_path}/log #{release_path}/public/system && ln -nfs #{shared_path}/log #{release_path}/log && ln -nfs #{shared_path}/system #{release_path}/public/system CMD #puts "...cleanup" system("rm -rf #{temp_dest} code_update.tar.gz") end