Development

Améliorer la qualité du code avec SonarQube

Développeurs, voici comment améliorer le processus de mesure de la qualité de votre code avec SonarQube.

January 22 2016

Maintenir un certain niveau de qualité et de lisibilité du code est d'une importance cruciale lorsqu'il s'agit de développement réussi dans l'environnement de développement dynamique d'aujourd'hui, quand plusieurs équipes travaillent sur le même code et que des changements sont souvent apportés. Un tel environnement nécessite de suivre certaines règles de codage rendant le code compréhensible par tous ceux qui sont impliqués dans le processus.

Il est impératif pour nous, chez Infobip, que les produits que nous livrons répondent aux normes de qualité les plus élevées. Le code source est au cœur de chaque produit et la qualité de ce code est le facteur le plus important pour déterminer la qualité du produit global.

Pour maintenir un contrôle de haute qualité, nous avons choisi de mettre en œuvre un contrôle du code dans notre processus de développement. Cependant, après quelques temps, les mesures commençaient à prendre trop de temps, nous éloignant des autres tâches importantes. Celles-ci ne consistent pas seulement en un processus de mesures créatives, il faut aussi vérifier les erreurs répétitives, l'utilisation des règles de convention etc. L'ensemble du processus a été remis en question et la solution logique était d'en automatiser une partie.

Dans nos centres de développement nous essayons d'automatiser autant de tâches manuelles que nous pouvons, afin de pouvoir nous concentrer sur l'innovation qui est le meilleur choix pour nos clients. En ce moment nos développeurs peuvent déployer automatiquement des services, easily write public APIs et générer des bibliothèques client dans différents langages de programmation. Trouver la solution parfaite nous a pris du temps, en nous aidant de l'automatisation partielle du contrôle du code. Après avoir cherché différents outils, nous avons réalisé que SonarQube répondait à toutes nos attentes.

À propos de SonarQube

SonarQube est une plate-forme open source permettant de mesurer la qualité du code. Il fait partie des outils d'analyse du code statique, avec Understand, semmle, et d'autres.

La plate-forme reçoit le code source sous forme d'entrée. Ce code peut être envoyé à partir de l'environnement de développement intégré (EDI) ou tiré de SCM. Il existe des plugins SonarQube pour les EDI les plus répandus qui rendent les analyses de code beaucoup plus faciles. En se basant sur l'entrée, la plate-forme commence à appliquer des règles prédéfinies et vérifie si elles sont respectées. Comme une production d'analyse, de nombreuses informations utiles sont indiquées ainsi que des propositions d'amélioration.

Nous avons choisi SonarQube à cause des nombreuses et importantes règles Java. Il en existe actuellement plus de 700, et le nombre augmente continuellement. Nous réalisons une analyse principalement sur un code écrit en Java, mais elle peut être facilement réalisée sur l'un des 20 autres langages de programmation.

SonarQube est enfichable, afin que vous puissiez écrire vos propres plugins si vous avez besoin d'aide pour un langage particulier ou que vous voulez écrire vos propres règles. Si vous avez besoin d'ajouter vos propres règles de code, c'est possible en utilisant des expressions XPath ou en créant un nouveau plugin en utilisant Java.

La plateforme SonarQube comprend quatre composants : analyseurs, serveur, plugins installés sur le serveur et dernier point, mais pas le moindre, une base de données.

Achitecture SonarQube

Les analyseurs sont responsables du fonctionnement de l'analyse du code ligne par ligne. Ils peuvent fournir des informations concernant la dette technique, la couverture du code, sa complexité, les problèmes détectés, etc. Ces derniers peuvent être des bogues affirmés ou potentiels, des choses qui peuvent mener à des erreurs dans le futur, etc. Lorsque l'analyse est faite, les résultats peuvent se voir sur la page Internet hébergée par le serveur Internet SonarQube. Le serveur simplifie la configuration du logiciel SonarQube, l'installation du plugin et fournit un aperçu intuitif des résultats..

Enigneering

Aperçu des résultats

De nombreux problèmes peuvent se poser dans un code. Les règles diffèrent et peuvent être placées dans un des 5 groupes, selon leur sévérité : bloquant, critique, majeur, mineur et info. Donc s'il y a un bogue ou une erreur potentielle, elle sera considérée comme problème bloquant ou critique et certains problèmes mineurs tels que « interdiction d'utiliser les nombres magiques » sont classés dans Mineur ou Info.

Voici un exemple des règles les plus violées:

Engineering

Règles les plus enfreintes

Le grand avantage de SonarQube est le stockage des données dans des bases de données relationnelles que généralement, tous les développeurs connaissent. La base de données que nous avons choisie est MySQL. Essentiellement parce que nous sommes de fervents partisans des technologies open source. Si vous avez d'autres préférences en matière de base de données ou si vous avez plus l'habitude de travailler avec une autre base de données, celles acceptées sont : PostgreSQL, Oracle, etc.

Configuration de SonarQube

L'architecture SonarQube autorise un serveur et une base de données séparés ; elle autorise aussi les réplications de la base de données et le déploiement du serveur sur plusieurs machines pour obtenir une meilleure performance et extensibilité.

