git, maven et jenkins - versioning, dev et release builds workflow

12

Quelle est la méthode préférée pour effectuer les opérations suivantes avec git, maven et jenkins:

Je suis en train de développer une application, que je souhaite maintenir les branches "dev" et "release". J'aimerais que jenkins construise les deux. Il se pourrait que les versions-artefacts aient des versions comme 1.5.2 et les dev-builds ne soient que 0.0.1-INSTANTANÉS. Je voudrais ne pas avoir 2 fichiers pom.xml différents.

J'ai examiné les profils, mais ils ne semblent pas pouvoir changer les versions d'artefact. Une façon dont j'ai regardé pourrait être d'ajouter un «qualificatif» aux versions de test. Bien sûr, je pourrais simplement renommer le fichier, car les vraies informations sur les artefacts à ce sujet ne sont pas importantes, car l'application est autonome.

Quelle serait la meilleure façon de procéder? Ou comment feriez-vous cela?

varesa
la source

Réponses:

3

J'imagine qu'il devrait y avoir une relation inhérente entre ces branches qui devrait résoudre le problème des numéros de version.

Libération

J'imagine que vous pourriez faire quelque chose comme fusionner le code prêt à la production de la branche dev à la branche release, puis effectuer une version Maven (via Jenkins ou manuellement). Cela transfère automatiquement les numéros de version à la prochaine génération. Vous fusionnez donc le code 1.4.7-SNAPSHOT dans cette branche, effectuez la version et coupez la version 1.4.7, et Maven déploie automatiquement votre copie de travail en 1.4.8-SNAPSHOT.

Mise à jour de la ligne de base (facultatif)

Si vous n'utilisez pas déjà votre tronc (ou branche de base, etc.) comme emplacement pour vos versions, vous devez mettre à jour le tronc dès que vous avez terminé une version. Cela signifie que vos numéros de version sont également mis à jour. Cette étape peut être théorique si vous considérez simplement que la branche de publication est la référence.

Fusion de Baseline à Dev Branch

Il est essentiel que votre branche de développement reste à jour avec le code de production réel . Vous devez fusionner le code depuis la ligne de base (ou la branche de publication, selon l'implémentation) jusqu'à votre branche de développement. Ceci est important dans votre cas car cela signifie que les modifications de pom qui se sont produites pendant le processus de publication, qui ont changé la version en 1.4.8-SNAPSHOT, sont apportées à cette branche.


D'après la lecture que j'ai faite (ainsi que les processus dans mon organisation), cela semble être une utilisation assez standard et efficace des versions et des instantanés de Maven, et plutôt que de maintenir des numéros de version complètement déconnectés sur différentes branches, c'est facile à dire que toute version 1.4.7-SNAPSHOT était en fait un prédécesseur immédiat de la version 1.4.7. Ils sont liés. J'irais jusqu'à dire que si vous ne fusionnez pas dans les deux sens entre ces branches, vous faites mal les versions de SCM et de Maven et vous vous mettez en danger de développer contre du code qui ne correspond pas à la production , réintroduit des bogues en production, etc.

RonU
la source
Par "version maven", vous voulez dire le plugin maven-release?
varesa
Oui. Vous pouvez également configurer certains builds dans Jenkins pour être des builds Maven Release, qui invoque le plugin maven-release-plugin.
RonU
C'est comme si la "clé" avait été recherchée. Merci!
varesa
1

Repensez votre approche.

Il est très courant d'utiliser par exemple 1.4.2 pour une version finale, puis 1.4.3-SNAPSHOT pour le développement suivant.

Lorsque vous devez conserver la version 1.4.2, branchez-la à partir de la validation à l'origine de votre artefact 1.4.2.

Ensuite, vous dites à Jenkins l'emplacement de votre référentiel et le nom de la branche, ce qui entraîne l'extraction d'un ensemble de fichiers, puis vous dites à Jenkins d'utiliser maven sur votre projet pour le construire.

Remarque: J'ai trouvé qu'il est très avantageux d'utiliser un seul pom.xml pour créer l'artefact réel et un autre pom.xml pour créer les bits réels à envoyer au client.


la source