Marcio Trindade

13Ago/090

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

Comentários (0)

Nenhum comentário ainda.


Deixe um comentário


(não será divulgado)