Como fazer deploy de seu site WordPress usando Git

Fazer deploy usando Git é algo transformador para quem vem de anos de “trabalho sujo” com FTP. Neste quesito aliás nunca me conformei com a facilidade de fazer sérios danos no servidor usando o popular Filezilla. Arrastou sem querer com o mouse uma pasta para dentro de outra e pronto: seu site foi pro espaço. Sem aviso, sem nada.

Felizmente temos o Git para nos ajudar e tornar este processo muito mais seguro e rápido. Mostrarei agora um modo de se fazer deploy usando a dupla SSH/Git que pode fazer você abandonar de vez o Filezilla, ou qualquer outro cliente de FTP, e ter um workflow muito mais eficiente.

Escopo

Este post destina-se a usuários de Linux ou Mac, já que os comandos Unix, assim como o SSH, estão presentes de modo nativo em ambos. Para usuários de Windows existem alternativas tanto para rodar comandos Unix quanto para acessar servidores com SSH (git-bash e PuTTY são exemplos) mas elas não serão abordadas. Pessoalmente, migrei para o Linux há um ano e, como desenvolvedor, é algo que recomendo vivamente.

Como iremos falar de SSH e Git, que são sistemas que funcionam através de comandos no Terminal, um conhecimento básico sobre este último também é necessário. Existem muitas fontes na web sobre o assunto e uma que recomendo pra quem está começando é esta, bem rápida e objetiva.

Separando por etapas, iremos fazer o seguinte:

  1. Acessar o servidor através de SSH;
  2. Criar lá um repositório “bare” do Git;
  3. Usar um hook do Git para transferir o conteúdo de cada commit ao diretório onde seu site deve ficar (isso será explicado à frente);
  4. Adicionar o repositório do servidor ao nosso projeto local, para poder fazer push dele.

SSH

Este é o passo mais simples. Só uma nota: se você usa hospedagem compartilhada (pense em Locaweb, Infolink etc) verifique com o suporte se eles oferecem acesso SSH e peça orientação. Se não oferecem, recomendo parar a leitura ou procurar outro serviço e voltar. :-(

Como falei acima, em ambientes Mac e Linux o SSH já vem instalado por padrão. Para conectar, portanto, basta abrir o terminal e digitar algo como:

ssh seu_login@seu_dominio

Será pedida sua senha. Passe ela e pronto. Não há nada mais a fazer além disso! :-)

Dentro do servidor, que estou assumindo que seja Linux, você pode navegar pelas pastas, criar e apagar arquivos, enfim, fazer tudo que faz em seu computador usando os mesmos comandos de sempre: cd, ls, mv, cat e por aí vai.

Repositório Git Bare

Dentro do servidor, vamos criar agora um repositório do Git no local que você escolher. No meu caso criei na raiz, fora da pasta ‘www’, que é pública. Mas acho que o local não faz diferença.

mkdir /path/repo.git && cd /path/repo.git
git init --bare

Duas coisas para atentar aqui: o nome do diretório criado (repo.git) e o ‘–bare’ depois do git init. Esta flag indica que o repositório que estamos criando é “bare”, um tipo especial de repositório que não irá conter arquivos senão aqueles próprios do Git. Não conterá portanto o working directory. O uso do ‘.git’ após o nome do diretório (no exemplo, “repo”) é uma convenção do próprio Git para este tipo de repositório.

Na minha fonte favorita de informações sobre Git você pode ler mais sobre o assunto.

A idéia de criar um repositório bare é poder usá-lo como um repositório de passagem, que vai guardar apenas o histórico de seu projeto mas não os arquivos. Estes serão enviados a um outro local, provavelmente a raiz da pasta ‘www’ se seu projeto será servido na raiz do domínio.

Fazendo dessa forma, uma das vantagens que você vai perceber é que o diretório de arquivos de seu site WordPress não vai conter nenhum arquivo do Git, apenas o seu código. Se organização é importante pra você, isto é um grande ponto a favor desta prática.

Agora falta saber como fazer a “mágica” para enviar os seus arquivos para este local, uma vez que, como falamos, eles não serão hospedados no repositório do Git que acabamos de criar.

Isto será feito através dos hooks, um recurso do Git que eu também desconhecia até pouco tempo atrás.

Git Hooks

Para quem trabalha com o WordPress, o conceito de hooks não é novidade. São eventos do sistema onde podemos anexar algum script. No caso do Git você pode entrar em algum repositório já existente e procurar pela pasta ‘hooks’, a título de curiosidade. Eles sempre estiveram lá, esperando que você os descobrisse. :-)

