Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

Niveaux de criticité dans Jenkins, Sonar, PMD et Checkstyle

Sonar permet de configurer, via une interface graphique, les niveaux de criticité des alertes remontées par PMD et Checkstyle. Ces niveaux peuvent ensuite (après quelques réglages) servir à influencer la santé des builds dans Jenkins - par exemple, l'utilisation de System.out.println provoquera un simple warning, alors que le lancement manuel d'un Throwable fera échouer le build.

Le problème, c'est que chaque outil dispose de ses propres niveaux de criticité, et il n'est pas toujours simple de déterminer leur correspondance d'un outil à l'autre : un réglage "minor" dans Sonar correspond-il à "info" ou "warning" dans PMD ? Et Jenkins le comprendra-t-il comme une alerte de type "low" ou "normal" ?

Après investigation, je vous suis en mesure de vous proposer la table de correspondance ci-dessous :


Sonar PMDCheckstyleJenkins
Blocker1Error High
Critical 2Error High
Major 3WarningNormal
Minor 4Info Low
Info 5Info Low


FindBugs, quant à lui, n'attribue apparemment pas de niveau de criticité à ses alertes ; en tout cas, ils ne sont pas exportés par le permalink de Sonar.

Grâce à ce mapping, j'ai mis en place la stratégie suivante :

  • Les alertes corrigées et qui ne doivent jamais réapparaître dans le code sont marquées "Blocking" ou "Critical". La nuance étant que les premières sont orientées "plateforme" (ne pas utiliser com.sun.*, ne pas invoquer le GC...), alors que les secondes relèvent des normes de codage internes (ne pas utiliser printStackTrace, pas de return depuis un block finally...).
  • Les alertes qu'on ne peut pas corriger pour des raisons... historiques on va dire, mais qu'on ne souhaite pas voir se multiplier, sont déclarées comme Majeures.
  • Les autres alertes sont considérées comme Mineures, et n'influencent pas la santé du build.

Jenkins est ensuite configuré comme suit :


jenkins.png

Ainsi, à la moindre réintroduction d'une alerte normalement éliminée, le build échoue ; et si une nouvelle alerte "historique" est ajoutée, le build est considéré comme instable. Le code est donc stabilisé autour d'un plateau acceptable d'alertes, et toute augmentation injustifiée est immédiatement repérée et corrigée.


Commentaires

1. Le samedi 15 octobre 2011, 02:18 par Piwaï

Doh, j'ai jamais pensé à mettre un return dans un bloc finally... tu peux changer la valeur du return dans un bloc finally ???

2. Le mercredi 26 octobre 2011, 16:43 par deadalnix

Oui, et ça mène à des bugs très difficiles à identifier !

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.