Wie kann ich meine App nach einem Git-Push automatisch bereitstellen (GitHub und node.js)?

92

Ich habe meine Anwendung (node.js) auf einem VPS (Linux) bereitgestellt. Ich benutze Git Hub als Repository. Wie kann ich die Anwendung automatisch auf Git Push bereitstellen?

Fortgeschrittene
quelle
4
Haben Sie git hooks progit.org/book/ch7-3.html überprüft und überprüfen Sie auch auf github help.github.com/test-webhooks
Pawel Dubiel
1
Update für Progit-Link oben: git-scm.com/book/en/Customizing-Git-Git-Hooks
Code Novitiate
Git 2.10 wird eine interessante Funktion hinzufügen: Push-Optionen stackoverflow.com/a/38770670/6309
VonC

Antworten:

63

Beispiel in PHP:

Navigieren Sie zu Github in Ihr Github-Repository und klicken Sie auf "Admin".

Klicken Sie auf die Registerkarte 'Service Hooks' => 'WebHook-URLs'.

und hinzufügen

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

dann erstelle 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');
}

In der Datei build.sh müssen Sie die üblichen Befehle eingeben, um Ihre Site von github abzurufen

Pawel Dubiel
quelle
6
Hallo, vielen Dank. Was hindert Bob daran, mein Bereitstellungsskript auszuführen?
Fortgeschrittene
16
@Advanced 1 Vielleicht Skriptberechtigungen, Ausführungsflag ... 2 Das Hinzufügen eines schließenden Tags in PHP ist eine schlechte Praxis.
Pawel Dubiel
3
@Advanced Eine Technik, um sicherzustellen, dass Bob Ihr Skript nicht ausführt, besteht darin, sicherzustellen, dass die POST-Anforderung von den Servern von Github stammt. Überprüfen Sie die HTTP-Header, die sie bei der Anforderung senden. Sie können auch eine "geheime" URL erstellen, die nicht zu erraten ist.
Jyap
5
@ Purefan Kein Witz :) stackoverflow.com/questions/3219383/…
Pawel Dubiel
1
@ Arius2038 Schon mal was von "Du lernst jeden Tag etwas Neues" gehört? Nun, das ist heute mein "etwas Neues". Danke für das Teilen!
Purefan
23

Es gab einige Erwähnungen von Git-Hooks als Antworten / Kommentare, was in der Vergangenheit für mich funktioniert hat. Hier ist mein Rezept, falls jemand anderes mehr Einzelheiten benötigt.

Ich verwende eine Kombination aus dem Git-Post-Receive-Hook und dem Node-Supervisor , um eine einfache automatische Bereitstellung durchzuführen (vorausgesetzt, Sie verwenden ein Git-Remote-Repository auf diesem Computer).


Richten Sie Ihren Post-Receive-Hook ein

In Ihrem Repository: sudo vi hooks/post-receive

Und es sollte ungefähr so ​​aussehen:

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

Festlegen von Dateiberechtigungen: chmod +x hooks/post-receive

Git aktualisiert die Dateien in Ihrem App-Verzeichnis nach einem Push zum Repo.


Führen Sie Node mit Node-Supervisor aus

Sie müssen Node-Supervisor als globales Knotenmodul auf Ihrem Computer installieren: sudo npm install supervisor -g

Führen Sie jetzt einfach Ihre Node-App mit Node-Supervisor aus und sie sucht nach Änderungen an Dateien in Ihrem Arbeitsverzeichnis:

supervisor /home/path/to/your/www/server.js(Notiz supervisorstatt node).

