Como posso implantar meu aplicativo automaticamente após um git push (GitHub e node.js)?


92

Tenho meu aplicativo (node.js) implantado em um VPS (linux). Estou usando o git hub como repositório. Como posso implantar o aplicativo automaticamente, no git push?


4
você verificou git hooks progit.org/book/ch7-3.html , e também verificou em github help.github.com/test-webhooks
Pawel Dubiel

1
Atualização para o link do progit acima: git-scm.com/book/en/Customizing-Git-Git-Hooks
Code Noviciado

O Git 2.10 adicionará um recurso interessante: opções de push stackoverflow.com/a/38770670/6309
VonC

Respostas:


63

Exemplo em PHP:

Navegue até o github em seu repositório github adicionar clique em "Admin"

clique na guia 'Ganchos de serviço' => 'URLs de WebHook'

e adicione

http://your-domain-name/git_test.php

então crie git_test.php

<?php 
try
{
  $payload = json_decode($_REQUEST['payload']);
}
catch(Exception $e)
{
  exit(0);
}

//log the request
file_put_contents('logs/github.txt', print_r($payload, TRUE), FILE_APPEND);


if ($payload->ref === 'refs/heads/master')
{
  // path to your site deployment script
  exec('./build.sh');
}

No build.sh você precisará colocar comandos usuais para recuperar seu site do github


6
Oi muito obrigado O que impede Bob de executar meu script de implantação?
Avançado

16
@Advanced 1 talvez permissões de script, flag de execução ... 2 adicionar tag de fechamento em PHP é uma prática ruim.
Pawel Dubiel

3
@Advanced Uma técnica para garantir que Bob não execute seu script é certificar-se de que a solicitação POST venha dos servidores do Github. Verifique os cabeçalhos HTTP que eles enviam ao fazer a solicitação. Além disso, você pode criar um URL 'secreto' que não pode ser adivinhado.
jyap

5
@Purefan Não é uma piada :) stackoverflow.com/questions/3219383/…
Pawel Dubiel

1
@ Arius2038 Já ouviu falar de "você aprende algo novo todos os dias"? bem, este é o meu "algo novo" hoje. Obrigado por compartilhar!
Purefan

23

Houve algumas menções de ganchos do Git como respostas / comentários, o que funcionou para mim no passado ... então aqui está minha receita, caso alguém precise de mais detalhes.

Eu uso uma combinação de git post-receive hook e node-supervisor para realizar uma implantação automática simples (supondo que você esteja usando um repositório remoto git nessa máquina).


Configure o seu gancho de pós-recebimento

Em seu repositório: sudo vi hooks/post-receive

E deve ser algo como:

#!/bin/sh
GIT_WORK_TREE=/home/path/to/your/www
export GIT_WORK_TREE
git checkout -f

Definir permissões de arquivo: chmod +x hooks/post-receive

O Git atualizará os arquivos no diretório do seu aplicativo após um envio para o repo.


Executar Nó com Supervisor de Nó

Você precisará instalar o Node-Supervisor em sua máquina como um módulo de nó global: sudo npm install supervisor -g

Agora, simplesmente execute seu aplicativo de nó com supervisor de nó e ele observará as alterações nos arquivos em seu diretório de trabalho:

supervisor /home/path/to/your/www/server.js(note em supervisorvez de node).


Isso é bom, no entanto, deve-se estar ciente de que se você adicionar um novo npm ao seu aplicativo local, precisará fazer uma instalação do npm para esse módulo no servidor também. Se não o fizer, provavelmente terá um aplicativo com falha.
k00k

2
Não. Todos os módulos de nó dos quais meu aplicativo local depende são instalados no subdiretório node_modules do meu projeto, que é meu repositório GIT local, portanto, quando eu adiciono, confirmo e empurro para o servidor remoto, eles também são copiados.
Wes Johnson

8
Certo, mas o que isso significa é que se qualquer um desses módulos tivesse código que foi compilado (como mhash, por exemplo), ele pode não ser executado em outro servidor com um sistema operacional e / ou arquitetura diferente. Usar package.json para controlar suas dependências e, em seguida, uma estratégia de implantação que faz um npm install -lno servidor remoto é inteligente. Isso pode, é claro, ser acoplado ao seu método usando ganchos pós-recebimento.
k00k

1
e você pode simplesmente adicionar a árvore de trabalho do Git ao comando git checkout diretamente: git --work-tree = / var / www / tree --git-dir = / var / repo / deploy.git checkout -f (em vez de criar a variável e exportá-la em seu script.
JasonB

A questão é sobre o Github, no entanto.
Noah

18

Provavelmente muito tarde para responder aqui. Mas eu encontrei esse projeto no github e parece fazer o que você quer, mas de uma forma muito mais limpa.

https://github.com/logsol/Github-Auto-Deploy

Confira. Também estaria interessado em saber o que os outros pensam sobre isso em termos de comentários e votos positivos.

Saúde,
S


15
"Provavelmente muito tarde para responder aqui." Nunca é tarde. :) Na verdade, você está contribuindo para toda a comunidade (a maioria de nós googlers; uau, só olhando aquelas 20 mil visualizações!), Nem o único cara fez a pergunta "há algum tempo". O tempo, por si só, é irrelevante: enquanto a tecnologia em questão for relevante, sua resposta também será. (Obrigado pela dica, BTW, dando uma olhada ...)
Sz.

