PHP Deploy com Capistrano

Deploy é o processo (ou processos) quem dispobiliza a sua aplicação para uso, no nosso caso disponibilizar na internet, antigamente usavamos o FTP (não tão antigamente quanto eu gostaria), hoje temos práticas e ferramentas bem mais interessantes.

A grande vantagem do formato de deploy que quero apresentar é a segurança e maleabilidade que ele oferece, você pode voltar para versões anteriores quando quiser e ele só atualiza o servidor se os testes passarem (caso você use TDD), o deploy caminha em um ritmo compassado, são só algumas configurações iniciais (um pouco mais para quem precisa instalar e configurar tudo da primeira vez).

Então eu pergunto: quem nunca fez algo assim com FTP:

  • Apagou/Moveu um diretório sem querer
  • Enviou código bugado para o servidor
  • Sobrescreveu um arquivo de configurações (de banco de dados, por exemplo) que não deveria.

Da forma que vou apresentar, você não vai mais ter estes problemsa, todo o processo é simples e rápido, um único comando no seu computador e o seu código é testado, enviado para um repositório central (GitHub, Bitbucket ou outro), para o servidor de hospedagem e ainda executa o Composer e outras tarefas que você crie.

Definir isso em uma palavra?

Continuous Integration, mesmo que só uma etapa do processo.

Git, GitHub e Bitbucket

Trabalhar com Git no dia a dia é uma excelente prática, mantemos backups de todas as alterações em todos os arquivos, registra exatamente aonde as alterações foram feitas e o que tinha antes, gera relatórios em tempo real, facilita o gerenciamento entre você e sua equipe e ainda fornece uma forma eficiênte de compartilhar o seu código entre vários servidores.

Se você não usa Git eu tenho um curso gratuito sobre o assunto, mas ainda temos outras opções também gratuitas e outros pagos, mas de baixo investimento, exitem muito material sobre o assunto na internet.

É uma boa prática manter um repositório central com as alterações mais rescentes, neste caso temos dois muito bons, o GitHub e o BitBucket.

O Github é bem mais usado pela comunidade de desenvolvedores e muitos usam para aplicações e códigos open-source.

O Bitbucket tem a vantagem de oferecer repositórios privados gratuitos, ao tempo que no Github estes são pagos.

Não vou entrar no mérito de vatagens e desvantagens, ambos são excelentes. Eu uso o Github para tudo, repositórios privados e pagos.

Preparando o Git

Não importa se você tem um projeto pronto ou vai começar algo agora, por enquanto. Prepare o terreno com os itens abaixo

  1. Instale o Git
  2. Crie um repositório no GitHub ou Bitbucket
  3. Crie um respositório local (continue lendo para aprender)

Somente estes passos já dariam um ótimo artigo, por questão de tempo e espaço vou pular os dois primeiros passos que são deveras simples e bem documentados com milhares de artigos na internet.

Vou levar em conta que você tem o link do seu repositório (o mesmo usado no comando git clone, por exemplo), de uma olhada em como encontrar o link SSH do seu repositório.

Rode os comandos abaixo no diretório do seu projeto.

git init
git remote add link-do-repositorio origin
git add .
git push origin master

Lembre-se de trocar o link-do-repositorio pelo link do seu repositório no GitHub ou BitBucket, aquele que já comentei acima.

Lembre-se que você precisa ter o Git instalado no servidor de hospedagem também.

Assim que ver seus arquivos no seu repositório central a primeira parte está pronta.

Acesso SSH

Agora que já temos o repositório pronto vamos automatizar a autenticação, isso é simples, vamos precisar gerar um par de chaves de segurança e inserir no computador local, no servidor e no GitHub e/ou BitBucket.

Linux

Para gerar as chaves (par = 2) no Linux é simples. Primeiro verifique se você não tem nenhuma já pronta (vai saber, né), acesse o diretório ~/.ssh assim:

cd ~/.ssh

E verifique se existem dois arquivos chamados algo e algo.pub, normalmente o algo é id_rsa ou id_dsa. Se você não tiver estes arquivos ou diretório então rode o comando a baixo para criar:

ssh-keygen

Você vai precisar confirmar alguns dados, vou listar a saída toda do comando pra você se preparar.

