Problème
La procédure de livraison d'applications à partir de la trunk est complexe et fastidieuse chez Santéclair.Si le nombre de livrables est important, cela peut prendre jusqu'à une demie journée d'actions répétitives laissant place à des erreurs de manipulation et des oublis.
Afin d'avoir un ordre d'idée du nombre d'actions à effectuer par projet, en voici la liste :
- Faire un commit de vos modifications et faire un merge avec la branche maintenance
- Résoudre les conflits
- Aligner la version du super-pom si besoin
- Faire un commit final
- Lancer la tâche de release pour créer le nouveau tag
- Renommer la branche maintenance en maintenance-V.R.x
- Switcher sur cette branche maintenance-V.R.x
- Changer la valeur de la balise scm --> developerConnection dans le pom : changer maintenance par maintenance-V.R.x
- Switcher sur la trunk
- Créer la nouvelle branche maintenance à partir du trunk
- Faire évoluer la version du pom de la trunk : V.R+1.0-SNAPSHOT
- Faire un commit sur la trunk
- Dans le cas d'une bibliothèque (.jar), faire un deploy de la trunk pour l'ajouter à Nexus.
- Switcher sur la branche maintenance
- Changer la valeur de la balise scm --> developerConnection dans le pom de la maintenance : changer trunk par branches/maintenance
- Faire un commit sur la maintenance
- Dans le cas d'une bibliothèque (.jar), faire un deploy de la trunk pour l'ajouter à Nexus.
- Dans le cas d'un projet web (.war), brancher le projet sur la version que l'on souhaite livrer et lancer la tâche correspondante.
Beaucoup de tâches étant automatisables, la seule chose qui restait à faire était de se pencher sur les solutions envisageables et compatibles avec notre SI.
Solution
La solution retenue fut celle d'utiliser SVNKit afin de gérer toutes les tâches manuelles de :
- commit / update
- switch
- tag / release
- vérification que le repo distant et le workspace sont synchronisés ..etc
Le développement d'un plugin Mojo semblait aussi nécessaire afin de pouvoir intégrer toutes ces tâches dans le cycle de vie du build Maven.
Les autres actions de modification et de renommage de fichiers...etc se feront via les classes utilitaires du pakage java.nio.
Mise en place
D'emblée, il est nécessaire de spécifier à Maven le chemin vers la JDK (si ce n'est pas déjà fait) en ajoutant @SET JAVA_HOME=C:\Program Files\Java\jdk1.7.0_25 au fichier mvn.bat du repertoire maven d'installation.
Ce projet a trois dépendances :
Le développement d'un Mojo Maven se fait en étendant la classe AbstractMojo.
La description du plugin doit être fournie, soit dans le pom.xml via les balises <goal> et <phase>, soit par un tag Javadoc au niveau de la classe java définissant le Mojo :
C'est la deuxième solution que j'ai retenue car elle me permet de tout centraliser au niveau du Mojo.
Certaines informations comme l'emplacement du projet seront utiles pour la livraison. Elles peuvent être récupérées de la même manière via le tag Javadoc @parameter :
Depuis Maven 3, il est aussi possible d'injecter ces valeurs par défaut via l'annotation @Parameter.
Il est aussi possible de récupérer des paramètres spécifiés en ligne de commande lors de l'exécution du plugin.
Ensuite, tout se fait dans la méthode execute() du Mojo à savoir :
1 - L'initialisation nécessaire pour la prise en compte de tous les protocoles :
2 - La connexion au répository SVN via la classe SVNWCUtil :
3 - La récupération d'une instance de SVNClientManager permettant d'effectuer le reste des opérations : changement d'emplacement sur le svn distant, commit, update, switch...etc :
Quelques actions SVN via SVNKit :
- L'action de switch se fait de la manière suivante :
- L'action de copie d'un répertoire d'un emplacement vers un autre sur le répository SVN distant se fait de la manière suivante :
J'utilise ce code pour sauvegarder l'ancienne branche Maintenance.
- L'action de commit du fichier pom.xml :
Le plugin Maven-invoker
Il va nous permettre d'exécuter le goal Maven de release. Voici comment je l'utilise :
Si un paramètres packageMe est spécifié en ligne de commande lors de l'exécution du plugin, je lance la tâche maven de package :
Optimisation
Avant de lancer tout le process de release je vérifie qu'il n'y a pas de différence ou de conflit entre les sources du workspace et les sources présentes dans le répository SVN distant :
Lancement du plugin
Il faut tout d'abord déployer le plugin via la commande mvn clean deploy.
Puis se positionner sur le prjet à livrer et lancer la commande : mvn:groupId:artifactId:version:goald ou encore mvn santeclair:maven-plugin-fwk:1.0.0:release-trunk