A switchtower recipe to copy rather than checkout


#1

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 :slight_smile:

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


#2

Jim,

Great stuff! I never really liked the idea of having the production
machines have direct access to the source control. Thanks for sharing.

-Curtis