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