# Nur einen Teilbaum in Maven releasen?



## PinkMuffin (21. Jan 2021)

Also, erst mal kurz zur Situation:
In der Firma werden alle Produkte im gleichen Git-Repository geführt, da es recht kleine Produkte sind und man nicht immer wechseln müssen soll.
(Wie gut das ist, weiß ich nicht, allerdings habe ich da auch keinen Einfluss drauf)
Das Problem ist, wenn jetzt ein Release gemacht wird, wird bei allen Produkten die Version hochgezählt, auch wenn ja keine Änderung war, dadurch wird das Ganze sehr unübersichtlich. Die Frage wäre, ob man einen Maven-Job (Jenkins Job(?)) so definieren könnte, dass nicht die gesamte Mavenstruktur releast wird?

 Für mich ist das ganze noch etwas unübersichtlich, wir benutzen Maven, Jenkins und Github, und ich bin mir nicht zu 100% sicher, was davon wofür zuständig ist.

Das oben beschriebene ist die langfristig geplante Lösung. Kurzfristig war die Überlegung, dass bei einem Jenkins-Job eine Release-Notiz beigefügt werden kann, damit man wenigstens genau nachvollziehen kann, was sich mit der Version an welchem Produkt geändert hat. Außerdem soll ein git-Tag erstellt werden, aus dem ein neuer Branch erstellt wird, das ist im Moment meine Aufgabe. 

Meine bisherigen Erkenntnisse:
Prinzipiell müsste ich im Jenkins-Job einen Maven-Befehl mitgeben, der eine Release-Notiz ermöglicht (dazu habe ich absolut gar nichts gefunden), anschließend müsste ein Tag gesetzt werden und dann vermutlich mit 

```
git checkout -b newbranch branchname
```
aus diesem Tag ein Branch erzeugt werden. 

Zur Frage:
(Hat jemand ein Problem wie in der langfristigen Lösung schon mal gehabt, bzw gibt es da Ansätze, die ihr empfehlen könnt, über die ich mich informieren könnte?)
Zweitens: Wie genau würde ich bei der kurzfristigen Lösung vorgehen, ich stehe etwas auf dem Schlauch..
https://www.thomas-krenn.com/de/wiki/Git_Tags <-- Hier steht zwar prinzipiell drin, was ein Tag ist, aber ich kann aus dem gegebenen Code keine allgemeinen Regeln für das Erstellen eines Tags ableiten.

```
:~/repos/dev-1$ git tag v1.2
:~/repos/dev-1$ git show v1.2
commit cd490b9cda416a4b93b4a6bf4ac2c0ddb6740cc5
Author: Test User <tktest@example.com>
Date:   Tue Feb 7 07:15:19 2012 +0100

    version 1.2
```
Reicht für meine Zwecke schon die erste Zeile, bzw was passiert da in der dritten Zeile, wurde das generiert, oder muss man diesen Code für sein Projekt wissen?

Sorry, dass es so viele Fragen sind, aber ich bin im Moment ziemlich ratlos, da ich mich sonst zu 80% in Büchern informiere und nur bei Fehlern google, doch durch Corona ist im Moment nicht viel mit Büchereien ^^°
Danke fürs Lesen


----------



## mrBrown (21. Jan 2021)

Ist das alles ein einziges Maven-Multi-Module-Projekt, und im Jenkins gibt es genau einen Job, der alles baut und publish't?


Der "einfache" und auch normale Weg wäre, unabhängige Projekte auch auf Maven-Ebene unabhängig zu haben und pro Projekt dann einen Jenkins-Job, dann werden alle unabhängig released.


Aber: du bist doch relativ "neu" im Thema und sollst dich von Firmen-Seite aus mit Release-Strategien etc beschäftigen?


----------



## PinkMuffin (21. Jan 2021)

mrBrown hat gesagt.:


> Aber: du bist doch relativ "neu" im Thema und sollst dich von Firmen-Seite aus mit Release-Strategien etc beschäftigen?


Du brauchst das neu nicht in Anführungszeichen setzen, ich bin absolut neu in dem Thema 😅 
Mein Anweiser gibt mir im Moment Themen, die liegen geblieben sind, dass sind dann leider nicht zwingend Anfängerthemen..

Es ist ein einziges Maven-Multi-Module-Projekt, allerdings gibt es in Jenkins einige verschiedene Jobs. Allerdings sind einige davon wohl von abap, da das von der Java-Entwicklung getrennt gehalten werden muss. 

Mir steht jetzt auch nicht wirklich zu, den Entwicklern dort in ihre Maven-Struktur reinzureden, deshalb wollte ich wissen, ob ein teilweiser Release rein praktisch möglich ist. Das ich das dann später, sobald ich mehr Spielraum und Ahnung habe, auf dem sinnvolleren Weg lösen werde, ist dann ja eine andere Sache.


----------



## LimDul (21. Jan 2021)

Möglich? Mit Sicherheit.
Einfach möglich - eher nein.

Insbesondere wenn man so eine integrierte Lösung mit Jenkins und Git hat.