Wes Johnson
quelle
Dies ist in Ordnung. Beachten Sie jedoch, dass Sie, wenn Sie Ihrer lokalen App eine neue npm hinzufügen, auch eine npm-Installation für dieses Modul auf dem Server durchführen müssen. Wenn Sie dies nicht tun, haben Sie wahrscheinlich eine abstürzende App.
k00k
2
Nein. Alle Knotenmodule, von denen meine lokale App abhängt, werden im Unterverzeichnis node_modules meines Projekts installiert. Dies ist mein lokales GIT-Repo. Wenn ich sie hinzufüge, festschreibe und dann auf den Remote-Server übertrage, werden sie ebenfalls kopiert.
Wes Johnson
8
Richtig, aber das bedeutet, dass wenn eines dieser Module kompilierten Code hatte (wie zum Beispiel mhash), es möglicherweise nicht auf einem anderen Server ausgeführt wird, der ein anderes Betriebssystem und / oder eine andere Architektur hat. Die Verwendung von package.json, um Ihre Abhängigkeiten zu verfolgen, und anschließend eine Bereitstellungsstrategie, die npm install -lauf dem Remoteserver ausgeführt wird, ist intelligent. Dies kann natürlich mit Ihrer Methode unter Verwendung von Post-Receive-Hooks gekoppelt werden.
k00k
1
und Sie können den Git-Arbeitsbaum einfach direkt in den Befehl git checkout einfügen: git --work-tree = / var / www / tree --git-dir = / var / repo / deploy.git checkout -f (anstatt zu erstellen die Variable und exportieren Sie es in Ihr Skript.
JasonB
Die Frage betrifft jedoch Github.
Noah
18

Wahrscheinlich sehr spät, um hier zu antworten. Aber ich habe dieses Projekt auf Github gefunden und scheint das zu tun, was Sie wollen, aber viel sauberer.

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

Hör zu. Würde mich auch interessieren, was andere darüber in Bezug auf Kommentare und Upvotes denken.

Prost,
S.

Saurabh Kumar
quelle
15
"Wahrscheinlich sehr spät, um hier zu antworten." Niemals zu spät. :) Sie tragen tatsächlich zur gesamten Community bei (die meisten von uns Googlern; wow, sehen Sie sich nur diese 20.000 Aufrufe an!), Nicht der einzelne Mann hat die Frage "vor einiger Zeit" gestellt. Zeit an sich ist irrelevant: Solange die betreffende Technologie relevant ist, wird auch Ihre Antwort sein. (Danke für den Tipp, übrigens, check it out ...)
Gr.
1
danke für dein headup! ;) Es hat damals großartig für mich funktioniert. Jetzt bevorzuge ich die Verwendung von Travis (travis-ci.org) ( wo immer ich kann ) für automatisierte Bereitstellungen. @unakid
Saurabh Kumar
8

In einem Projekt, das ich gerade entwickle, folge ich den Richtlinien in Jez Humbles brillantem Buch "Continuous Delivery" (lesenswert).

Dies bedeutet, dass eine Bereitstellungspipeline mit einem kontinuierlichen Integrationsserver erstellt wird (ich verwende die kostenlose Community Edition von Go von Thoughtworks ), der dafür verantwortlich ist, Ihren Code zuerst auf Qualität, Komplexität und Ausführen von Komponententests zu überprüfen. Es kann dann einer Bereitstellungspipeline folgen, die zu einem Push auf Ihre Produktionsserver führt.

Das klingt sehr kompliziert, muss es aber nicht sein und macht den gesamten Prozess des Schreibens von Code und den Weg in die Produktion sicher und sorgenfrei (keine beängstigenden Veröffentlichungstage!).

Ich verwende eine vollständige Bereitstellungspipeline für Live-Systeme und eine reduzierte Version für von mir geschriebene npm-Module. Beide verwenden dieselbe 1-Klick-Bereitstellungstechnik.

Roy
quelle
& noch +1 für die Buchempfehlung! Ich stelle fest, dass CI nicht beiläufig angegangen werden darf.
Merrick
Nun, die Leute stellen eine einfache Frage, Sie geben eine vollständige Lösung :). Ich muss sagen, das ist ein Overkill. Wenn Sie jedoch bereits eine kontinuierliche Lieferung verwenden, ist dies möglicherweise der richtige Weg.
Windmaomao
8

Ich habe gerade eine knotenbasierte Lösung für Ihr Problem veröffentlicht: Node-CD

Es besteht aus einer einfachen Knoten-App, die auf Ihrem VPS ausgeführt wird und Github-Post-Receive-Hooks empfängt und das gewünschte Skript ausführt (z. B. ein Shell-Skript, das Ihre App beendet, Git Pull ausführt und neu startet).

A21z
quelle
+1, weil es sich um reine node.js handelt, sodass das Poster nichts zu seinem Stapel hinzufügen oder eine Sprache verwenden muss, mit der sie nicht vertraut sind. Auch wirklich schön angelegter Code
code_monk
3

