In den letzten Projekten haben wir - zugegebenermassen mit Mühe - unsere Integrationsplattform auf der Basis des CruiseControl aufgebaut. Die Integration selbst war nicht ganz schmerzfrei, doch letztlich funktionierte das System recht gut. Nur manchmal hingen Builds aus technischen Gründen und dann erforderte das Recovery der Umgebung einige unangenehme Eingriffe. Durch die Web-Oberfläche ist man in diesen Momenten nur wenig unterstützt.
Gestern nun habe ich ein neues Produkt auf diesem Markt entdeckt: Hudson.
Die Installation war schnell abgeschlossen: die aus dem Internet geladene WAR-Datei musste nur in das webapps Verzeichnis hinein kopiert werden. Und sofort war das Programm über den Browser ansprechbar.
Die wenigen notwendigen Grundeinstellungen waren auch schnell durchgeführt und dann habe ich das erste Projekt eingerichtet. Ein paar Probleme hatte ich nur, den korrekten URL für das im Subversion hinterlegte Projekt herauszufinden und Benutzernamen und Passwort zu hinterlegen. Nachdem auch diese Hürde genommen war, hat das System den ersten Build erfolgreich abschliessen können.
Hudson unterstützt Builds mit Ant, Maven oder auch einer schnöden Shell. Nach einem Build können unterschiedliche Mechanismen für das Publishing der Artefakte und die Benachrichtigung der Anwender eingerichtet werden. So können zum Beispiel auch Builds abhängiger Projekte aktiviert werden. Die Daten eines Builds werden über Properties and das Ant-Skript übergeben. Daher kann innerhalb des Builds auf den Zustand referenziert werden um z.B. den Stand im CVS oder SubVersion zu taggen.
Gerade für das Taggen bietet Hudson um Zusammenhang mit Subversion aber ein besonderes Schmankerl. Jeder Build kann auch nachträglich noch exakt getaggt werden. Somit ist es möglich, nach Auswertung aller Protokolle zu entscheiden, ob ein Build nun tatsächlich eine valide neue Programmversion darstellt. Durch Kopieren des Hudson-Projekts kann dann auf einfache Weise der Build-Prozess für die Wartung der mit dem Tag markierten Projektstände aktiviert werden. Das dauert nur wenige Sekunden und erzeugt praktisch eine komplett neue Projektsite.
Noch einmal nett sind die Plugins, die das “Versionswetter” ermitteln. Diese können Informationen aus Clover, Emma, FindBugs, etc. auswerten und anhand frei zu vergebener Eckwerte entscheiden, ob für den Build Wolken aufziehen oder die Sonne scheint. Solche Plugins können auch selbst entwickelt werden, denn die Plugin-Infrastruktur ist dokumentiert. Die Beispiele erscheinen allerdings nicht unbedingt einfach und verständlich zu sein.
Selbst wenn viele große Projekte zu verwalten sind, scheitert Hudson nicht an dieser Aufgabe. Weitere Hudson Instanzen können auf anderen Rechnern als “Slave” installiert werden, diese werden dann von einem “Master” Knoten mit Build-Aufträgen versorgt.
Natürlich verfügt Hudson auch über ein Interface, um aktuelle Informationen über den Build-Status über JSON oder XML abzurufen. Über diese Schnittstelle ist es auch möglich, über externe Ereignisse neue Buildläufe anzustossen, wenn die in Hudson eingebauten Mechanismen nicht ausreichend sein sollten.
Aufgrund der Struktur des Programms, sollte Hudson jedoch immer in einem Application Server installiert werden, der nach Möglichkeit in einem Jail unter einem nicht-privilegierten Anwender laufen sollte. Der Zuriff auf die Web-Applikation selbst kann dann mit den Authentisierungsmechanismen des Application Server (Tomcat) kann im weiteren den eigentlichen Broser-Zugriff absichern. Alles in allem ein leistungsfähiges neues Tool im Werkzeugkasten eines ernsthaften Java Entwicklers.