Gerar arquivo de deploy usando Git
Saudações. Primeiramente vamos explicar alguns termos:
- Deploy: a tradução mais próxima para o sentido de deploy que vamos usar seria implantação.
- Git: Sistema de controle de versão distribuido desenvolvido por Linus Torvalds.
- Commit: Grava as mudanças feitas no repositório como uma estágio atual.
- SHA1: Id único que identifica um commit.
- Integração contínua: Nome dado à rotina de integração de alterações ao sistema ou software desenvolvido incluindo testes que verificam se houve quebra de funcionalidades.
Vamos deixar claro que o ideal para implantações é sempre usar algum sistema de integração contínua, o Git foi inventado para fazer apenas o controle de versão e faz isso muito bem.
Há técnicas muito boas usando hooks como do Thiago Belem que aceleram esse deploy, ou servidores como o Heroku onde você simplesmente executa um push e suas alterações vão para o servidor de testes.
Para situações onde você tem que criar um arquivo ou escrever uma rotina para que alguém faça a implantação utilize os comandos a seguir para facilitar sua rotina.
Lista de arquivos removidos entre dois commits
git diff –name-status SHA1INI SHA1FIN |grep -e "^D" |cut -b 3- |xargs echo > /DIR/para_remover.txt
Explicando: Lista os arquivos e status de alteração entre dois commits (SHA1INI e SHA1FIN).
git diff –name-status SHA1INI SHA1FIN
Dos arquivos listados pega apenas as linhas que começam com D.
grep -e "^D"
Da listagem remove os primeiros caracteres deixando apenas a lista de arquivos.
cut -b 3-
O xargs passa a lista como parâmetros para o comando echo que por sua vez direciona sua saída para o arquivo em /DIR/para_remover.txt
xargs echo > /DIR/para_remover.txt
Com essa lista de arquivos você pode montar instruções ou um shell script para removê-los no servidor onde será feito o deploy.
Para gerar uma lista de arquivos adicionados ou alterados e empacota
git diff –name-status SHA1INI SHA1FIN |grep -e "^[^D]" |cut -b 3- | xargs tar cvfz /DIR/fontes.tar.gz
Explicando: Lista os arquivos e status de alteração entre dois commits (SHA1INI e SHA1FIN).
git diff –name-status SHA1INI SHA1FIN
Dos arquivos listados pega apenas as linhas que não começam com D.
grep -e "^[^D]"
Da listagem remove os primeiros caracteres deixando apenas a lista de arquivos.
cut -b 3-
O xargs passa a lista como parâmetros para o comando tar que por sua vez empacota e compacta no arquivo /DIR/fontes.tar.gz
xargs tar cvfz /DIR/fontes.tar.gz
Com esse pacote a basta a pessoa que for aplicar o deploy subir para o servidor e descompactar na pasta raiz do projeto sobre escrevendo os arquivos que lá estiverem.
Se precisar pegar as mensagens de commit entre 2 commits específicos precisamos de script mais elaborado:
#!/bin/bash
#definindo os SHA1 inicial e final e o diretório onde vamos gerar o arquivo com as mensagens
SHA1INI="informe aqui o sha1 do commit inicial"
SHA1FIN="informe aqui o sha1 do commit final"
DIR="/informe/aqui/o/caminho/para/o/arquivo/a/ser/gerado/"
# pegando os SHA1 curtos cortando os SHA1 inicial e final originais
SHA1INICURTO=`echo "$SHA1INI" | cut -c 1-7`
SHA1FINCURTO=`echo "$SHA1FIN" | cut -c 1-7`
#criando o arquivo que vai guardar a listagem
rm $DIR/msgcommits.txt && touch $DIR/msgcommits.txt
git log –oneline $SHA1FINCURTO | while read linha
do
SHA1CURTO=`echo $linha | cut -c 1-7`
MSG=`echo $linha | cut -c 9-`
echo " - $MSG" >> $DIR/msgcommits.txt
if [ "$SHA1CURTO" == "$SHA1INICURTO" ]; then
exit 0
fi
done
No arquivo msgcommits.txt vamos ter todas as mensagens que cada usuário informou ao realizar o commit.
Com um pouquinho mais de shell script, criatividade e tempo dá para evoluir e combinar esses comandos e montar um belo pacote para deploy.
Mas como disse anteriormente esse método de montar arquivo implantação é mais destinado para servidores que você não tenha acesso, onde algum terceiro vai implantar, ou para ser enviado para uma auditoria.
De maneira geral o caminho mais recomendado seria uma integração contínua, geralmente economiza tempo de implantação e retestes.
Agradecimentos especiais a Fernando Uchiyama e André Tannus que começaram a desenvolver algumas dessas concatenações de comandos que hoje com algumas adaptações utilizo para automatizar a geração de pacotes de implantação.
Té +