Come posso distribuire automaticamente la mia app dopo un push git (GitHub e node.js)?


92

Ho la mia applicazione (node.js) distribuita su un VPS (linux). Sto usando git hub come repository. Come posso distribuire l'applicazione automaticamente, su git push?


4
hai controllato git hooks progit.org/book/ch7-3.html , e anche su github help.github.com/test-webhooks
Pawel Dubiel

1
Aggiornamento per il collegamento progit sopra: git-scm.com/book/en/Customizing-Git-Git-Hooks
Code

Git 2.10 aggiungerà una caratteristica interessante: Opzioni push stackoverflow.com/a/38770670/6309~~V~~plural~~3rd
VonC

Risposte:


63

Esempio in PHP:

Passa a github nel tuo repository github aggiungi fai clic su "Admin"

fare clic sulla scheda "Service Hooks" => "WebHook URL"

e aggiungi

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

quindi crea 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');
}

Nel build.sh dovrai inserire i normali comandi per recuperare il tuo sito da GitHub


6
Ciao, grazie mille. Cosa impedisce a Bob di eseguire il mio script di distribuzione?
Avanzato

16
@Advanced 1 forse permessi di script, flag di esecuzione ... 2 l'aggiunta di tag di chiusura in PHP è una cattiva pratica.
Pawel Dubiel

3
@Advanced Una tecnica per assicurarsi che Bob non esegua lo script è assicurarsi che la richiesta POST provenga dai server di Github. Controlla le intestazioni HTTP che inviano quando effettui la richiesta. Inoltre puoi creare un URL "segreto" che non è indovinabile.
jyap

5
@Purefan Non è uno scherzo :) stackoverflow.com/questions/3219383/…
Pawel Dubiel

1
@ Arius2038 Mai sentito parlare di "impari qualcosa di nuovo ogni giorno"? beh questo è il mio "qualcosa di nuovo" oggi. Grazie per la condivisione!
Purefan

23

C'erano alcune menzioni di hook Git come risposte / commenti, che ha funzionato per me in passato .. quindi ecco la mia ricetta se qualcun altro richiedesse più specifiche.

Uso una combinazione dell'hook post-ricezione git e del supervisore del nodo per eseguire una semplice distribuzione automatica (supponendo che tu stia utilizzando un repository remoto git su quella macchina).


Imposta il tuo hook post-ricezione

Nel tuo repository: sudo vi hooks/post-receive

E dovrebbe assomigliare a:

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

Imposta i permessi dei file: chmod +x hooks/post-receive

Git aggiornerà i file nella directory della tua app dopo un push al repository.


Esegui Node con Node-Supervisor

Dovrai installare Node-Supervisor sulla tua macchina come modulo nodo globale: sudo npm install supervisor -g

Ora esegui semplicemente la tua app node con node-supervisor e controllerà le modifiche ai file nella tua directory di lavoro:

supervisor /home/path/to/your/www/server.js(nota supervisorinvece di node).


Questo va bene, tuttavia una cosa da tenere presente è che se aggiungi un nuovo npm alla tua app locale, dovrai eseguire un'installazione di npm anche per quel modulo sul server. Se non lo fai, probabilmente avrai un'app che si blocca.
k00k

2
No. Tutti i moduli nodo da cui dipende la mia app locale sono installati nella sottodirectory node_modules del mio progetto, che è il mio repository GIT locale, quindi quando aggiungo, eseguo il commit, quindi invio al server remoto, vengono copiati anche loro.
Wes Johnson,

8
Giusto, ma ciò significa che se uno di quei moduli avesse del codice compilato (come mhash per esempio), potrebbe non funzionare su un altro server con un sistema operativo e / o un'architettura diversi. Usare package.json per tenere traccia delle tue dipendenze e quindi una strategia di distribuzione che esegue una npm install -lsul server remoto è intelligente. Questo può ovviamente essere accoppiato con il tuo metodo usando hook post-ricezione.
k00k

1
e puoi semplicemente aggiungere l'albero di lavoro Git direttamente nel comando git checkout: git --work-tree = / var / www / tree --git-dir = / var / repo / deploy.git checkout -f (invece di creare la variabile ed esportandola nel tuo script.
JasonB

La domanda riguarda Github, però.
Noah

18

Probabilmente molto tardi per rispondere qui. Ma ho trovato questo progetto su GitHub e sembra che faccia quello che vuoi, ma in modo molto più pulito.

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

Controlla. Sarei anche interessato a sapere cosa ne pensano gli altri in termini di commenti e voti positivi.

Saluti,
S


15
"Probabilmente molto tardi per rispondere qui." Mai troppo tardi. :) In realtà stai contribuendo all'intera comunità (la maggior parte di noi googler; wow, solo guardando quelle 20.000 visualizzazioni!), Non il singolo ragazzo ha posto la domanda "qualche tempo fa". Il tempo, di per sé, è irrilevante: finché la tecnologia in questione è rilevante, lo sarà anche la tua risposta. (Grazie per la punta, BTW, controllando ...)
Sz.

