2012-04-05 35 views
5

Ich habe einen Artefakt, das für mehrere Zielplattformen gebaut werden soll:Synchronisieren von Artefakt-Versionen auf allen Plattformen mit Maven Release-Prozess

  • Linux x86
  • Windows-x86
  • ARM11

Leider wegen Aufgrund des Fehlens von Crosscompilern ist es nicht möglich, alle Versionen des Artefakts auf einmal zu erstellen.

Mit anderen Worten, das Ziel ist im Repository so etwas wie dieses

  • artifact-1.0.0-linux.zip
  • artifact-1.0.0-windows.zip
  • Artefakt haben -1.0.0-arm11.zip
  • artifact-1.0.1-linux.zip
  • artifact-1.0.1-windows.zip
  • artifact-1.0.1-arm11.zip
  • ...

Beachten Sie, dass die Versionen synchron sind. Wie erreiche ich das?

Die Sache ist, dass der Release-Prozess Version der pom.xml nach jedem Build aktualisiert. So durch nacheinander auf verschiedenen Plattformen bauen kann ich erreichen,

  • artifact-1.0.0-linux.zip
  • artifact-1.0.1-windows.zip
  • artifact-1.0.2-arm11.zip mit
  • artifact-1.0.3-linux.zip
  • artifact-1.0.4-windows.zip
  • artifact-1.0.5-arm11.zip
  • ...

aber das ist nicht das, was ich suche.

Ich konnte

  1. laufen auf Linux

    mvn release: Vorbereitung Release: führen -DpushChanges = false

    (mit pushChanges auf false gesetzt Release nicht Versionsnummer erhöhen in SCM)

  2. und dann unter Windows

    laufen

    mvn release: Release vorbereiten: führen

    (dies wird die Versionsnummer erhöhen)

Aber dann die Verantwortung, die Freigabeprozesse auf verschiedenen Plattformen triggern in der richtigen Reihenfolge mit mir liegt. Gibt es eine Möglichkeit, Maven kann mir dabei helfen?

Haben Sie Vorschläge?

Dank


PS. Beachten Sie, dass es sich nicht um eine Frage handelt, wie Sie sich in Modulen organisieren können. Es geht darum, Release-Prozesse eines einzelnen Artefakts auf mehreren Plattformen zu synchronisieren.

Antwort

0

Wie ich sehe, verwenden Sie Klassifizierer (Artefakts Dateinamen Suffix) wie linux, windows oder arm11 verschiedene Artefakt Releases zu unterscheiden, für bestimmte Plattformen bestimmt sind. Also, wenn Sie Multi-Modul-Projekt von Maven, wo Module Artefakte mit gleichen , artifactId, selbe version (wahrscheinlich von ihren gemeinsamen Eltern geerbt), aber anders classifier verwaltet werden, werden Sie genau das, was Sie wollen. In diesem Fall geben Sie immer Ihr Multi-Modul-POM frei (normalerweise ist es das gemeinsame Elternteil für seine Module), um alle Module auf einmal freizugeben. Unter der Annahme gleich Version-for-all-Module-Politik (die hier ganz gut zu passen scheint), können Sie grundsätzlich ausführen:

mvn release:prepare release:perform -DautoVersionSubmodules

und das ist es. Sie erhalten artifact-1.0.0-linux.zip, artifact-1.0.0-windows.zip, artifact-1.0.0-arm11.zip Artefakte freigegeben. Die nächste Entwicklungsversion wird für alle Module auf 1.0.1-SNAPSHOT gesetzt (über Vererbung von Eltern).

+0

Aber mein Punkt ist, dass wenn Sie unter Linux sind, können Sie keine Binärdatei für Windows erstellen (aufgrund einiger Toolchain-Einschränkungen). Daher kann der Build-Prozess, wenn er unter Linux ausgeführt wird, keine Windows-Binärdateien erstellen. Und umgekehrt. Sie können also nicht alle Binärdateien für alle Plattformen auf einmal erstellen. --- Dies ist keine Frage darüber, wie in Module zu organisieren. Es geht darum, Releaseprozesse eines einzelnen Artefakts auf mehreren Plattformen zu synchronisieren. –

+0

OK, ich fürchte, Maven kann Ihnen nicht helfen, das so automatisch zu machen, wie Sie wollen, es sei denn, Sie möchten (und haben etwas Zeit) ein eigenes Release-Plugin erstellen. Wie du bereits erwähnt hast, kannst du alles tun, ohne eine Version zu stossen und dann am Ende global verbrennen, aber daran musst du dich erinnern. Sie können auch die gemeinsame Versionierung (geerbt von Parent) verwerfen und wörtlich Versionen in allen POMs der Module eingeben. Diesmal müssen Sie diesen Prozess jedoch steuern und sicherstellen, dass alle Module mit der Version freigegeben sind und jedes Modul einmal freigegeben ist. Ich kann wirklich nicht 100% automatisch sehen. –

+0

Ich bin immer knapp bei der Zeit :) Wie auch immer, vielen Dank für die Hilfe. –

2

Haben Sie schon eine Lösung dafür gefunden? Es ist gut, ich bin nicht der einzige mit Maven kämpfen zu wissen :-)

Wie auch immer,

Sind Sie erlaubt eine freigegebene Version Nexus zu implementieren? Ich denke, Sie könnten dies tun:

1 - Machen Sie eine "MVN Release: Vorbereitung Release: Ausführen" von einer Windows-Maschine - das sollte Artefakt-1.0.1-windows.zip in Nexus bekommen.

2 - Überprüfen Sie das Artefakt-1.0.1 Tag von der Quellcodeverwaltung

3 - Mach einen "mvn deploy" von linux und arm11 (was auch immer das ist: P) - das sollte -linux.zip und -arm11.zip auch in nexus bringen.

Obwohl, ich glaube, dass je nachdem, wie Nexus konfiguriert ist, es wird Ihnen nichts mit dem gleichen GAV umschichten nicht lassen (auch wenn der Sichter unterscheidet)

0

Sie mich mit Ihrer Frage geholfen ... I Ich wusste nichts von der Option pushChanges = false.

Mit Jenkins können Sie einen Job auf jeder Plattform einrichten, die die Maven-Version in Serie ausführt, indem Sie die Funktion "Trigger baut Remote (z. B. von Skripten)" verwenden. Wenn Sie möchten, können Sie einen parametrisierten Build verwenden, um auszuwählen, welche Version erstellt werden soll (wenn Sie dies verwenden, benötigen Sie die Parameterized Trigger Plugin, um den Build auf den anderen Plattformen auszulösen).