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?
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.
@ 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).
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.
"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.
& 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).
+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.
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'.
Die PHP-Antwort ist meiner Meinung nach absolut legitim, aber wenn Sie Ruby bevorzugen, habe ich eine Lösung gebloggt. Es ist dasselbe wie die PHP-Antwort, nur in einer anderen Sprache. Sie verwenden einen Web-Hook und lassen ein einfaches Skript auf die relevanten HTTP-Anforderungen warten.
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.
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/
Antworten:
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
dann erstelle git_test.php
In der Datei build.sh müssen Sie die üblichen Befehle eingeben, um Ihre Site von github abzurufen
quelle
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:
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
(Notizsupervisor
stattnode
).quelle
npm install -l
auf dem Remoteserver ausgeführt wird, ist intelligent. Dies kann natürlich mit Ihrer Methode unter Verwendung von Post-Receive-Hooks gekoppelt werden.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.
quelle
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.
quelle
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).
quelle
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.
quelle
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.
quelle
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!
quelle
Die PHP-Antwort ist meiner Meinung nach absolut legitim, aber wenn Sie Ruby bevorzugen, habe ich eine Lösung gebloggt. Es ist dasselbe wie die PHP-Antwort, nur in einer anderen Sprache. Sie verwenden einen Web-Hook und lassen ein einfaches Skript auf die relevanten HTTP-Anforderungen warten.
http://gilesbowkett.blogspot.com/2012/06/heroku-style-deployment-on-ec2.html
quelle
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.
quelle
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 pull
finden Sie in unserer Blogpost-Ankündigung: http://blog.commando.io/run-executions-via-github-push/quelle
Deepl.io scheint in diesem Bereich ein neuer und vielversprechender Konkurrent zu sein.
Features (von seiner Website übernommen):
quelle
Beachten Sie auch, dass es kostenlose / kostengünstige Dienste wie REPOMAN.IO gibt , die fast alles für Sie automatisieren.
quelle