Marcio Trindade

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.

config/deploy.rb
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