Maven Multi-Modul-Projekt - Wie man eine Operation ausführt, nachdem alle Submodule beendet sind

8

Ich habe ein Maven-Projekt mit mehreren Modulen und würde gerne eine Operation (antrun) ausführen können, nachdem alle Submodule ihre Ausführung beendet haben.

In meinen Projekten baue ich RPMs von jedem Untermodul und in der Bereitstellungsphase kopiere ich die RPMs (per ssh) in ein RPM-Repository.
Der RPM-Repo erfordert, dass ich nach dem Hinzufügen neuer RPMs einen createdb-Befehl ausführen muss, damit er sie indizieren kann.
Also habe ich einen Antrun, der scp ausführt und die RPMs in den Repo kopiert. Es wird für jedes Submodul ausgeführt, das tatsächlich einen RPM erzeugt, und ist mit der maven-Phase deploy verknüpft. Was ich tun kann ist, dass nach jedem scp der Befehl createrepo ausgeführt wird, aber das wäre verschwenderisch. Ich habe mehr als 10 Submodule und jeder crearepo dauert ungefähr eine Minute, so dass ich wertvolle Bauzeit verschwenden werde.

Was ich tun möchte, ist, nachdem alle Submodule fertig sind, dann starte das createrepo. Einmal.

Mein erster Versuch war, die Antrun, die den createrepo-Befehl aufruft, an die deploy -Phase des Eltern-Poms anzuhängen. Ich tat das und das Problem war, dass die Bereitstellungsphase der Eltern vor der Bereitstellungsphase der Submodule ausgeführt wird. Ich wollte, dass es nach läuft Ich kann den createrepo antrun nicht an eine andere spätere Phase anhängen, da die Bereitstellungsphase die letzte im Lebenszyklus ist.

Also meine Frage ist: Gibt es eine Möglichkeit, eine "Bereinigung" Antrun oder ein Plugin im Allgemeinen zu starten, die einmal ausgeführt werden, nachdem alle Build-Operationen aller Submodule erfolgreich beendet wurden?

Ein Hack wäre es, ein weiteres Submodul zu erstellen und sicherzustellen, dass es das letzte ist, indem es von allen anderen Modulen abhängig gemacht wird und das createrepo von der Bereitstellungsphase dieses Moduls aus ausführt. Aber das ist hässlich und schwer zu pflegen. Ich bevorzuge eine sauberere Lösung.

Danke

Maven-Version ist 2.2.1

    
Ran 15.11.2010, 12:13
quelle

2 Antworten

3

Ich bin mir nicht so sicher, dass Ihr letzter Vorschlag, ein dediziertes Modul von allen anderen abhängig zu machen, so hässlich ist. Schließlich nutzt Maven das Abhängigkeitsmanagement. Sie können es auf eine sehr offensichtliche Weise benennen, um Maintainern klar zu machen, was vor sich geht und es wird gut in den gesamten Build-Prozess des Projekts passen.

Warum nicht an Ort und Stelle und sehen, wie gut es für Sie funktioniert? Denken Sie daran, dass der Arbeitscode jedes Mal einen schönen, aber nicht funktionierenden Code übertrifft.

    
Gary Rowe 15.11.2010 13:58
quelle
0

Ich benutze eine Lösung, die Gebäude und Verpackungen von der Veröffentlichung trennt. Da wir Jenkins verwenden, ruft jeder Build einen Publish-Job auf, der auch Create Repo-Sachen behandelt, und noch schöner ist, dass Jenkins Ihnen ermöglicht, diesen Publishing-Job parallel auszuführen.

Was schwierig war, ist, dass tatsächlich während der createrepo-Phase, wenn zwei Jobs genau im selben Moment ausgeführt werden, ein Fehler auftreten wird, da sie dieselbe Operation nicht in demselben Ordner in derselben Gruppe von Dateien ausführen können. Allerdings habe ich Flock hier nur für Createrepo-Phase implementiert, und jetzt laufen alle Jobs wirklich in paralel plus drei veröffentlicht in paralel sowie getestet wurden, aber wir verwenden zwei aufgrund einiger anderer Entscheidungen.

Mit diesem Ansatz haben wir jedoch die Gesamtaufbauzeit von insgesamt 1,5 Stunden auf insgesamt 15 Minuten reduziert.

    
Dejan Menges 18.10.2012 12:16
quelle

Tags und Links