Automatize o deploy dos seus projetos com Fabric

Durante a minha árdua trajetória com o PHP, sempre fiz “subidas” de projetos utilizando um cliente FTP. Um processo manual, extremamente repetitivo (e chato).

Já com Python, pude utilizar o SSH, que me proporcionou maior agilidade e liberdade dentro do ambiente de produção. Mas que não deixou de ser um processo manual, extremamente repetitivo, chato e muito suscetível a falhas.

Foi utilizando o Django que conheci o Fabric, e percebi quanto tempo podemos economizar automatizando o processo de deploy de nossos projetos.

O agile e o deploy contínuo

Todo e qualquer procedimento de upload do seu projeto para o ambiente de produção corre algum tipo de risco. Com o deploy automatizado, a tendência é que este risco seja reduzido, e que você possa fazer a entrega do seu projeto para diversos ambientes com o menor esforço possível.

Logo, não consigo imaginar um cenário eficiente de deploy contínuo, sem a utilização de alguma ferramenta de automatização. É através destas que respeitamos uma das premissas do agile, e diminuímos a incidência de falha humana.

Mas o que é o Fabric?

O Fabric é uma lib Python, e ferramenta de linha de comando, para auxiliá-lo em seu deploy e na administração remota dos seus sistemas.

Embora seja feita em Python, pode ser utilizada em projetos escritos em qualquer linguagem. Equivale ao Capistrano, alternativa mais famosa, escrita em Ruby.

Em casa de ferreiro, espeto de ferro

Para dar um exemplo de uso do Fabric, podemos utilizar o esquema de deploy deste blog. Sim! O processo está automatizado, e você pode conferí-lo no BitBucket.

Antes de mais nada, é necessário ter o Fabric instalado:

$ pip install fabric

Todo o procedimento será escrito em um arquivo chamado fabfile.py. Com o comando fab, a ferramenta carregará este arquivo e permitirá a execução de todos os métodos públicos definidos dentro dele.

Vamos listar todos os métodos que criei no fabfile.py do blog:

$ fab -l

Available commands:

bootstrap            Initialize remote host environment.
collect_static       Collect all static files from Django apps and copy ...
create_virtualenv    Setup virtualenv on remote host.
database_restart     Restart the database server on remote server.
deploy               Send the code to the remote host.
http_restart         Restart the HTTP server on remote server.
migrate              Execute South on remote host, to update the databas...
production           Use production environment on remote host.
staging              Use staging environment on remote host.
syncdb               Execute syncdb on remote host.
update_apache_conf   Move apache and fastcgi files to the public html.
update_requirements  Update Python dependencies on remote host.

Como é possível notar na listagem acima, temos operações de deploy (deploy, syncdb, update_requirements e updateapacheconf) e operações de administração remota (database_restart, http_restart, migrate, etc). Os métodos production e staging são basicamente para “setar” para qual ambiente o deploy será realizado. Por exemplo, a cada nova subida de release, executo o seguinte comando:

$ fab production deploy http_restart

Onde basicamente:

  • Defino o usuário, IP, e paths para o ambiente de produção através do método production.
  • Executo o envio dos arquivos através de Rsync para o servidor, com o método deploy.
  • Reinicio o Apache através do método http_restart.

Se olharmos atentamente o método deploy, utilizamos uma lib (importada no início do arquivo) chamada rsync_project. Que corresponde a ferramenta de linha de comando (encontrada em sistemas baseados em Unix) chamada rsync. O que o Fabric faz (com maestria) é “abstrair” essas operações para que possamos fazer os nossos procedimentos através de uma interface simples (outros comandos, como scp e sudo também são utilizados pelo Fabric).

A função run faz grande parte da magia acontecer. Com ela, abrimos uma conexão SSH com o nosso servidor, e executamos comandos como se estívessemos em um terminal. Extremamente útil para fazer restart de serviços, escalonamento de logs, limpeza de temporários, etc.

Considerações finais

O Fabric é muito simples de usar. Lendo o básico da documentação, já somos capazes de automatizar os processos mais triviais.

Recomendo o fabfile.py da Caktus Consulting Group. Simples e bem escrito, foi nele que me baseei para escrever o script apresentado neste post.

Referências