Nosso objetivo é o de usar um hook específico, o ‘post-receive’ para fazer o Git enviar para um outro local os arquivos de nossos commits.

No Git, cada hook é representado por um arquivo. Nós vamos portanto criar o arquivo que representa o hook ‘post-receive’ e inserir nele duas linhas de código.

Ainda dentro do diretório “repo.git” digite:

cat > hooks/post-receive

O cat é um comando versátil que pode ser usado tanto para ler quanto para criar arquivos. Nesta última modalidade temos que usar a sintaxe cat > path/do/arquivo e o tal arquivo não deve existir ainda.

Após dar Enter o terminal irá pular uma linha e exibir um cursor piscando, o que indica que ele está esperando que você digite alguma coisa no arquivo que acabou de criar. Digite então os comandos abaixo, lembrando de mudar os caminhos do diretório ‘www’ de acordo com seu contexto.

#!/bin/sh/
GIT_WORK_TREE=/path/absoluta/do/seu/diretorio/www git checkout -f

Quando terminar, abandone a área de edição digitando Ctrl + C.

Duas observações:

  1. O caminho do diretório ‘www’ tem que ser absoluto. Num servidor remoto nem sempre descobrir este caminho é tão óbvio. Eu entrei na pasta ‘www’ e digitei ‘pwd’ para descobrir.
  2. GIT_WORK_TREE é uma variável de ambiente do Git. Eu ainda não estudei a fundo os hooks do Git, mas é algo que no futuro talvez faça.

Para concluir esta etapa vamos fazer um chmod no arquivo que acabamos de editar dando direitos de execução a todos os usuários. Isto é feito da seguinte forma:

chmod +x /hooks/post-receive

Com isso, terminamos o trabalho no servidor remoto. Você pode digitar exit para finalizar a sessão do SSH. Vamos passar agora para o ambiente local.

Adicionando o remoto e dando push

Finalmente, vamos adicionar o repositório que criamos no servidor ao projeto local que temos no nosso computador.

Provavelmente você já sabe que isto é feito com o git remote add. Sem novidade por aqui.

Somente interessante notar que neste caso o endereço do repositório remoto usará SSH, não HTTP. Com minha hospedagem funcionou tudo bem, mas se tiver qualquer problema, contate o suporte da sua.

Vá na pasta onde está seu projeto WordPress, e adicione o repositório remoto da seguinte forma:

git remote add host ssh://seudominio.com.br/~/repo.git

Depois do git remote add informe o nome que quer dar ao seu repositório remoto. Por padrão é ‘origin’, mas acho interessante variar pra me forçar a lembrar que isto é personalizável. No caso então usei ‘host’.

Logo após o comando ssh informe o domínio e em seguida o caminho onde está o repositório. O ~ indica a raiz e ‘repo.git’ é o nome, se está me acompanhando até aqui.

Adicionado o repositório remoto, vamos fazer nosso primeiro commit, e você verá algo milagroso acontecer diante de seus olhos.

git add .
git commit -m "First Commit"
git push host master

Terminado o upload, que pode ser relativamente longo, já que provavelmente você irá subir o diretório do WordPress inteiro (com o arquivo ‘.gitignore’ devidamente configurado, é claro 😉 ), acesse seu servidor e veja o conteúdo da pasta ‘repo.git’ e em seguida da ‘www’, se escolheu hospedar o projeto nela.

Tendo dado tudo certo, todos seus arquivos estão em ‘www’ e nenhum deles em ‘repo.git’, que atuou apenas como uma passagem. Um repositório que guarda o histórico do projeto mas não os arquivos, ou agora que você já sabe o termo, um repositório bare.

Agora é somente ir trabalhando, dando commits e pushes e ver os resultados sendo transferidos ao seu servidor sem necessidade de trabalho manual, demorado e inseguro com FTP. Deploy com Git é o caminho, e me levou tempo pra descobir isso.

Observação

Se esta é a primeira vez que vai fazer deploy desta forma e está um tanto inseguro, o que é normal, eu recomendo usar o terminal e fazer em seu próprio computador todos os passos deste post, com um projeto fake, onde você pode ter um único arquivo txt, por exemplo. A cada passo com o Git investigue os diretórios criados e, depois do primeiro push, confira os resultados corrigindo possíveis erros. É bem menos estressante do que fazer direto no servidor se ainda não está 100% seguro.

Disclaimer

Este não é definitivamente o único modo de fazer deploy usando Git. Você poderia não ter criado o repositório como bare por exemplo, e deixar tanto o código quanto os arquivos do Git no mesmo local. Talvez facilite mas por outro lado, por questão de organização, acho este método superior.

No caso de dúvidas, comentários são bem-vindos.