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
Reprendre le squelette ci-desous
<?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> <groupId>fr.wseduc</groupId> <!-- Vient de gradle.properties > modowner --> <artifactId>mod-zip</artifactId><!-- Vient de gradle.properties > modname --> <version>3.0-b2school-SNAPSHOT</version><!-- Vient de gradle.properties > version --> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version> <maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version> <vertx.version>4.4.5</vertx.version> <web-utils.version>2.0.0</web-utils.version> <jacksonDatabindVersion>2.15.2</jacksonDatabindVersion> </properties> <scm><!-- À ajuster en fonction de l'url GitHub/GitLab --> <connection>scm:git:https://github.com/opendigitaleducation/mod-zip.git</connection> <developerConnection>scm:git:https://github.com/opendigitaleducation/mod-zip.git</developerConnection> <url>https://github.com/opendigitaleducation/mod-zip</url> </scm> <repositories> <repository> <id>ode</id> <name>ODE Repository</name> <url>https://maven.opendigitaleducation.com/nexus/content/groups/public</url> </repository> </repositories> <distributionManagement> <snapshotRepository> <id>ode-snapshots</id> <name>Snapshots</name> <url>https://maven.opendigitaleducation.com/nexus/content/repositories/snapshots/</url> </snapshotRepository> <repository> <id>ode-releases</id> <name>Releases</name> <url>https://maven.opendigitaleducation.com/nexus/content/repositories/releases/</url> </repository> </distributionManagement> <dependencies> <dependency> <groupId>io.vertx</groupId> <artifactId>vertx-core</artifactId> <version>${vertx.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>fr.wseduc</groupId> <artifactId>web-utils</artifactId> <version>${web-utils.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jacksonDatabindVersion}</version> <scope>provided</scope> </dependency> <!-- Ajouter les autres dépendances qui étaient dans build.gradle > dependencies --> </dependencies> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>buildnumber-maven-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <phase>validate</phase> <goals><goal>create</goal></goals> </execution> </executions> <configuration> <getRevisionOnlyOnce>true</getRevisionOnlyOnce> <shortRevisionLength>8</shortRevisionLength> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <finalName>${project.groupId}~${project.artifactId}~${project.version}-fat</finalName> <!--transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>your.main.class.name</mainClass> </transformer> </transformers--> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.2</version> <!-- Use the latest version --> <configuration> <archive> <manifestEntries> <Build-Time>${maven.build.timestamp}</Build-Time> <Main-Verticle>service:mod</Main-Verticle> <SCM-Commit-Id>${buildNumber}</SCM-Commit-Id> <SCM-Branch>${scmBranch}</SCM-Branch> </manifestEntries> </archive> </configuration> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>copy-resources</id> <phase>validate</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${basedir}/target/classes</outputDirectory> <includeEmptyDirs>true</includeEmptyDirs> <resources> <resource> <directory>${basedir}/deployment</directory> <filtering>false</filtering> </resource> </resources> </configuration> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>${maven-surefire-plugin.version}</version> </plugin> </plugins> </build> </project>
docker-compose.yml
Remplacer le service gradle par le service maven
tel que décrit plus bas.
version: "3" 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 -DskiptTests -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 -DskiptTests -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
Au tout premier du build.sh, ajouter le paramètre init afin d’initialiser le fichier .env
Avant :
#!/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 clean install publish' } } } }
Après :
#!/usr/bin/env groovy pipeline { agent any stages { stage('Build') { steps { checkout scm sh './build.sh init clean install publish' } } } }
.gitignore
Ajouter les lignes suivantes
.env target
Ajouter un commentaire