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?
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.
@ 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).
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.
"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.
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'.
a resposta do PHP é totalmente legítima na minha opinião, mas se você preferir Ruby, eu coloquei uma solução no blog. é a mesma coisa que a resposta do PHP, só que em uma linguagem diferente. você usa um web hook e tem um script simples para ouvir as solicitações HTTP relevantes.
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.
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/
Respostas:
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
então crie git_test.php
No build.sh você precisará colocar comandos usuais para recuperar seu site do github
fonte
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:
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 emsupervisor
vez denode
).fonte
npm install -l
no servidor remoto é inteligente. Isso pode, é claro, ser acoplado ao seu método usando ganchos pós-recebimento.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
fonte
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.
fonte
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).
fonte
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.
fonte
Achei que o projeto para fácil implantação usa git.
git-play
Acho que é a maneira correta para você.
Confira.
fonte
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!
fonte
a resposta do PHP é totalmente legítima na minha opinião, mas se você preferir Ruby, eu coloquei uma solução no blog. é a mesma coisa que a resposta do PHP, só que em uma linguagem diferente. você usa um web hook e tem um script simples para ouvir as solicitações HTTP relevantes.
http://gilesbowkett.blogspot.com/2012/06/heroku-style-deployment-on-ec2.html
fonte
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.
fonte
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/fonte
Deepl.io parece ser um candidato novo e promissor neste espaço.
Recursos (retirados de seu site):
fonte
Observe também que existem serviços gratuitos / baratos por aí, como REPOMAN.IO, que automatizam quase tudo isso para você.
fonte