*Vermutlich* ist es möglich, wenn die maven-Struktur tatsächlich sich komplett splittet - es also kein Modul gibt, was zu mehreren "Anwendungen" gehört und mit allen Anwendungen released werden muss. Ggf. kann man den den maven release befehlt auf die relevanteste Pom laufen lassen und dann wird nur der Teilbaum darunter aktualisert.

Wenn man aber nun Jenkins Job und die Versionen in git auch noch Taggen will, wird es spaßig. Den ein Tag in git kann ich nicht auf einen Teilbaum setzen, sondern immer nur auf das gesamte GIT. Da muss man dann mit Präfixen oder ähnlichen arbeiten und dafür sorgen, dass das alles in sich konsistent bleibt. Einfach ist aber definitiv was anderes. Dafür müsste man als erstes mal den Release Prozess im Detail ansehen - wie tickt der eigentlich? 
* Wo wird die Version festgelegt (Git Tag, Jenkinks Job Parameter, Entwickler per maven Befehl)
* Wer baut wann die Version (Jenkins vermutlich aber wann und auf welchem Stand? Branch? Tag? ....)

Da gibt es verschiedene Möglichkeiten und du müsstest als erstes versuchen zu verstehen, wie das funktioniert.[/B]


----------



## PinkMuffin (21. Jan 2021)

LimDul hat gesagt.:


> Möglich? Mit Sicherheit.
> Einfach möglich - eher nein.


Ja, ich hör auch grad am Telefon, dass sie über mehrere Repositories und mehrere verschiedene Maven-Projekte nachdenken.. meine Aufgabe hat sich auch schon wieder geändert.. mittlerweile lohnt es sich fast nicht mehr, sich Gedanken zu einer Aufgabe zu machen, weil das meiste eh wieder verworfen wird..
Das Ding ist, dass wenn ich eine Jenkins Funktionalität suche, ich immer auf ein Plugin stoße und dann nichts anderes mehr dazu finde  😬, entweder läuft das meiste in Jenkins nur über Plugins, oder die Plugin-Betreiber wissen, wie man sich bei google platziert..


----------



## mrBrown (21. Jan 2021)

Zwar keine inhaltliche Antwort, aber: ich finde es ziemlich "dumm", jemand neues an sowas arbeiten zu lassen 😅 Das ist ein Thema, was einerseits fachliche Kompetenz braucht, da man das Zusammenspiel der verschiedenen Systeme und Module kennen muss und wissen muss, wie man was ändern kann, und gleichzeitig auch genug Standing braucht, um Änderungen durchzusetzen. Das jemanden machen zu lassen, der erstens fachlich gar nicht qualifiziert ist, und zweitens auch gar nicht die Möglichkeit hat, irgendwelche Änderungen durchzusetzen, ist eher ungünstig...


Aber auch noch ne inhaltliche Antwort:
Man kann Maven-Module auch unabhängig voneinander releasen – wie gut das klappt, hängt aber immer vom konkreten Projekt und den Dependencys zwischen den Modulen ab.

Im schlechtesten Fall ist das relativ eng gekoppelt, sodass unabhängiges bauen schon dadurch gar nicht möglich ist. In dem Fall bleibt einem nichts anderes übrig, als die Entwicklern zu besseren Konzepten zu drängen, und die auch hart durchzusetzen.

Im besten Fall ist das alles relativ entkoppelt und es gibt gar keine Abhängigkeiten, dann lässt sich alles problemlos bauen – das Problem liegt dann eher an der Stelle, was genau man wann und wie baut und wie man versioniert.
Einfache versionierung über Tags scheidet dann aus, die gelten für das gesamte Repo, nicht nur für einen Teil, man muss also (wie @LimDul grad schon schrieb) entweder Tags durch z.B. Präfixe unterscheidbar machen, oder man verzichtet ganz auf Tags – beides ist aber je nach Einsatzzweck eher unschön und nicht unbedingt sinnvoll. Potentiell ist da Versionierung direkt über Maven unabhängig von Tags am einfachsten – da muss man sich aber dann z.T. selbst drum kümmern.
Das "was muss gebaut werden" ist auch nicht unbedingt super einfach, bzw muss man die passende Lösung finden, und über Fingerprints etc arbeiten, damit ein Job nur gebaut wird, wenn sich das Teilprojekt auch geändert hat.


----------



## mrBrown (21. Jan 2021)

PinkMuffin hat gesagt.:


> Das Ding ist, dass wenn ich eine Jenkins Funktionalität suche, ich immer auf ein Plugin stoße und dann nichts anderes mehr dazu finde  😬, entweder läuft das meiste in Jenkins nur über Plugins, oder die Plugin-Betreiber wissen, wie man sich bei google platziert..


Eher: in Jenkins läuft alles nur über Plugins


----------



## PinkMuffin (21. Jan 2021)

mrBrown hat gesagt.:


> Eher: in Jenkins läuft alles nur über Plugins


Okay, dann bin ich ja beruhigt. Ich hatte schon Angst, ich hätte die Grundfähigkeit zu googeln verloren  😅


----------

