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.
O setup só precisa ser rodado uma única vez.
Depois de configurado, para publicar a sua aplicação basta fazer isso:
Mágico né?
Fez merda e publicou alguma coisa que não devia? Faça um rollback!
Algumas considerações sobre essa receita:
- 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.
- 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.
- 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/.
- 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.
- 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.