SonarQube : une autre vision de votre logiciel Dimitri Durieux Chef de projet Mons, 19 mars 2015 Centre d Excellence en Technologies de l Information et de la Communication
Qui suis-je? Chef de projet Master en sciences informatiques (UMons 2012) Dimitri Durieux Expertises: Analyse de logiciels & Qualité Produit Safety critical system Java & Scala Twitter : @didurieux 2
Contenu 1. Qualité logicielle 2. SonarQube en quelques mots 3. Analyse d un projet 4. Interprétation des résultats 5. Plugins et extensions 3
Qualité logicielle 4
Qualité logicielle Qualité du processus logiciel Sur base des standards de qualité (ISO 9000, ISO 15504) Quelle organisation est mise en place Quelle méthode de développement est utilisée Quels outils sont utilisés Quelles sont les bonnes pratiques mises en œuvre Quelle est la maturité de l équipe de développement Qualité du produit logiciel Sur base des standards de qualité (ISO 9126, ISO 25000) Quelles caractéristiques sont suffisamment couvertes Fiabilité? Sécurité? Maintenabilité? Transférabilité? Performance? Adéquation fonctionnelle? 5
Métrique Métriques Mesure un élément Objective ce qui est observé Comparable Appliquée au code Ex.: Nombre de lignes de code d une classe M2(B) M2(A) A M1(A) B M1(B) M1(A) < M1(B) M2(B) < M2 (A) 6
Evaluation de la qualité logicielle (SQALE) Qualité Réutilisabilité Maintenabilité Variabilité Testabilité Portabilité Sécurité Performance Fiabilité Modularité Compréhensib ilité Variabilité de l architecture Testabilité de l intégration Portabilité liée au langage Sécurité liée à l utilisateur Performance liée à la ROM Tolérance au faute Stabilité Lisibilité Variabilité de la logique Testabilité des units Portabilité liée à la time zone Sécurité liée à l OS Performance liée à la RAM Fiabilité liée à l architecture Variabilité des données Portabilité liée au hardware Sécurité liée aux instructions Performance liée à au CPU Fiabilité liée au ressource Portabilité liée au application externe Fiabilité liée à la synchronisation Portabilité liée au compilateur Fiabilité liée aux instructions Portabilité liée à l OS Fiabilité liée à la logique Fiabilité liée aux données 7
Evaluation de la qualité logicielle (SQALE) Qualité Réutilisabilité Maintenabilité Variabilité Testabilité Portabilité Sécurité Performance Fiabilité Modularité Compréhensib ilité Variabilité de l architecture Testabilité de l intégration Portabilité liée au langage Sécurité liée à l utilisateur Performance liée à la ROM Tolérance au faute Stabilité Lisibilité Variabilité de la logique Axe coût Variabilité des données Testabilité des units Portabilité liée à la time zone Portabilité liée au hardware Sécurité liée à l OS Sécurité liée aux instructions Performance liée à la RAM Axe utilisateur Performance liée à au CPU Fiabilité liée à l architecture Fiabilité liée au ressource Portabilité liée au application externe Fiabilité liée à la synchronisatio n Portabilité liée au compilateur Fiabilité liée aux instructions Portabilité liée à l OS Fiabilité liée à la logique Fiabilité liée aux données 8
Evaluation de la qualité logicielle (SQALE) Pas de double pointeur Compréhensibilité Pas de goto, break Pas de continue Indentation consistante Lisibilité Pas de code mis en commentaire Fiabilité liée aux données Pas d utilisation de variable noninitialisée Types explicitement déclaré 9
Evaluation de la qualité logicielle (SQALE) Les violations n ont pas de sens pour gérer la qualité Besoin d un point de vue : risque Besoin d agrégation Risque évalué sur base du rapport entre : Le coût de développement La dette technique 10
Dette technique Metaphor referring to the eventual consequences of poor or evolving software architecture and software development within a codebase. Technical View TD Unmanaged TD Managed Technical Debt Business View Time Direct Relationship Return On Invest TD Unmanaged TD Managed Time 11
Analyseurs de code 12
Analyseurs de code 13
SonarQube en quelques mots 14
Introduction Outil de gestion de la qualité de code Tableau de bord pas un analyseur de code FR + EN + (8 Langues) Flexible et orienté plugins 7 catégories Plus de 40 plugins officiels Open source (LGPLv3) Quelques plugins commerciaux 15
Fonctionnalités clés Possibilité élevée de personnalisation de l interface 20 langages Visualisation de l évolution Modèle de qualité et Dette technique Plan de remédiations Drilldown jusqu à la ligne 16
Langages vs TIOBE 17
Fonctionnalités Intégration dans l infrastructure : Build (Maven, Ant) IDE (Eclipse, Intellij IDEA) VCS (SVN, Git, Mercurial) Intégration continue (Jenkins, Hudson) Outils externes : Bugtracker (Mantis, Jira, Redmine) HP Fortify Utilisation de Sonar (Google Analytics et Piwik) 18
Fonctionnalités Gestion de l authentification et autorisations : LDAP Active Directory Single Sign On 2 Analyseurs disponibles : Spécifique à SonarQube : SonarQubeRunner Maven 19
Installation Télécharger les archives de SonarQube et SonarQubeRunner sur http://www.sonarqube.org/downloads/ Extraire les archives dans l endroit souhaité 20
Analyse d un projet 21
Aperçu global Nouvelle version Prétraitements des sources Configuration de l analyse Exécution Résultats dans SonarQube 22
Prétraitement des sources Le prétraitement des sources est l étape la plus importante Pour identifier les éléments susceptibles de causer des bruits dans l analyse Les éléments à identifier sont : Le code source généré Les librairies externes Les librairies intégrées 23
Configuration de l analyse Configuration de SonarQube Profils de qualité Paramètres par défaut Configuration de Sonarqube-runner Accès à la base de données Accès à la plate-forme des règles Configuration du projet Spécificité du projet Profil de qualité pour le projet 24
Configuration de l analyse La configuration d une analyse consiste en la création d un fichier «sonarproject.properties» à la racine des sources à analyser. Ce fichier contient la configuration de l analyse sur base d un ensemble de couples clé-valeur. Par exemple, pour le paramètre «sonar.projectname» valant «Nemo», on obtient : sonar.projectname=nemo Certaines valeurs peuvent être une liste de valeurs, par exemple, si «sonar.sources» vaut la liste «src/main/java» et «src/main/webapp», on obtient : sonar.sources=src/main/java,src/main/webapp 25
Paramètres de configuration Il y a des paramètres globaux et des paramètres spécifiques Les paramètres spécifiques dépendent du langage Les paramètres globaux sont soit obligatoires soit optionnels => Nous présenterons les paramètres globaux pertinents suivis des paramètres spécifiques au langage PHP 26
Exemple # Required metadata sonar.projectkey=be.cetic:qwuid sonar.projectname=quality Web Unified Interfaced Dashboard sonar.projectversion=0.1 # Comma-separated paths to directories with sources (required) sonar.sources=protected/models,protected/controlles,protected/modules/users # Language sonar.language=php # To deactivate features related to unit tests execution and coverage sonar.dynamicanalysis=false # Encoding of the source files sonar.sourceencoding=utf-8 # specific for analysers sonar.phppmd.skip=false sonar.phpcodesniffer.skip=false sonar.phpdepend.skip=false sonar.phpunit.skip=true sonar.phpunit.coverage.skip=true sonar.phppmd.analyzeonly=false sonar.phpcodesniffer.analyzeonly=false sonar.phpdepend.analyzeonly=false sonar.phpunit.analyzeonly=true 27
Exécution de l analyse Dans le répertoire contenant le fichier «sonar-project.properties», exécutez la commande suivante : sonar-runner Si l exécution se passe correctement, vous devriez voir le message suivant : INFO: ------------------------------------------------------------------------ INFO: EXECUTION SUCCESS INFO: ------------------------------------------------------------------------ Total time: 13.810s Final Memory: 7M/26M INFO: ------------------------------------------------------------------------ 28
Projet avec plusieurs modules (1) # Root project information sonar.projectkey=org.mycompany.myproject sonar.projectname=my Project sonar.projectversion=1.0 # Some properties that will be inherited by the modules sonar.sources=src # List of the module identifiers sonar.modules=module1,module2 module1.myproperty=value module2.myproperty=value 29
Projet avec plusieurs modules (2) # Root project information sonar.projectkey=org.mycompany.myproject sonar.projectname=my Project sonar.projectversion=1.0 # Some properties that will be inherited by the modules sonar.sources=src # List of the module identifiers sonar.modules=module1,module2 # Module 1 informations sonar.projectname=module 1 sonar.exclusions=blah, blah # Module 2 informations sonar.projectname=module 2 sonar.exclusions=blah, blah 30
Sous Maven La connexion à la DB sonar est réalisée dans le fichier settings.xml La configuration du projet (sonar-project.properties) est réalisée dans le fichier pom.xml Ajouter le tag «properties» Pour chaque paramètre clé-valeur (k,v), créer une balise dans le tag properties de la forme :<k>v</k> Pas besoin de copier : Le répertoire des sources Le nom du projet La clé du projet La version du projet Les modules (si Java) Lancement : mvn sonar:sonar 31
Exemple de pom.xml <?xml version="1.0" encoding="utf-8"?> <project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> </project> <modelversion>4.0.0</modelversion> <groupid>org.codehaus.sonar</groupid> <artifactid>example-java-maven</artifactid> <version>1.0-snapshot</version> <name>simple Java Maven Project</name> <properties> <project.build.sourceencoding>utf-8</project.build.sourceencoding> <sonar.language>java</sonar.language> </properties> 32
Interprétation des résultats 33
Page principale 34
Comparaison de versions ou d applications 35
Projet Apache Axis 36
Size & Complexity 37
Duplication 38
Duplication 39
Issues Drilldown 40
Issues Drilldown 41
Technical Debt 42
Technical Debt 43
TreeMap 44
TreeMap 45
TreeMap 46
Unit Tests 47
Hotspots 48
Remediation plan 49
Time Machine 50
Quality Profiles 51
Quality Profiles 52
Quality Gates 53
Quality Gates 54
Plugins et extensions 55
Plugins Définition : un plugin est un module externe enrichissant une application en fonctionnalités Il peut être activé et désactivé sans altérer les autres fonctionnalités Ce concept permet de dissocier un cœur d un ensemble de fonctionnalités périphériques et évolutives 56
Types de plugins Métriques additionnelles Cobertura, Mantis, PMD Outils du développeur Gouvernance PDF Report, SQALE Langages additionnels ABAP, C/C++, C#, Intégration Fortify, Jira, LDAP Langues Allemand, Grecque, Japonais Visualisation/reporting: SCM Stats, Tab Metric, Timeline 57
Gestionnaire de plugin 58
Exemple de plugins 59
Schéma d exécution HL Important à savoir : Le résultat est renvoyé qu à la fin! Les informations pour peupler les visualisations sont calculées lors de l analyse La suppression d une analyse ne met pas à jour les informations 60
Structure d un plugin Un plugin SonarQube est un ensemble d extensions Les extensions sont gérées dans une classe héritant de SonarPlugin Les extensions sont : ProjectBuilder : modification de la structure du projet Initializer : modification de la configuration d un module Sensor : Calcule les mesures et les violations Decorator : Extension appliquée sur chaque élément de l arbre d artefact (fichier, répertoire, module, projet) PostJob : ne modifie rien aux résultats. Pratique pour la génération de rapport Widget : Ajout de widget à l interface Autre outils notables : SourceImporter : Importation des sources dans l API Sonar SourceColorizer : Gestion de la colorization syntaxique RuleRepository : Gestion des règles additionnelles 61
Exécution d un plugin Pour chaque module : Bootstrapper Maven SonarRunner ProjectBuilders Initializer Sensors Decorators Persistance des résultats Sauvegarde des résultats sur SonarQube Postjobs 62
Ajouter une règle Ajouter une règle bête qui interdit l utilisation des méthodes Contenu du projet 63
Ajouter une règle 64
Ajouter une règle 65
Ajouter une règle 66
Ajouter une règle 67
Ajouter une règle 68
Ajouter un widget Les widgets sont des éléments Ruby On Rails Structure typique : 69
Ajouter un widget MyWidget.java My_widget.html.erb 70
Ajouter un widget 71
Ajouter un widget Exemple de requête : 72
Ajouter un widget 73
Conclusion 74
Conclusion Installation Simple Configuration l analyse dans un simple fichier Analyse 100% automatisable Dashboard riche et personnalisable Architecture flexible orientée plugin Open-Source! 75
Références http://www.sonarqube.org/ http://nemo.sonarqube.org/ http://linsolas.developpez.com/articles/java/qualite/sonar/ http://blog.xebia.fr/2008/10/29/controles-de-qualite-avec-sonar/ http://blog.excilys.com/2013/05/30/developper-ses-propres-regles-pmd-poursonar/ 76
Contacts Aéropole de Charleroi-Gosselies Bâtiment Éole Rue des Frères Wright, 29/3 B-6041 Charleroi Tel: +32.71.490.700 Fax: +32.71.490.799 info@cetic.be Dimitri Durieux R&D Engineer 071 490 767 0494 928 344 dimitri.durieux@cetic.be linkedin.com/company/cetic twitter.com/@cetic