Diminua o tempo de deploy do capistrano
Recentemente Chris Wanstrath publicou no Blog do Github um artigo muito legal falando como ele consegui mudar o deploy do github de 15 minutos pra 14 segundos.
Empolgado com a façanha dele eu dei uma estudada no que o ele estava fazendo e procurei aplicar na minha receita também. A minha alteração diferente da dele foi bem mais simples e em un único arquivo, porém com um resultado satisfatório.
O Capistrano é uma GEM que faz o trabalho sujo de deploy pra você, porém ele foi feito pra utilizar SVN. Após um tempo ele passa a aceitar GIT também para o deploy porém a forma de trabalhar dele não foi alterada. Acredito que a maioria das pessoas que utilizam ele com GIT sepre ficou se perguntando o porquede ter os releases antigos se o repositório está ali e pode simplemente voltar versão em vez de releases e foi exatamanete o que eu fiz, sobrescrevi alguns passos a fim de não criar mais o diretório releases e não mais criar novas releases e fazer um clone do projeto inteiro, e sim fazendo um fetch + reset. Abaixo você pode ver um exemplo da minha receita.
set :user, "user" #to change
set :host, "server_ip" #to change
set :domain, "domain.com" #to change
set :application, "app_name" #to change
set :deploy_to, "/home/#{user}" #to change
set :repository, "git://github.com/marciotrindade/base_app_with_cake.git" #to change
set :branch, "origin/master"
# =============================================================================
role :web, host
role :app, host
role :db, host
set :scm, :git
set :current_release,
ssh_options[:username] = user
ssh_options[:paranoid] = false
# =============================================================================
desc "send config files to server"
task :before_setup do
run "test -d #{deploy_to}/etc || mkdir -m 755 #{deploy_to}/etc"
upload File.join(File.dirname(__FILE__), "templates/database.yml"), "#{deploy_to}/etc/database.yml"
end
namespace :deploy do
desc "Restart with Passenger"
task :restart, :roles => :app do
run "touch #{deploy_to}/current/tmp/restart.txt"
end
desc "Setup a GitHub-style deployment."
task :setup, :except => { :no_release => true } do
run "git clone #{repository} #{current_path}"
run "test -d #{current_path}/tmp || mkdir -m 755 #{current_path}/tmp"
run "test -d #{current_path}/db || mkdir -m 755 #{current_path}/db"
end
desc "Update the deployed code."
task :update_code, :except => { :no_release => true } do
run "cd #{current_path}; git fetch origin; git reset --hard #{branch}"
end
desc "check if the configurations files are present"
task :symlink do
on_rollback {}
run <<-CMD
rm -rf #{current_path}/log #{current_path}/public/system #{current_path}/tmp/pids #{current_path}/config/database.yml &&
ln -s #{shared_path}/log #{current_path}/log &&
ln -s #{shared_path}/system #{current_path}/public/system &&
ln -s #{shared_path}/pids #{current_path}/tmp/pids &&
ln -s #{deploy_to}/etc/database.yml #{current_path}/config/database.yml &&
cd #{current_path} && rake db:migrate RAILS_ENV=production
CMD
end
namespace :rollback do
task :default do
revision
restart
end
desc "Rollback a single commit."
task :revision, :except => { :no_release => true } do
set :branch, "HEAD^"
default
end
end
end
Se tiverem dúvias ou sugestões por favor me envie um email atraves da página de contato