2009-11-21 14 views
6

Das Git-Plugin für Hudson funktioniert gut. Das Build-Skript muss jedoch eine Versionsnummer in den Dateien im Repository aktualisieren, festschreiben und zurück an das Repository senden.Hudson Endlosschleife für Änderungen in Git-Repository abrufen?

Wenn Hudson als nächstes nach Änderungen sucht, geht es in eine Endlosschleife, weil es sieht, dass Commit als eine "Änderung" erneut erstellt wird, die eine Änderung festschreibt, so dass sie erneut erstellt, dann eine andere Änderung festlegt usw. .. Du hast die Idee.

ich es gestoppt, lief in jedem Repository ein "git log" und verglichen die neuesten Commit-IDs sind genau die gleichen mit git ls-tree HEAD

Auch läuft Hudson diesen Befehl auf Änderungen zu überprüfen:

git fetch + refs/heads/: refs/remotes/origin/ git ls-tree HEAD

Seit Hudson selbst schob die von seinem Arbeitsplatz Repository begehen, und es scheint, der ls-Baum Ergebnisse Spiel wie kann Dieser Befehl bestimmt, dass es eine Änderung gegeben hat?

Es scheint, dass es die Ergebnisse von ls-tree speichern muss, bevor Sie den Build erstellen und mit dem vergleichen, der nicht das letzte Commit haben wird. Ah. Ich kann versuchen, das Commit abzuschalten, um diese Theorie zu testen.

Wie auch immer, anstatt irgendein Problem im Git-Plugin für Hudson zu beheben, was kann ich tun, um am Ende meines Builds sicherzustellen, dass die Repos identisch sind und dass Hudson es so sehen wird.

Wie behebt man das? Irgendwelche Ideen?

Wayne

+0

Sicher genug. Wenn das Commit auskommentiert ist und das Skript nur an einige Repositories gesendet wird, funktioniert es ordnungsgemäß. Das heißt, Hudson erkennt, dass keine Änderungen vorgenommen wurden, und wartet auf Änderungen ohne Schleifen. So, wie man die Endlosschleife stoppt. Es scheint, dass das Git-Plugin für Hudson den Repo-Zustand nach dem ersten Abruf für den Build speichert. Aber es scheint, dass es den Repo-Zustand nach einem erfolgreichen Build wieder speichern sollte, falls der Build einen Commit ausführen sollte - oder zumindest als Option geben sollte. Jeder Körper haben eine einfachere, schnellere Idee, dies zu lösen? – Wayne

+0

Oh, ich habe eine Abzweigung des Git-Hudson-Plugins auf GitHub gefunden, wo jemand anders bereits die Handhabung dieser Situation hinzugefügt hat. Ich lade und baue und werde es versuchen. Wiederum, wenn jemand eine bessere Lösung hat, bitte beraten. Ich poste zurück, wenn das es löst. – Wayne

Antwort

3

Und die Antwort ist! ...

Das Git Hudson-Plugin wurde bereits von jemand gegabelt dieser Funktion ist es gut funktioniert hinzuzufügen. Trotzdem musste ich die Quelle herunterziehen und ein paar kleinere Probleme beheben.

Jetzt funktioniert es wunderbar. Der Build wird ausgeführt und das Git-Plug-In wird ohne Schleifen in das Repository zurückgeschoben und denkt, dass es sich erneut geändert hat.

Wunderbar!

Wenn jemand anderes diese Suche nach der Tickzoom Fork des Hudson-GIT-Plugin auf Github benötigt.com, aber überprüfen Sie, ob bereits in das Hauptprojekt integriert wurde. Der Täter sagte, er sei interessiert und plane, die Gabeln zu kombinieren.

Wayne

+0

Oh. das ist cool! Es stellt sich heraus, dass das Hudson Git Plugin diese Situation bereits behandelt. Es beschreibt es in der Dokumentation und war vor ein paar Tagen über meinem Kopf. Die Idee ist, nur zu "Feature" -Abzweigen zu verpflichten. Dann führt der Build-Server zuerst den Feature-Zweig zu einem Integrationszweig zusammen und macht dann seine Arbeit. Auf diese Weise ist es nie erforderlich, dass der automatisierte Server nicht schnelle Vorwärtsverschmelzungen aufweist und die Übergaben im integrierten Zweig in der richtigen Reihenfolge ablaufen. Genial. Du musst die Kraft von Git lieben. – Wayne

5

Ihr Build-System sollte jede Schreib Interaktion mit Ihrem Revisionskontrollsystem nicht. Es sollte sicherlich nicht diese Änderungen automatisch drücken.

Ihr Build-System kann fragen git (über git describe, zum Beispiel), was die aktuelle Revision ist. Alles andere ist redundant und fehleranfällig.

Eine andere Sache, die Sie in Betracht ziehen können, ist, nicht nach Änderungen zu suchen. Das scheint eine alberne Art zu funktionieren. (Zugegebenermaßen bin ich ein schwerer buildbot-Benutzer, der daran gewöhnt ist, dass bei Ereignissen alles ausgelöst wird.)

Das Git-Repo, das abgefragt wird, weiß, wann es sich ändert. Es sollte dem CI-System nur mitteilen, dass es darauf basierend sofort einen Build starten soll. Du bekommst deine Builds früher und da sie alle ausgelöst werden, hast du deine Computer nicht da und tust ohne viel Grund viel Arbeit.

+0

Leider muss der Schreibvorgang erfolgen, da der Build die Revision mit einer Versionsnummer wie 0.5.6.135 versehen muss und Quelldateien mit der Nummer aktualisiert werden müssen, damit die kompilierten Binärdateien die Revision haben. Dadurch können Fehler im richtigen Quellcode zurückverfolgt werden. Wir verwendeten früher SVN und dieses Plugin hatte eine Option, bestimmte Dateien zu "ignorieren", wenn nach Änderungen gesucht wurde. Also mussten wir unsere Versionsdateien ignorieren. Git ist natürlich anders. Wenn Sie einen anderen Weg kennen, um das gleiche zu erreichen, lassen Sie es mich bitte wissen. – Wayne

+0

Ich mag deine Idee, nicht wirklich nach Änderungen zu fragen. Die Hürde dort ist auch, die Endlosschleife des Stoßes vom automatischen Aufbau zu vermeiden. Also muss diese Methode auch eine Möglichkeit haben, zwischen den beiden zu vergleichen. Das ist komplex. So scheint das Polling und Vergleichen einfacher. Und alle 1 Minute Abfragen für Änderungen ist definitiv keine Art von Arbeit für einen Computer zu tun. – Wayne

+0

FYI, ich verstehe jetzt, warum Sie sagen, der Build sollte niemals in das Repository schreiben. Ich habe alles eingerichtet und funktioniert, aber die CI-Build-Maschine schreibt und erstellt Nicht-Fastword-Commits, wenn dies am Ende des Builds geschieht, während die Codierer während des Builds weiterhin codieren und committen. Komplexe, aber notwendige Anforderungen. Ich werde eine andere Frage stellen, um das anzugehen. – Wayne