Automatizar deploys de Aplicações Web usando Git
Estou, atualmente, a desenvolver uma API que irá alimentar uma app desenvolvida para iOS. A API está a ser desenvolvida em PHP, usando micro-framework Lumen, dos criadores da framework Laravel, podem ver mais aqui, ao passo que a app está a ser desenvolvida usando Swift, da Apple, podem ver mais aqui.
Uma das formas de fazer deploy de aplicações web nos respectivos servidores envolve a utilização de um cliente de FTP para enviar os ficheiros mais recentes para o servidor. Isto envolve sabermos quais os ficheiros que foram alterados para que possamos enviar, única e exclusivamente estes, ou, em alternativa, copiar TODOS os ficheiros para garantir que não escapou nenhum. Há uma, de várias, forma de automatizar este processo.
Git hooks ao salvamento
Existem vários hooks que podem ser usados no Git, tanto no cliente como no servidor. Neste texto apenas vou abordar um: post-receive.
Devemos começar por criar um novo repositório Git no servidor para onde queremos fazer deploy. Para tal usamos o comando git init --bare
. Isto vai criar um repositório com as configurações mínimas necessárias. Podem ver as diferenças sobre o git init
e o git init --bare
aqui.
Após a criação do repositório Git basta criarmos o ficheiro que irá ser executado cada vez que é feito um commit para este repositório. Para tal basta criar um ficheiro novo chamado post-receive
, dentro da pasta hooks
, com o seguinte conteúdo:
#!/bin/bash
while read oldrev newrev refname
do
:
done
git --work-tree=/caminho/para/o/codigo --git-dir=/caminho/para/o/repositorio/git checkout -f
Nota: Deverão substituir os caminhos pelos vossos.
O que este código faz é esperar para que todo o conteúdo do commit seja recebido pelo servidor e posteriormente fazer checkout de todo o código recebido para o directório especificado.
Para que o código seja executado sempre que é recebido um commit deverão dar permissões de execução ao script com chmod +x post-receive
.
Todas as configurações no servidor estão concluídas. Agora necessitamos de configurar no lado do cliente.
Configurações no cliente
No cliente basta adicionar um novo remote. Se digitarmos o comando git remote
o output será:
origin
Para acrescentarmos um remote novo basta digitar git remote add nomeDoRemote username@servidor:/caminho/para/o/repositorio/git
. Agora o comando git remote
terá como output:
originnomeDoRemote
A partir de agora basta fazermos push dos commits efetuados para que estes sejam automaticamente enviados para o servidor de produção. Basta digitarmos git push nomeDoRemote nomeDaBrach
. No meu caso seria git push production master
. Com isto tenho dois remotes: o origin para os commits do meu código à medida que vou programando e o production para os commits do código assim que este estiver devidamente testado.