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.