Combien de temps doit prendre un build Maven ?

Suite à mon précédent post, La meilleure façon de rater son projet grâce à Maven2, un collègue m’a décrit la situation suivante « Une pratique sur notre projet est de lancer un build maven -mvn clean install- sur son poste local avant de faire un commit. Cette commande est super longue, et les développeurs disent ‘c’est normal c’est maven qui est long’, ça doit prendre combien de temps un build Maven ? ».

Avant de répondre, je répète mon précédent conseil : fixez votre environnement pour que vous soyez confiants dans votre code sans avoir à lancer un build maven.

Combien de temps doit prendre un build Maven ?

En testant les projets que j’ai sous la main, des petits projets de quelques modules Maven à des projets de plus de 100 modules Maven, j’en viens à la conclusion :
temps de build Maven = temps des tests unitaires + 30s
(pour le projet de 100 modules, on dépasse de peu la minute supplémentaire).

Au final, le temps de build imputable à Maven est de l’ordre de 30 secondes voire 1 minute. Une différence de plus d’une minute est une alerte : le build est mal configuré.
A ce propos, selon Arnaud Héritier (membre du Project Management Committee sur Maven2) :

Le gros Kouak dans Maven c’est à l’initialisation la résolution de toutes les dépendances (le parcours du graphes etc).
Plus il y a des sous-modules, plus il y a de choses a faire.
En Maven 2.0.x les temps sont catastrophiques.
Ainsi un projet qui compte plus de 150 modules Maven peut prendre 8 minutes à s’initialiser.
Sur un autre projet, qui a aussi quelques dizaines de modules cela prend entre 1 et 2 minutes.
A partir de la version 2.1.0 le premier projet met moins d’une minute à s’initialiser et le deuxième ne met plus que quelques secondes.

Si vous êtes encore sur Maven 2.0.x et que votre build met plusieurs minutes à s’initialiser, je vous conseille d’essayer les dernières versions de Maven.

Pensez aussi à bien distinguer les étapes nécessaires lors d’un build développeurs et celles qu’on peut garder que sur l’intégration continue et à les séparer dans des profils différents. Typiquement, si l’on pré-compile des JSPs pour les environnements d’intégration et de production, cette tâche n’est pas utile lors des développements.

Maintenant, j’entends déjà la question suivante :

Mes tests unitaires prennent plusieurs minutes, comment je fais ?

Si vos tests unitaires prennent trop de temps, c’est surement que vous ne faites pas des tests unitaires, mais plutôt des tests d’intégration. Pour mieux comprendre la distinction : un article sur les types de tests.
Mon conseil n’est pas d’abandonner les tests d’intégration, bien au contraire, mais de ne pas les lancer systématiquement :

  • Tests unitaires : très rapides, lancés systématiquement sur le poste de développement
  • Tests d’intégration : potentiellement longs, lancés systématiquement par l’intégration continue, le développeur ne lance que ceux qu’il juge nécessaire

En résumé :

  • Le temps d’un build Maven doit être le temps de vos tests unitaires plus 30 secondes maximum
  • Ne conservez que le strict minimum dans le build « courant » et déléguez les tâches plus longues à l’intégration continue
  • Distinguez les tests unitaires des tests d’intégration, ces derniers seront joués régulièrement par l’intégration continue et à la demande sur les postes de développement