Hier ist eine weitere einfache Implementierung von nodeJS.

Es ist ein sehr einfacher Knotenserver, der auf einem von Ihnen konfigurierten Hostnamen und Port ausgeführt wird und für die Verarbeitung von GitHub-Post-Receive-Web-Hooks eingerichtet werden kann. Und die eigentlichen Pul / Test / Deployment-Aktionen können angepasst werden, um alles zu tun, was Sie wollen. In der aktuellen Implementierung handelt es sich um einen Shell-Befehl, der im NodeJS-Serverskript inline angegeben wird. Außerdem gibt es ein sehr einfaches Sicherheitsschema auf der Basis von secret_key.

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

Auf meinem Staging-Server war bereits ein Knoten installiert und wurde ausgeführt, sodass das Schreiben schnell und einfach war.

Shyam Habarakada
quelle
" yourdomain.com:8088/… " - WIRKLICH?! "geheimer" Schlüssel im Klartext in der URL übergeben !!!! Niemand sollte das benutzen.
Julian Knight
1
Haben Sie ein Aspirin und beruhigen Sie Julian. Get-Parameter werden bei Verwendung von https verschlüsselt.
Gavin
3

Ich fand das Projekt für die einfache Bereitstellung verwendet Git.

Git-Play

Ich denke, es ist der richtige Weg für dich.

Hör zu.

Oh Seung Kwon
quelle
2

Wenn Sie eine Python / Tornado-basierte Lösung wünschen, habe ich ein Skript geschrieben, um POST-Anforderungen von Githubs Webhook Services zu verarbeiten . Sie finden es unter https://github.com/Akobi/ops/tree/master/autodeploy

Grundsätzlich wird eine JSON-Konfigurationsdatei verwendet, um aufzulisten, von welchen Repos Pushs erwartet werden, welche Befehle Sie bei der Bereitstellung ausführen möchten und in welchem ​​Verzeichnis die Befehle ausgeführt werden müssen. Sie müssten lediglich die Konfigurationsdatei nach Ihren Wünschen ändern und ausführen das Drehbuch!

Außerdem verwende ich Nginx als Reverse-Proxy, um diese POSTs an mein Skript weiterzuleiten. Sie finden die Nginx-Konfiguration im selben Github-Repo im Ordner 'nginx'.

Viel Spaß beim Schieben!

Divij Rajkumar
quelle
1

Ich habe mein eigenes rudimentäres Bereitstellungstool erstellt, das automatisch neue Updates aus dem Repo abruft - https://github.com/jesalg/SlimJim - Grundsätzlich hört es auf den Github-Post-Receive-Hook und verwendet einen Proxy, um einen auszulösen Skript aktualisieren.

Jesus
quelle
1

Ich bin der Gründer von https://commando.io und kürzlich haben wir eine Integration mit GitHub über einen Dienst angekündigt. Durch die Integration können Sie Ausführungen auf Servern ausführen, wenn Sie auf ein GitHub-Repo pushen. Dies ist eine perfekte Gelegenheit, um Bereitstellungsskripts automatisch auszuführen, wenn Sie Code übertragen.

Eine Ausführung ist ein Skript, das Sie in Commando.io schreiben und das in bash, perl, python, ruby, go oder node.js geschrieben werden kann. Weitere Informationen und ein Beispiel für ein Ausführungsskript zum Ausführen git pullfinden Sie in unserer Blogpost-Ankündigung: http://blog.commando.io/run-executions-via-github-push/

Justin
quelle
1

Deepl.io scheint in diesem Bereich ein neuer und vielversprechender Konkurrent zu sein.

Features (von seiner Website übernommen):

  • Fangen Sie Webhooks von GitLab & GitHub
  • Konfigurieren Sie mehrere Repositorys
  • Konfigurieren Sie mehrere Zweige pro Repository
  • Verwenden Sie Ihre eigenen Bereitstellungsskripte, entweder PHP, Shell oder beides
  • Sendet Bestätigungs-E-Mails
vanto
quelle
1

Beachten Sie auch, dass es kostenlose / kostengünstige Dienste wie REPOMAN.IO gibt , die fast alles für Sie automatisieren.

Kirschbaum
quelle