Git Pull für Website auf Github Push automatisch auslösen

8

Ich habe gerade meine Website-Entwicklungsumgebung so umgestaltet, dass mein git pull origin mastergesamter Quellcode in Github enthalten ist, und habe es geschafft, Git auf dem Remote-Server so einzurichten, dass durch einfaches Ausführen des Befehls auf dem Webserver der gesamte Quellcode der Anwendung vom Github aktualisiert wird Repository.

Was ich jetzt herausfinden möchte, ist eine Möglichkeit, den Prozess zu automatisieren. Der Code stammt aus dem Master-Zweig, der immer den Code für die Bereitstellung bereit hält und bereits getestet wurde. Wenn ich den Code in den Master-Zweig schiebe, möchte ich einen der Github-Hooks verwenden, um den Pull vom Server automatisch auszuführen und die Anwendung zu aktualisieren.

Ich habe SSH-Zugriff auf den Server und kann den Befehl jedes Mal manuell ausführen, wenn dies im Moment erforderlich ist. Es ist jedoch zeitaufwändig, Code an Github zu senden, dann eine SSH-Verbindung zum Server herzustellen und den aktualisierten Code abzurufen.

Ich bin mir nicht sicher, ob es in Git eine native Funktion gibt, die dies unterstützt, oder ob ich einen Web-Hook verwenden und eine Datei auf dem Webserver ausführen müsste, um den git pull origin masterBefehl auszulösen .

Vielen Dank

Chris Rutherfurd
quelle

Antworten:

9

Okay, ich habe es geschafft, das herauszufinden. Es stellt sich heraus, dass es in Git keine native Funktion zum Auslösen eines Remote-Abrufs gibt (wie beim Übertragen von Code in das Repository und beim Auslösen eines Pull-Ursprungs durch das Repository auf dem Webserver).

Ich habe dieses Problem behoben, indem ich ein PHP-Skript unter dem Standard-vhost auf meinen Webserver hochgeladen habe. In dieser Datei habe ich es so eingestellt, dass es ausgeführt wird shell_exec("cd /path/to/my/site/root" && sudo git pull origin master". Anschließend wird eine E-Mail mit der ausgegebenen Nachricht gesendet STDOUT, um mich darüber zu informieren, ob der Pull erfolgreich abgeschlossen wurde oder nicht.

Ich habe Github dann mit einem Webhook eingerichtet, sodass bei jedem Push in das Repository ein Webhook-Aufruf der Datei ausgelöst wird, die ich einfach als adressiert habe http://server.domain.com/github-deploy.php.

Derzeit werden einige unbekannte Sicherheitsüberprüfungen durchgeführt, um sicherzustellen, dass niemand auf die Datei zugreifen kann. Mit der Zeit werde ich wahrscheinlich IP-Überprüfungen hinzufügen, um sicherzustellen, dass Anforderungen an die Datei nur von IP-Adressen im Adressblock von Github stammen.

Ein wichtiger Hinweis, den ich hier hinzufügen sollte, ist, dass die einzige Möglichkeit, dies zu erreichen, darin besteht, dem Apache-Benutzer den Zugriff als Sudoer auf dem Server zu ermöglichen, ihn jedoch darauf zu beschränken, den sudoBefehl zum Starten von Git auszuführen , andernfalls wird eine Nachricht mit verweigertem Zugriff angezeigt Ausgelöst. Indem shel_execich es auf git beschränke und keine Eingaben vom aufrufenden Skript an den Befehl übergebe, glaube ich, dass ich Bedenken hinsichtlich der Sicherheit ausgleichen konnte.

Irgendwann werde ich dies wahrscheinlich als Service-Link mit Github implementieren, aber im Moment ist dies ausreichend.

Chris Rutherfurd
quelle
9

Das Bereitstellen Ihrer Website von einem Git-Arbeitsverzeichnis aus wird als schlechte Praxis angesehen - siehe Gründe hier und hier .

Der beste Weg, dies zu tun, besteht darin, ein "nacktes" Git-Repo auf Ihrem Server mit einem "Post-Receive" -Hook einzurichten. Dieser Artikel ist das, was ich kürzlich befolgt habe. Die Grundidee ist:

  1. Erstellen Sie ein "nacktes" Repo mit git init --bare

  2. Bearbeiten Sie hooks/post-receivein Ihrem nackten Repo, um das Repo in Ihr Webstamm zu kopieren:GIT_WORK_TREE=/var/www/yoursite git checkout -f

  3. Fügen Sie auf Ihrem lokalen Computer das Bare Repo als Fernbedienung hinzu.

  4. Verwenden Sie git push <remotename>diese Option, um auf Ihre Live-Site zu pushen.

DisgruntledGoat
quelle
Möchtest du die Ablehnung erklären?
DisgruntledGoat
Denn die Frage war speziell, wie man einen Git-Pull von einem Webserver auslöst. Ich verstehe, dass dies möglicherweise nicht der beste Weg ist, Dinge zu tun, aber ich mache es deutlich anders als Sie es ohnehin betonen, was es zu einer sicheren Option für meine Bedürfnisse macht. Ihre Antwort beantwortet nicht die Frage, sondern versucht, die Antwort von der ursprünglichen Frage wegzuleiten. Da es die spezifische Frage nicht beantwortet, wäre es besser für einen Kommentar geeignet.
Chris Rutherfurd
2
Nun, die Antwort auf Ihre Frage lautet "Sie sollten das nicht tun", was eine vollkommen gültige Antwort ist. Entschuldigung, es funktioniert nicht für Sie, aber hoffentlich hilft es anderen in Zukunft.
DisgruntledGoat