1
obrigado pelo seu headup! ;) Funcionou muito bem para mim naquela época. Agora eu prefiro usar travis (travis-ci.org), ( sempre que puder ) para implantações automatizadas. @lunakid
Saurabh Kumar

8

Em um projeto que estou desenvolvendo atualmente, sigo as diretrizes abordadas no brilhante livro "Entrega Contínua" de Jez Humble (vale a pena ler).

Isso significa criar um pipeline de implantação usando alguma forma de servidor de integração contínua (eu uso a edição gratuita da comunidade da Thoughtworks do Go ), que é responsável por primeiro verificar seu código quanto à qualidade, complexidade e executar testes de unidade. Ele pode então seguir um pipeline de implantação, resultando em um envio para seus servidores de produção.

Isso parece muito complicado, mas não precisa ser, e torna todo o processo de escrever código e torná-lo seguro e sem preocupações (sem dias de lançamento assustadores!).

Eu uso um pipeline de implantação completo para sistemas ativos e uma versão reduzida para módulos npm que escrevo, e ambos compartilham a mesma técnica de implantação com um clique.


e outro +1 para a recomendação de livro! Estou descobrindo que o CI não deve ser abordado casualmente.
Merrick,

bem, as pessoas fazem uma pergunta simples, você dá uma solução completa :). Eu tenho que dizer que isso é um exagero. Mas se você já usa entrega contínua, talvez este seja o caminho a seguir.
windmaomao

8

Acabei de publicar uma solução baseada em nó para o seu problema: node-cd

Consiste em um aplicativo de nó simples executado em seu VPS que receberá Github pós-receber Ganchos e executará um script de sua preferência (por exemplo, um script de shell que matará seu aplicativo, git pull e reiniciá-lo).


+1 porque é puro node.js, então o autor da postagem não precisa adicionar nada à sua pilha ou usar uma linguagem com a qual não se sinta confortável. Além disso, um código muito bem elaborado
code_monk

3

Aqui está outra implementação simples de nodeJS.

É um servidor de nó muito simples que é executado em um nome de host e porta que você configura e pode ser configurado para lidar com GitHub pós-recebimento de web hooks. E as ações reais de pul / teste / implantação podem ser personalizadas para fazer o que você quiser. Na implementação atual, é um comando shell especificado sequencialmente no script do servidor nodeJS. E também existe um esquema de segurança baseado em secret_key muito simples.

https://github.com/shyam-habarakada/rscds

Meu servidor de teste já tinha um nó instalado e em execução, portanto, escrever isso foi rápido e fácil.


" seudominio.com:8088/… " - REALMENTE ?! chave "secreta" passada sem problemas na URL !!!! Ninguém deveria estar usando isso.
Julian Knight

1
Tome uma aspirina e acalme Julian. Os parâmetros get são criptografados ao usar https.
Gavin

3

Achei que o projeto para fácil implantação usa git.

git-play

Acho que é a maneira correta para você.

Confira.


2

Se você quiser uma solução baseada em python / tornado, escrevi um script para lidar com solicitações POST dos serviços de Webhook do Github . Você pode encontrá-lo em https://github.com/Akobi/ops/tree/master/autodeploy

Basicamente, ele usa um arquivo de configuração JSON para listar de quais repositórios você espera envios, quais comandos você deseja executar na implantação e em qual diretório os comandos devem ser executados. Tudo o que você precisa fazer é modificar o arquivo de configuração de acordo com sua preferência e executar o script!

Além disso, uso o Nginx como proxy reverso para encaminhar esses POSTs para o meu script. Você pode encontrar a configuração do Nginx no mesmo repositório Github na pasta 'nginx'.

Feliz empurrando!



1

Eu criei minha própria ferramenta de implantação rudimentar que puxaria automaticamente novas atualizações do repo - https://github.com/jesalg/SlimJim - Basicamente, ela escuta o github post-receive-hook e usa um proxy para acionar um script de atualização.


1

Sou o fundador da https://commando.io e recentemente anunciamos uma integração com o GitHub por meio de um serviço. A integração permite que você execute execuções em servidores ao enviar para um repositório GitHub. Esta é uma oportunidade perfeita para executar scripts de implantação automaticamente ao enviar código.

Uma execução é um script que você escreve dentro de Commando.io que pode ser escrito em bash, perl, python, ruby, go ou node.js. Para ler mais e ver um exemplo de script de execução em execução git pull, consulte o anúncio da postagem do nosso blog: http://blog.commando.io/run-executions-via-github-push/


1

Deepl.io parece ser um candidato novo e promissor neste espaço.

Recursos (retirados de seu site):

  • Pegue webhooks do GitLab e GitHub
  • Configure vários repositórios
  • Configure vários branches por repositório
  • Use seus próprios scripts de implantação, seja PHP, shell ou ambos
  • Envia e-mails de confirmação

1

Observe também que existem serviços gratuitos / baratos por aí, como REPOMAN.IO, que automatizam quase tudo isso para você.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.