Usando o Git como ferramenta de deploy

Depois de um bom tempo sem postar, coloco no ar um post bem técnico.

Tenho perdido passado meu pouco tempo livre brincando com alguns frameworks em PHP e para facilitar o controle de versões e o deploy dessas brincadeiras em nos servidores eu acabei “aprendendo” a usar o Git. A ideia desse post é disponibilizar um passo a passo para usar o Git como ferramenta para de deploy.

Premissas

Para conseguir montar essa solução é preciso que o repositório principal e o servidor aonde a aplicação está publicada sejam a mesma máquina. Para os sistemas desenvolvidos em PHP e até alguns em Java, esse requisito não é nada tão anormal.

Configurando o servidor

No servidor, serão criados dois repositórios. Um deles fará o papel de “hub”. As alterações que fizermos no código em nossa estação de trabalho será sincronizada com esse repositório “hub” que, em sequência, sincronizará o resultado com o outro repositório onde a aplicação está publicada.

Para o nosso exemplo, o repo que terá o código da aplicação publicado será chamado de projeto e ficará em /var/www/projeto. A primeira coisa é iniciar um repo nesse diretório.

[cc lang=’bash’ ]$ cd /var/www/projeto
$ git init
Initialized empty Git repository in /var/www/projeto
$ git add .
$ git commit[/cc]

Em sequência, no mesmo servidor, a gente vai criar um repositório bare. É esse repo que será sincronizado com as estações de trabalho. Vou colocá-lo em /var/git/projeto.git. Depois de criá-lo temos que fazer um push de todos os arquivos no repo publicado para esse repo “hub”.

[cc lang=’bash’ ]$ mkdir -p /var/git/projeto.git
$ cd /var/git/projeto.git
$ git init –bare
$ cd /var/www/projeto
$ git push /var/git/projeto.git master
Counting objects: 143, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (87/87), done.
Writing objects: 100% (143/143), 288.28 KiB, done.
Total 143 (delta 52), reused 129 (delta 47)
To /var/git/projeto.git
* [new branch] master -> master[/cc]

Configurações e Hooks

Uma vez que já temos os dois repositórios, temos que configurar o repo “hub” como um repositório remoto do que está publicado. Isso é simples. É só editar o arquivo em /var/www/projeto/.git/config para conter as informações abaixo.

[cc lang=’bash’ ][remote “hub”]
url = /var/git/projeto.git
fetch = +refs/heads/*:refs/remotes/hub/*[/cc]

Agora que os repos estão relacionados, precisamos configurar os hooks para que toda vez que um alteração seja enviada para o “hub” ela seja replicada para o repositório publicado. Os hooks do “hub” ficam armazenados em /var/git/projeto.git/hooks. O hook que vamos adicionar deve ser criado em um arquivo chamado post-update. Esse arquivo deve conter o seguinte código.

[cc lang=’bash’ ]

#!/bin/sh

echo
echo “**** Enviando as alteracoes [Hub’s post-update hook]”
echo

cd /var/www/projeto || exit
unset GIT_DIR
git pull hub master

exec git-update-server-info

[/cc]

Cada linha é importante, por isso faça o mí­nimo de alterações possí­veis neste arquivo, ok? AH! Garanta que esse arquivo seja executável usando o comando abaixo.

[cc lang=’bash’ ]$ chmod +x /var/git/projeto.git/hooks/post-update[/cc]

Todas as alterações que precisam ser feitas no servidor já estão no ar. Tudo o que fizermos daqui pra frente será na estação de trabalho. Moleza, hein?

Clonando e fazendo o push nas estações de trabalho

O próximo passo, que deve ser executado na sua estação de trabalho, onde você está codificando. O que precisamos fazer agora é clonar o conteúdo do repo “hub” para sua máquina.

A forma que eu estou usando para clonar é através do SSH. É a forma mais tradicional e bastante segura de usar o Git. Sempre que puder, use-a.

[cc lang=’bash’ ]$ git clone oscarnogueira@servidor:/var/git/projeto.git projeto[/cc]

Do ponto de vista do Git, quando você estiver em sua estação de trabalho, o servidor de onde você clonou o repositório é chamado de origin e a sua máquina o master, portanto, se quiser enviar novos código para o servidor basta fazer para o repo origin do conteúdo do master.

[cc lang=’bash’ ]$ git push origin master[/cc]

É só isso!

Para implementar essa solução e escrever este artigo levei como base o texto do Dan Barber.

Adeus.

Deixe um comentário