2023-10 : Guide de migration Maven

2023-10 : Guide de migration Maven

Résumé

Liste des changements à apporter à l’environnement de build pour passer de Gradle 4.5 à Maven 3.8.

Ticket JIRA et commit

Avant de toucher à un module, il faut créer un ticket JIRA avec comme titre :

  • [Nom de l’app] - Migration Maven

Après chaque portage, le message de commit doit être le suivant :

  • "feat: #<NUM_TICKET>, migration Maven"

Portage

pom.xml

Pour un module SANS création de JARs

Reprendre le squelette ci-dessous, adapter en suivant les commentaires.

<?xml version="1.0" encoding="UTF-8"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>io.edifice</groupId> <artifactId>edifice-parent</artifactId> <version>1.0</version> </parent> <groupId>fr.wseduc</groupId><!-- Vient de gradle.properties > modowner --> <artifactId>web-utils</artifactId><!-- Vient de gradle.properties > modname --> <version>3.0-b2school-SNAPSHOT</version><!-- Vient de gradle.properties > version --> <repositories> <repository> <id>ode</id> <name>ODE Repository</name> <url>https://maven.opendigitaleducation.com/nexus/content/groups/public</url> </repository> </repositories> <properties><!-- Reporter les versions des dépendances de gradle.properties > --> <jacksonDatabindVersion>2.15.2</jacksonDatabindVersion> </properties> <dependencies><!-- Reporter les dépendances qui étaient dans build.gradle > dependencies --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jacksonDatabindVersion}</version> <scope>provided</scope> </dependency> </dependencies> </project>

Pour un module AVEC création de JARs (.jar, -fat.jar, -test.jar, -deployment.jar)

Reprendre le squelette ci-desous, adapter en suivant les commentaires.

<?xml version="1.0" encoding="UTF-8"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>io.edifice</groupId> <artifactId>app-parent</artifactId> <version>1.0</version> </parent> <groupId>net.atos</groupId><!-- Vient de gradle.properties > modowner --> <artifactId>actualites</artifactId><!-- Vient de gradle.properties > modname --> <version>2.0-b2school-SNAPSHOT</version> <!-- Vient de gradle.properties > version --> <scm><!-- Adapter avec l'url du repertoire (github, gitlab...) --> <connection>scm:git:https://github.com/OPEN-ENT-NG/actualites.git</connection> <developerConnection>scm:git:https://github.com/OPEN-ENT-NG/actualites.git</developerConnection> <url>https://github.com/OPEN-ENT-NG/actualites</url> </scm> <repositories> <repository> <id>ode</id> <name>ODE Repository</name> <url>https://maven.opendigitaleducation.com/nexus/content/groups/public</url> </repository> </repositories> <properties><!-- Reporter les versions des dépendances de gradle.properties --> <web-utils.version>3.0-b2school-SNAPSHOT</web-utils.version> </properties> <dependencies><!-- Reporter les dépendances qui étaient dans build.gradle > dependencies --> <dependency> <groupId>io.vertx</groupId> <artifactId>vertx-core</artifactId> <version>${vertxVersion}</version> <scope>provided</scope> </dependency> <dependency> <groupId>fr.wseduc</groupId> <artifactId>web-utils</artifactId> <version>${web-utils.version}</version> <scope>compile</scope> </dependency> </dependencies> </project>

docker-compose.yml

Remplacer le service gradle par le service maven tel que décrit plus bas.

services: maven: image: maven:3.8.6-jdk-8 user: "$DEFAULT_DOCKER_USER" working_dir: /usr/src/maven volumes: - ./:/usr/src/maven - ~/.m2:/var/maven/.m2 environment: MAVEN_CONFIG: /var/maven/.m2

build.sh

Ajouter au début du fichier la variable MVN_OPTS tel que décrit ci-dessous.

MVN_OPTS="-Duser.home=/var/maven"

Remplacer les appels au service gradle par des appels au service maven tel que ci-dessous.

Avant:

docker-compose run --rm -u "$USER_UID:$GROUP_GID" gradle gradle clean

Après :

docker compose run --rm maven mvn $MVN_OPTS clean

Ajouter les méthodes init , install et test et les ajouter à la liste des options supportées (la méthode install remplace buildGradle)

init() { me=`id -u`:`id -g` echo "DEFAULT_DOCKER_USER=$me" > .env } ... install () { docker compose run --rm maven mvn $MVN_OPTS install -DskipTests } test () { docker compose run --rm maven mvn $MVN_OPTS test } ... for param in "$@" do case $param in init) init ;; ... install) install ;; test) test ;; ...

Modifier la méthode publish pour qu’elle soit équivalente à celle écrite ci-dessous :

publish() { version=`docker compose run --rm maven mvn $MVN_OPTS help:evaluate -Dexpression=project.version -q -DforceStdout` level=`echo $version | cut -d'-' -f3` case "$level" in *SNAPSHOT) export nexusRepository='snapshots' ;; *) export nexusRepository='releases' ;; esac docker compose run --rm maven mvn -DrepositoryId=ode-$nexusRepository -DskipTests -Dmaven.test.skip=true --settings /var/maven/.m2/settings.xml deploy }

Exemple complet :

#!/bin/bash MVN_OPTS="-Duser.home=/var/maven" init() { me=`id -u`:`id -g` echo "DEFAULT_DOCKER_USER=$me" > .env } clean () { docker compose run --rm maven mvn $MVN_OPTS clean } install () { docker compose run --rm maven mvn $MVN_OPTS install -DskipTests } test () { docker compose run --rm maven mvn $MVN_OPTS test } publish() { version=`docker compose run --rm maven mvn $MVN_OPTS help:evaluate -Dexpression=project.version -q -DforceStdout` level=`echo $version | cut -d'-' -f3` case "$level" in *SNAPSHOT) export nexusRepository='snapshots' ;; *) export nexusRepository='releases' ;; esac docker compose run --rm maven mvn -DrepositoryId=ode-$nexusRepository -DskipTests -Dmaven.test.skip=true --settings /var/maven/.m2/settings.xml deploy } for param in "$@" do case $param in init) init ;; clean) clean ;; install) install ;; test) test ;; publish) publish ;; *) echo "Invalid argument : $param" esac if [ ! $? -eq 0 ]; then exit 1 fi done

Jenkinsfile

Ajouter l'étape “Initialization”.
Au tout premier argument du build.sh, ajouter le paramètre init afin d’initialiser le fichier .env

Avant :

#!/usr/bin/env groovy pipeline { agent any stages { stage('Build') { steps { checkout scm sh './build.sh clean install publish' } } } }

Après :

#!/usr/bin/env groovy pipeline { agent any stages { stage("Initialization") { steps { script { def version = sh(returnStdout: true, script: 'docker compose run --rm maven mvn $MVN_OPTS help:evaluate -Dexpression=project.version -q -DforceStdout') buildName "${env.GIT_BRANCH.replace("origin/", "")}@${version}" } } } stage('Build') { steps { checkout scm sh './build.sh init clean install publish' } } } }

.gitignore

Ajouter les lignes suivantes

.env target dependency-reduced-pom.xml

 

Related content