1
grazie per la tua attenzione! ;) Ha funzionato benissimo per me in quel momento. Ora preferisco usare travis (travis-ci.org), ( ovunque posso ) per distribuzioni automatizzate. @lunakid
Saurabh Kumar

8

In un progetto che sto attualmente sviluppando seguo le linee guida trattate nel brillante libro di Jez Humble "Continuous Delivery" (che merita una lettura).

Ciò significa creare una pipeline di distribuzione utilizzando una qualche forma di server di integrazione continua (io uso la community edition gratuita di Thoughtworks di Go ), che è responsabile del primo controllo del codice per la qualità, la complessità e l'esecuzione di unit test. Può quindi seguire una pipeline di distribuzione che si traduce in un push ai server di produzione.

Sembra molto complicato, ma non deve esserlo, e rende l'intero processo di scrittura del codice e il suo passaggio alla produzione sicuro e senza preoccupazioni (nessun giorno di rilascio spaventoso!).

Uso una pipeline di distribuzione completa per i sistemi live e una versione ridotta per i moduli npm che scrivo ed entrambi condividono la stessa tecnica di distribuzione con un clic.


e un altro +1 per la raccomandazione del libro! Sto scoprendo che CI non deve essere avvicinato casualmente.
Merrick

beh, le persone fanno una semplice domanda, tu dai una soluzione completa :). Devo dire che questo è eccessivo. Ma se stai già utilizzando la consegna continua, forse questa è la strada da percorrere.
windmaomao

8

Ho appena pubblicato una soluzione basata sui nodi al tuo problema: node-cd

Consiste in una semplice app di nodo in esecuzione sul tuo VPS che riceverà Github post-ricezione Hooks ed eseguirà uno script che ti piace (ad esempio uno script di shell che ucciderà la tua app, git pull e la riavvierà).


+1 perché è puro node.js, quindi il poster non deve aggiungere nulla al proprio stack o utilizzare una lingua con cui non è a proprio agio. Inoltre, codice davvero ben strutturato
code_monk

3

Ecco un'altra semplice implementazione di nodeJS.

È un server nodo molto semplice che viene eseguito su un nome host e una porta configurati e può essere impostato per gestire gli hook Web di ricezione post GitHub. E le effettive azioni pul / test / deploy possono essere personalizzate per fare tutto ciò che vuoi. Nell'attuale implementazione, è un comando shell specificato inline nello script del server nodeJS. E c'è anche uno schema di sicurezza basato su secret_key molto semplice.

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

Il mio server di staging aveva già il nodo installato e in esecuzione, quindi scrivere questo è stato semplice e veloce.


" tuodominio.com:8088/… " - VERAMENTE ?! chiave "segreta" passata in chiaro nell'URL !!!! Nessuno dovrebbe usarlo.
Julian Knight

1
Prendi un'aspirina e sistemati Julian. I parametri Get vengono crittografati quando si utilizza https.
Gavin

3

Ho scoperto che il progetto per una facile distribuzione utilizza git.

git-play

Penso che sia il modo giusto per te.

Controlla.


2

Se vuoi una soluzione basata su python / tornado, ho scritto uno script per gestire le richieste POST dai servizi Webhook di Github . Puoi trovarlo su https://github.com/Akobi/ops/tree/master/autodeploy

Fondamentalmente utilizza un file di configurazione JSON per elencare da quali repository ti aspetti push, quali comandi vuoi eseguire durante il deploy e in quale directory devono essere eseguiti i comandi. Tutto quello che dovresti fare è modificare il file di configurazione a tuo piacimento ed eseguire il copione!

Inoltre, utilizzo Nginx come proxy inverso per inoltrare questi POST al mio script. Puoi trovare la configurazione di Nginx nello stesso repository Github nella cartella "nginx".

Buona spinta!



1

Ho creato il mio strumento di distribuzione rudimentale che estrae automaticamente nuovi aggiornamenti dal repository - https://github.com/jesalg/SlimJim - Fondamentalmente ascolta il hook post-ricezione di github e utilizza un proxy per attivare un script di aggiornamento.


1

Sono il fondatore di https://commando.io e recentemente abbiamo annunciato un'integrazione con GitHub tramite un servizio. L'integrazione consente di eseguire esecuzioni sui server quando si invia a un repository GitHub. Questa è un'opportunità perfetta per eseguire automaticamente gli script di distribuzione quando esegui il push del codice.

Un'esecuzione è uno script che scrivi all'interno di Commando.io che può essere scritto in bash, perl, python, ruby, go o node.js. Per saperne di più e vedere un esempio di script di esecuzione dell'esecuzione git pull, vedere l'annuncio del nostro post sul blog: http://blog.commando.io/run-executions-via-github-push/


1

Deepl.io sembra essere un nuovo e promettente concorrente in questo spazio.

Caratteristiche (prese dal suo sito web):

  • Cattura webhook da GitLab e GitHub
  • Configura più repository
  • Configura più rami per repository
  • Usa i tuoi script di distribuzione, PHP, shell o entrambi
  • Invia e-mail di conferma

1

Nota anche che ci sono servizi gratuiti / poco costosi come REPOMAN.IO che automatizzano quasi tutto questo per te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.