Pour les essais et pour tester différentes fonctionnalités de SonarQube, vous pouvez essayer avec un serveur Internet et une base de données intégrée et analyser l’un des deux projets. Si l'environnement est configuré correctement du début, il n'y aura pas de problème pour migrer la base de données et le serveur SonarQube d'une machine de développement local sur le serveur. Docker, avec ses contenants peut vous aider, parce que vous pouvez trouver tout ce dont vous avez besoin (code, exécution, bibliothèques de système) et le déployer facilement sur n'importe quelle machine. Il existe aussi un contenant officiel Docker SonarQube avec une version H2 intégrée, pour que vous ne perdiez pas votre temps à créer la vôtre. Une base de données externe peut aussi être configurée, utile à tout travail sérieux avec SonarQube.

Nous avons commencé avec une machine virtuelle dédiée ; nous n'avons eu aucun problème jusqu'à ce que le nombre de projets dépasse une certaine quantité et nous avons commencé à analyser le code quotidiennement. Cependant, nous avons noté une baisse drastique de performance et une durée d'analyse plus longue. Ceci est arrivé lorsque nous avons commencé à séparer différentes couches SQ (architecture) sur différentes machines.

Pour commencer, nous avons séparé la base de données et le serveur Sonar. Nous avons accepté que les recommandations de SonarQube soient sur le même réseau.  Pour le déploiement de SonarQube, nous utilisons un conteneur Docker ce qui le rend facile à installer sur une autre machine si nous avons besoin de meilleurs niveaux de performance.

SonarQube et l'ntégration continue

Comme mentionné précédemment, nous nous occupons de l'automatisation et faisons moins d'efforts sur les choses qui pourraient être automatisées, ce qui nous libère plus de temps pour la partie créative du travail. L'analyse du code s'intègre parfaitement dans l'intégration continue.

Nous pratiquons et prêchons l'intégration continue et le développement agile, voici à quoi ressemble un processus de résolution de tâches chez nous:

Cela commence par le développeur (appelons-la Chantal) qui s'attribue une tache et débute le processus. Pendant la résolution de la tâche, Chantal réalise l'analyse du code dans l'EDI, ligne après ligne et obtient des résultats. Elle peut voir si toutes les exigences en matière de qualité de code sont satisfaites. Lorsqu'il s'agit de la logique, elle doit la vérifier par elle-même. Lorsque Chantal est certaine que le nouveau code écrit remplit toutes les exigences, elle le consigne dans le répertoire et demande à Nicolas de le revoir. Après avoir validé les modifications dans le répertoire Git, le connecteur logiciel déclenche un build Jenkins. Le build fonctionne automatiquement et l'artefact avec la nouvelle caractéristique est disponible dans le répertoire interne Maven et peut être déployé facilement.

Nicolas revoit le code que Chantal a écrit et fait une analyse pour déterminer si la qualité du code a le niveau désiré. Après l'interprétation des résultats, Nicolas doit seulement faire la partie créative de l'audit du code : revoir la logique. Si tout est OK, la tâche est terminée et la nouvelle caractéristique est prête pour la production.

Engineering

Gestion du code source avec le serveur CI et SonarQube

En version 4.0, le mode d'analyse incrémentale est introduit. Ce mode pourrait être utilisé pour vérifier si les nouvelles modifications enfreignent certaines règles importantes et doit être utilisé par le développeur qui a fait ces changements. Avant la version 4.0, un développeur commençait l'analyse de tout le projet, même s'il avait changé seulement deux ou trois fichiers. Avec la nouvelle caractéristique, le temps nécessaire à l'analyse est considérablement plus court. Derrière ce nouveau mode incrémental, il y a aussi une analyse complète du projet : une analyse ligne par ligne avec envoi du résultat au serveur et stockage dans la base de données, ainsi qu'un mode aperçu qui fait l'analyse complète mais n'enregistre pas les résultats dans la base de données.

En ce moment nous utilisons le mode Analyse du projet complet avec stockage des résultats, pour les builds de nuit et le mode aperçu, après chaque commit.

Ceci fournit une façon de suivre le contrôle de la qualité du code de commit en commit. De plus nous pouvons avoir des données historiques concernant la qualité du code, nous pouvons donc observer comment se comportent la qualité pendant la durée du projet.

Conclusion

Utiliser SonarQube facilite le contrôle qualité du code et diminue le nombre de bugs réels et potentiels. Les développeurs sont maintenant plus concentrés sur la logique elle-même et peuvent consacrer leur temps aux exigences d'analyse de l'activité et à trouver une solution optimale dans un cas concret. Après sa mise en œuvre, les responsables ont commencé à suivre les données, et parce qu'elles étaient basées sur les résultats, ils estiment qu'il est possible d'avoir une meilleure perception du travail de développement.

Je citerai John F. Woods:

Codifiez toujours comme si le type qui entretient votre code était un violent psychopathe qui sait où vous habitez. 

Qu'attendez-vous ? Aujourd'hui est un grand jour pour analyser un code.

Nevena Menkovic, Software Engineer