Generating public/private rsa key pair.
Enter file in which to save the key (/home/seunome/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/seunome/.ssh/id_rsa.
Your public key has been saved in /home/seunome/.ssh/id_rsa.pub.
The key fingerprint is:
43:c5:5b:5f:b1:f1:50:43:ad:20:a6:92:6a:1f:9a:3a seu@email.com

Note na saída do comando que coloquei acima que você pode trocar o nome do arquivo (linha 2) e colocar uma senha e confirmar (linha 3 e 4) ou até deixar em branco.

Com isso sua chave está gerada.

Windows

Se você usa Windows, os passos acima funcionam se você usar o MSysGit (https://msysgit.github.io/).

Informações mais detalhadas sobre geração de chaves SSH

https://help.github.com/articles/generating-ssh-keys/

Configurando o servidor

Agora que temos nosso par de chaves, vamos configurar o servidor de hospedagem, por questão de tempo, espaço e reusabilidade vou passar um link oficial do Git em português com um passo a passo que eu mesmo utilizo.

Acesse com seu usuário e senha o seu servidor de hospedagem via SSH e siga os passos deste guia.

Não esqueça de incluir sua chave ssh no GitHub e/ou BitBucket também, aqui como fazer isso:

Neste segundo link você pode ir direto ao passo 6, ok?

Prontinho!

Instalando o Capistrano

Finalmente, o Capistrano é uma ferramenta para deploy escrita em Ruby, mas que suporta qualquer linguagem.

Por ser escrito em Ruby, você precisa do Ruby instalado (dah!!), na verdade você já deve ter se usa SASS, por exemplo, se não tem de uma olhada neste link.

O processo é simples, tem uma lista de sistemas operacionais, você pode escolher o seu e seguir o passo a passo, aqui foi só um apt-get install ruby-full e pronto.

Para instalar o Capistrano apenas rode o comando abaixo.

gem install capistrano

Não é necessário fazer isso no servidor de hospedagem, não esqueça que você pode ter agum erro de permissão em qualquer processo de instalação, você só precisa rodar novamente como administrador.

Preparando o Capistrano

Agora acesse o diretório raiz do seu projeto (em linha de comando) no seu computador e vamos criar a estrutura inicial que o Capistrano vai usar para para o processo de Deploy, é simples, não acredita?

cap install

Viu como é simples, ele vai criar um arquivo chamado Capfile e dois diretórios chamados config e lib, vamos usar o config para informar os dados de acesso a cada um dos servidores (sim, você pode ter um ambiente de testes (staging), o servidor de produção (production), e quantos mais forem necessários), seu diretório config deve ter os seguintes arquivos.

config/
- deploy
- production.rb
- stagin.rb
- deploy.rb

Vamos conhecer o arquivo deploy.rb:

  • :application — o nome da aplicação (só aceita letras, números e underline)
  • :repo_url — o url do repositório Git no Github ou Bitbucket
  • :deploy_to — o local no servidor aonde deverá salvar os arquivos, por exemplo, /home/seunome/deploy/seu_projeto
  • :keep_releases — A quantidade de versões antigas a manter, assim você pode voltar atraz sempre que quiser

Pode ser que alguma destas 4 opções não exista, então é só criar.

O arquivo deploy/production.rb apenas vai conter o seguinte:

role :web, %w{user@123.123.12.12}

Inclusive no comentário # role-based syntax deve ter alguns exemplos.

Não esqueça de trocar o user@123.123.12.12 pelo ip e usuário de acesso e pronto. Note que configuramos um role :web, esta regra web é o que vai fazer o deploy da aplicação no servidor informado alí dentro do %w{…}.

Imaginando que seu computador pessoal possa acessar o servidor de hospedagem via SSH e ambos possam fazer o mesmo com seu repositório Git no Bitbucket ou GitHub estamos prontos, mas ainda podemos fazer mais.

Hooks do Capistrano

O Capistrano é uma ferramenta poderosa, e como tal, você deveria poder rodar seus próprio comandos, por exemplo, um composer install.

Lembra da regra :web? Vamos rodar o composer install nela, para isso você já deve ser capaz de rodar o comando no servidor fora do Capistrano, ok.

Concatene o código abaixo no arquivo deploy.rb que já conhecemos:

namespace :deploy do
desc "Build"
after :updated, :build do
on roles(:web) do
within release_path do
execute :composer, "install --no-dev --quiet"
end
end
end
end

Claro que existem outras formas de se fazer o mesmo processo, por exemplo:

desc "composer install"
task :composer_install do
on roles(:web) do
within release_path do
execute :composer, "install --no-dev --quiet"
end
end
end
after :updated, :composer_install

Neste caso criamos uma tarefa (task) fora do processo padrão que vai rodar assim que for chamada.

Finalmente, enviando para o servidor de hospedagem

Para enviar para o servidor é bem simples, basta rodar:

cap production deploy

Devo informar que seu document root (o diretório base que o usuário que visita o site tem acesso, sabe, aonde tem o CSS, HTML e Javascript) apontar para o diretório current dentro do que foi informado no deploy.rb, por exemplo, se sua aplicação deve apontar para um public dentro do seu projeto, o Apache, Nginx ou o que quer que você usa vai apontar para current/public, no nosso exemplo seria:

/home/seunome/deploy/seu_projeto/current/public

Para fazer um rollback (voltar para uma versão anterior):

cap production deploy:rollback

Fale você investir um pouco mais de tempo dando uma olhada na documentação oficial para conhecer mais o Capistrano.

http://capistranorb.com/

Conclusão

Automatizar o processo de deploy das suas aplicações é realmente prático, vai te tomar um tempo agora, mas o processo vai ser sempre prático, seguro e reversível, além de totalmente automatizado, mas não fique prezo a uma ferramenta, teste outras, que tal o Deployer, se encontre!

Estude mais

Aqui mais alguns links interessantes sobre Deploy.

Outros artigos meus!

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.