Deploy com Git Push
Posted on February 13, 2010
Até hoje eu usava o Capistrano para fazer o deployment de modificações no código do meu blog. Mas resolvi fazer algo mais simples: usar hooks de git. É uma técnica já bem conhecida e muito simples, por isso acho que vale algumas dicas.
Minha configuração é bem simples: o repositório git fica no mesmo servidor do site. Para criar um repositório privado de Git não é necessário muita coisa, basta que seu servidor seja acessível via SSH. Crie um par de chaves na sua máquina e coloque a chave pública no authorized_keys do servidor.
Para criar um repositório git no seu servidor, logue nele e faça o seguinte:
1 2 3 |
mkdir ~/repos/meu_projeto.git cd ~/repos/meu_projeto.git git init --bare |
Pronto, agora na sua máquina local você precisa adicionar esse novo repositório remoto:
1 2 |
cd meu_projeto git remote add origin meu_usuario@meu_dominio.com:~/repos/meu_projeto.git |
Se você já tiver um “origin” configurado (por exemplo, do github), basta colocar qualquer outro nome.
No meu caso, de dentro do servidor, eu faço o seguinte:
1 |
git clone ~/repos/meu_projeto.git ~/meu_projeto |
No caso o ~/meu_projeto/public será o diretório para onde vou apontar o Phusion Passenger. Agora, toda vez que eu fizer uma modificação preciso fazer:
- git push origin master a partir do meu projeto na minha máquina de desenvolvimento local
- ssh meu_usuario@meu_dominio.com logar no servidor remoto
- cd ~/meu_projeto && git pull origin master para puxar as modificações
- touch ~/meu_projeto/tmp/restart.txt para reiniciar o Passenger
Em vez de fazer tudo isso manualmente, posso usar um recurso chamado git hooks. O repositório remoto do git consegue executar quaisquer scripts quando sofrer alguma ação, por exemplo, um git push. Para tanto, preciso editar o arquivo ~/repos/meu_projeto.git/hooks/post-receive que será executado quando ele receber novos dados:
1 2 3 4 5 |
#!/bin/sh cd /home/meu_usuario/meu_projeto env -i git reset --hard env -i git pull origin master env -i touch tmp/restart.txt |
Esses env -i é por causa de um pequeno detalhe de como esses hooks funcionam, explicado neste blog. Além disso, não esqueça de tornar esse arquivo executável:
1 |
chmod +x ~/repos/meu_projeto.git/hooks/post-receive |
Eu poderia incrementar isso de diversas maneiras, por exemplo mandando ele rodar um rake db:migrate, mas para mim já está suficiente. Agora, toda vez que eu modificar alguma coisa e fizer um git push o repositório irá automaticamente atualizar o código do meu blog, de forma bem simples e zero esforço. Posso até retirar o suporte a capistrano dele.
E para quem não sabe, repositórios do Github suportam diversos desses hooks também. Veja esta documentação deles. Você pode configurar o Github para dar um post com as informações do commit para um servidor web seu que pode reagir e fazer alguma operação, como o deployment ou rodar um serviço de integração contínua e assim por diante.
Enfim, dá para automatizar muita coisa com isso. Aproveitem.
blog comments powered by Disqus
Archives
- February 12(2)
- December 11(1)
- November 11(4)
- October 11(6)
- September 11(5)
- August 11(1)
- July 11(5)
- May 11(4)
- April 11(11)
- March 11(4)
- February 11(3)
- January 11(4)
- December 10(9)
- November 10(2)
- October 10(10)
- September 10(4)
- August 10(6)
- July 10(14)
- June 10(16)
- May 10(8)
- April 10(14)
- March 10(9)
- February 10(6)
- January 10(14)
- December 09(10)
- November 09(10)
- October 09(7)
- September 09(19)
- August 09(4)
- July 09(12)
- June 09(7)
- May 09(12)
- April 09(11)
- March 09(9)
- February 09(9)
- January 09(12)
- December 08(14)
- November 08(20)
- October 08(15)
- September 08(18)
- August 08(25)
- July 08(13)
- June 08(21)
- May 08(29)
- April 08(27)
- March 08(12)
- February 08(32)
- January 08(31)
- December 07(27)
- November 07(30)
- October 07(25)
- September 07(28)
- August 07(16)
- July 07(15)
- June 07(16)
- May 07(7)
- April 07(13)
- March 07(8)
- February 07(9)
- January 07(24)
- December 06(17)
- November 06(17)
- October 06(15)
- September 06(38)




