Mein Setup ist ein Windows-XAMPP-Server mit aktiviertem cURL und installiertem Git und Hudson. Hudson fragt Git jede Minute ab, um nach Änderungen zu suchen, und wenn es diese findet, erstellt es einen Build. Ich verwende diesen Build als meinen Testserver. Dies funktioniert gut.
Ich möchte einen Post-Receive-Hook auf meinem zentralen Remote-Repository einrichten, der die Force-Build-Funktion von Hudson ausführt.
Ich habe eine Post-Receive-Datei namens “post-receive” im Hooks-Verzeichnis in meinem zentralen Git-Repository erstellt, die aus den lokalen Zweigen der Entwickler gepusht wird. Sie pushen jeweils in ihren eigenen Branch im zentralen Repository. Ich möchte den Post-Receive-Build sofort nach jedem Push ausführen, anstatt Hudson jede Minute Git abfragen zu lassen.
Wenn ich eine Shell zum Remote-Server öffne und “post-receive” im Hooks-Ordner ausführe, wird es ausgeführt. Es wird nur nicht aufgerufen, wenn Leute von ihren lokalen Repository-Kopien auf das zentrale schieben.
Vielleicht erkläre ich das nicht richtig, aber so verstehe ich Git.
Der Post-Receive-Code besteht aus zwei Zeilen:
#!/bin/sh
curl http://myserver.com:8080/hudson/job/myjobname/build?token=mytoken
Auch hier, wenn ich eine Shell öffne und dies ausführe, funktioniert es, aber wenn jemand darauf drängt, passiert nichts, bis eine Minute oder weniger vergeht, Hudson erkennt, dass Git geändert wurde, und dann wird es erstellt.
Bei Bedarf kläre ich gerne auf. Jede Hilfe wird sehr geschätzt.
BEARBEITEN: Nachdem ich damit herumgespielt habe, habe ich das Gefühl, dass der Post-Empfang möglicherweise nicht ausgeführt wird, weil die Refs nicht aktualisiert werden. In der git-Dokumentation steht
Es wird einmal auf dem Remote-Repository ausgeführt, nachdem alle Refs aktualisiert wurden.
Bedeutet dies, dass es nicht ausgeführt wird, wenn nichts aktualisiert wird? Und wenn ja, bin ich mir ziemlich sicher, dass die Dinge sowieso aktualisiert werden, also sollte es nicht zutreffen.
Hier ist mein Prozess: Nehmen Sie Änderungen lokal vor. Commit-Änderungen. Push von meinem HEAD zum Remote-Zweig namens ‘mybranch’ (nicht zum Master-Zweig, der ausgecheckt ist) Dies ist der Punkt, an dem mein Hook ausgeführt werden soll.
Der Benutzer, den Ihr Git-Daemon ausführt, hat die Berechtigung, dieses Skript auszuführen?
– jweyrich
9. Februar ’11 um 21:51
Nicht sicher. Es führt es aus, wenn ich es über Git Bash ausführe, aber nicht, wenn ich darauf dränge. Wie würde ich diese Berechtigungen überprüfen?
– spanky
9. Februar ’11 um 21:52
Die richtige Berechtigung hängt davon ab, wie Sie Ihr Repository freigeben, und von den tatsächlichen Konfigurationen. Allerdings sagt Ihnen msquared, wie Sie allen Benutzern/Gruppen ausführbare Berechtigungen erteilen können, also sollte es funktionieren, wenn das Problem tatsächlich darin liegt.
– jweyrich
9. Februar ’11 um 21:58 Uhr
Die Datei ist ausführbar, sie wird nur nicht oder nicht richtig ausgeführt, wenn ich git-push. Irgendwelche anderen Ideen?
– spanky
10. Feb. ’11 um 0:40
Fügen Sie eine echo-Anweisung in Ihren Post-Receive-Hook ein, um zu sehen, ob er tatsächlich ausgeführt wird, zB “echo Hook ran!” — git sendet es an den Anrufer.
– ebneter
10. Feb. ’11 um 2:04