Deployment automatizado de aplicação PHP com Capistrano

In: bash| linux| php| ruby

29 ago 2009

Os que me conhecem sabe quanto o Rails Summit 2008 mudou a minha vida profissionalmente. Eu já sabia que as coisas haviam evoluído mas sinceramente nunca tinha dado muita bola, pois os meus processos sempre funcionaram bem. Lá eu pude ver que muita coisa legal estava sendo feita e eu que não podia ficar de fora. Uma delas foi o deployment automatizado.

Capistrano

O Capistrano é uma RubyGem que permite que você escreva receitas para publicação em servidores web. É possível usa-la integrada com o seu repositório (centralizado ou distribuído) ou mesmo copiar-tudo-compactar-e-enviar automaticamente. Ele permite manter várias versões da aplicação no servidor (e fazer rollback se necessário) e utiliza links simbólicos para dizer qual delas é a atual.

A instalação é mais facil que fazer miojo:

$ sudo gem install capistrano

É necessário ter o Ruby e o RubyGems instalado no seu sistema. Se você usa Ubuntu, eu posso ajudar.

Configurando o seu projeto

Dentro do diretório do seu projeto, crie a estrutura basica do capistrano:

$ capify .
# [add] writing `./Capfile'
# [skip] `./Capfile' already exists
# [add] writing `./config/deploy.rb'
# [done] capified!

Notem que o arquivo config/deploy.rb foi criado. É nele que você irá escrever a sua receita.

Exemplo de receita usando estratégia de cópia

role :web, "dominio.com.br"
role :app, "dominio.com.br"

set :application, "aplicacao"
set :repository, "."
set :scm, :none
set :deploy_via, :copy
set :copy_compression, :bz2
set :copy_exclude, ["lixo", "config"]
set :user, "usuario"
set :use_sudo, false
set :keep_releases, 5
set :app_symlinks, ["f"]
set :normalize_asset_timestamps, false
set :deploy_to, "~/php_apps/#{application}"
set :public_path, "~/public_html"

ssh_options[:keys] = ["#{ENV['HOME']}/.ssh/id_rsa"]

namespace :deploy do
   # Anula o restart do servidor
   desc "Fake restart"
   task :restart, :roles => :app do
      run "exit"
   end
end

task :define_conf_files, :roles => [:app] do
   run "rm -rfd #{release_path}/conf.php"
   run "ln -nfs #{release_path}/conf-online.php #{release_path}/conf.php"
end

desc "Setup application symlinks in the public"
task :symlinks_setup, :roles => [:web] do
   if app_symlinks
      app_symlinks.each { |link| run "mkdir -p #{shared_path}/public/#{link}" }
   end
end

desc "Link public directories to shared location."
task :symlinks_update, :roles => [:web] do
   if app_symlinks
      app_symlinks.each { |link| run "ln -nfs #{shared_path}/public/#{link} #{current_path}/#{link}" }
   end
   run "ln -nfs #{current_path} #{public_path}"
end

after "deploy:update_code", :define_conf_files
after "deploy:symlink", "symlinks_update"

Usando o Capistrano

Após estar com a receita devidamente escrita, é hora de configurar o servidor online para a estrutura do Capistrano.

$ cap deploy:setup

O setup só precisa ser rodado uma única vez.

Depois de configurado, para publicar a sua aplicação basta fazer isso:

$ cap deploy

Mágico né?

Fez merda e publicou alguma coisa que não devia? Faça um rollback!

$ cap deploy:rollback

Algumas considerações sobre essa receita:

  1. FAÇA BACKUP! Antes de começar a testar o capistrano, tenha certeza que os arquivos da sua aplicação estão protegidos e você não irá fazer cagada.
  2. Por se tratar de uma aplicação em PHP, não é necessário reiniciar o servidor como em aplicações Rails. Por isso reescrevi a tarefa restart para que ele não faça nada.
  3. A aplicação em questão permite o upload de arquivos pelos usuários, sendo necessário criar links simbólicos para manter esses dados fisicamente fora da estrutura da aplicação que será enviada pelo Capistrano. Nesse caso, todos os arquivos que serão enviados pelos usuários ficam no diretório /f/.
  4. Como os ambientes de desenvolvimento e produção são sensivelmente diferentes, optei por manter dois arquivos de configurações separados: conf.php e conf-online.php. A aplicação faz referência ao conf.php e durante a publicação, o Capistrano se encarrega de apagar o arquivo de desenvolvimento e faz um link simbólico para o arquivo de produção.
  5. Essa receita resolve O MEU PROBLEMA. Espero que possa ser útil para você.

Se ficou interessado em usar o Capistrano para publicar a sua aplicação, sugiro fortemente que leia a documentação para maiores detalhes.

Comment Form

Sobre

Ricardo Duarte, 26 anos, trabalha na Nuntec, atua como desenvolvedor web a mais de 12 anos, já tendo passado por diversas tecnologias. Este blog irá comentar um pouco destas experiências.

rduarte's tweets

  • Venicios Ribeiro: É uma excelente forma de ativar o cache. Existem tbm outras tecnicas muito simples, como o Gzip. à [...]
  • Andre Ferraro: Muito bom!! Estou fazendo o meu e vou postar no meu blog. Vlw!! [...]
  • paulo henrique: Bom dia! existe algum app para usar o twitter no e71, que seja free [...]
  • Ricardo: Bruno, Aplicativo para IM com vídeo eu não conheço, mas para áudio você pode usar o Nimbuzz [...]
  • Bruno: Olá boa tarde. Gostaria de saber qual software IM pro E71 suporta conversação com áudio e video. [...]