Comment assurer la qualité du code avec SonarQube sur Ubuntu 16.04

L'auteur a sélectionné lesElectronic Frontier Foundation pour recevoir un don dans le cadre du programmeWrite for DOnations.

introduction

Code quality est une approximation de l'utilité et de la maintenabilité d'un morceau de code spécifique. Le code qualité facilitera la tâche de maintenance et d’extension de votre application. Cela permet de réduire le nombre de bogues introduits lorsque vous apportez les modifications requises ultérieurement.

SonarQube est un outil open source qui aide à l'analyse de la qualité du code et à la création de rapports. Il analyse votre code source à la recherche de bogues, de vulnérabilités et de problèmes de maintenabilité potentiels, puis présente les résultats dans un rapport qui vous permettra d'identifier les problèmes potentiels dans votre application.

L’outil SonarQube comprend deux sous-applications: un moteur d’analyse, installé localement sur la machine du développeur, et un serveur centralisé pour la tenue des dossiers et la création de rapports. Une seule instance de serveur SonarQube peut prendre en charge plusieurs scanners, ce qui vous permet de centraliser les rapports sur la qualité du code provenant de nombreux développeurs à un seul endroit.

Dans ce guide, vous allez déployer un serveur SonarQube et un scanner pour analyser votre code et créer des rapports sur la qualité du code. Vous effectuerez ensuite un test sur votre ordinateur en l’analysant à l’aide de l’outil SonarQube.

Conditions préalables

Avant de commencer ce guide, vous aurez besoin des éléments suivants:

[[step-1 -—- preparation-for-the-install]] == Étape 1 - Préparation de l'installation

Nous devons suivre quelques étapes avant d’installer SonarQube. Étant donné que SonarQube est une application Java qui fonctionnera en tant que service et que l’exécution de services en tant qu’utilisateurroot n’est certainement pas idéale, nous allons créer un autre utilisateur système spécialement pour exécuter les services SonarQube. Nous créerons ensuite le répertoire d’installation et définirons ses autorisations, puis nous créerons une base de données MySQL et un utilisateur pour SonarQube.

Commencez par créer un utilisateursonarqube:

sudo adduser --system --no-create-home --group --disabled-login sonarqube

Nous allons uniquement utiliser cet utilisateur pour exécuter le service SonarQube. Nous créons donc un utilisateur système qui ne peut pas se connecter directement au serveur.

Ensuite, créez le répertoire qui contiendra les fichiers SonarQube:

sudo mkdir /opt/sonarqube

Une fois le répertoire créé, mettez à jour les permissions afin que l'utilisateursonarqube puisse lire et écrire des fichiers dans ce répertoire:

sudo chown -R sonarqube:sonarqube /opt/sonarqube

Les versions de SonarQube sont conditionnées dans un format compressé, donc installez l'utilitaireunzip à l'aide de votre gestionnaire de paquets afin de pouvoir extraire les fichiers de distribution:

sudo apt-get install unzip

Ensuite, nous devons créer une base de données et les identifiants que SonarQube utilisera. Connectez-vous au serveur MySQL en tant qu'utilisateurroot:

mysql -u root -p

Créez ensuite la base de données SonarQube:

CREATE DATABASE sonarqube;
EXIT;

Créez maintenant les informations d'identification que SonarQube utilisera pour accéder à la base de données.

CREATE USER sonarqube@'localhost' IDENTIFIED BY 'some_secure_password';
GRANT ALL ON sonarqube.* to sonarqube@'localhost';

Accordez ensuite des autorisations pour que l'utilisateur nouvellement créé puisse modifier la base de données SonarQube:

GRANT ALL ON sonarqube.* to sonarqube@'localhost';

Appliquez ensuite les modifications d'autorisation et quittez la console MySQL:

FLUSH PRIVILEGES;
EXIT;

Maintenant que l’utilisateur et le répertoire sont en place, allons télécharger et installer SonarQube lui-même.

Étape 2 - Téléchargement et installation de SonarQube

Commencez par remplacer le répertoire de travail actuel par le répertoire d'installation SonarQube:

cd /opt/sonarqube

Ensuite, dirigez-vous vers lesSonarQube downloads page et récupérez le lien de téléchargement pour SonarQube 7.0. Il existe deux versions de SonarQube disponibles au téléchargement sur la page, mais dans ce didacticiel spécifique, nous utiliserons SonarQube 7.0.

Après avoir obtenu le lien, téléchargez le fichier:

sudo wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-7.0.zip

Puis décompressez le fichier:

sudo unzip sonarqube-7.0.zip

Une fois les fichiers extraits, supprimez le fichier zip téléchargé, car vous n'en avez plus besoin:

sudo rm sonarqube-7.0.zip

Maintenant que tous les fichiers sont en place, il est temps de configurer SonarQube.

Étape 3 - Configuration du serveur SonarQube

Nous devrons modifier quelques éléments dans le fichier de configuration SonarQube. À savoir:

  • Nous devons spécifier le nom d'utilisateur et le mot de passe que le serveur SonarQube utilisera pour la connexion à la base de données.

  • Nous devons également dire à SonarQube d’utiliser MySQL pour notre base de données backend.

  • Nous dirons à SonarQube de fonctionner en mode serveur, ce qui améliorera les performances.

  • Nous demanderons également à SonarQube d’écouter uniquement sur l’adresse du réseau local, car nous utiliserons un proxy inverse.

Commencez par ouvrir le fichier de configuration SonarQube:

sudo nano sonarqube-7.0/conf/sonar.properties

Commencez par changer le nom d'utilisateur et le mot de passe que SonarQube utilisera pour accéder à la base de données en utilisant le nom d'utilisateur et le mot de passe que vous avez créés pour MySQL:

/opt/sonarqube/sonarqube-7.0/conf/sonar.properties

    ...

    sonar.jdbc.username=sonarqube
    sonar.jdbc.password=some_secure_password

    ...

Ensuite, indiquez à SonarQube d’utiliser MySQL comme pilote de base de données:

/opt/sonarqube/sonarqube-7.0/conf/sonar.properties

    ...

    sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

    ...

Enfin, indiquez à SonarQube de s’exécuter en mode serveur et d’écouter uniquement l’adresse locale:

/opt/sonarqube/sonarqube-7.0/conf/sonar.properties

    ...

    sonar.web.host=127.0.0.1
    sonar.web.javaAdditionalOpts=-server

Une fois ces champs mis à jour, sauvegardez et fermez le fichier.

Nous allons ensuite configurer le serveur SonarQube pour s’exécuter en tant que service afin qu’il se lance automatiquement au redémarrage du serveur.

Créez le fichier de service:

sudo nano /etc/systemd/system/sonarqube.service

Ajoutez le contenu suivant au fichier qui spécifie le mode de démarrage et d’arrêt du service SonarQube:

/etc/systemd/system/sonarqube.service

[Unit]
Description=SonarQube service
After=syslog.target network.target

[Service]
Type=forking

ExecStart=/opt/sonarqube/sonarqube-7.0/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/sonarqube-7.0/bin/linux-x86-64/sonar.sh stop

User=sonarqube
Group=sonarqube
Restart=always

[Install]
WantedBy=multi-user.target

Vous pouvez en savoir plus sur les fichiers d'unité systemd dansUnderstanding Systemd Units and Unit Files.

Fermez et enregistrez le fichier, puis démarrez le service SonarQube:

sudo service sonarqube start

Vérifiez l'état du service SonarQube pour vous assurer qu'il a démarré et fonctionne comme prévu:

service sonarqube status

Si le service a démarré avec succès, vous verrez une ligne indiquant «Actif» semblable à ceci:

● sonarqube.service - SonarQube service
   Loaded: loaded (/etc/systemd/system/sonarqube.service; enabled; vendor preset
   Active: active (running) since Sun 2018-03-04 01:29:44 UTC; 1 months 14 days

Ensuite, configurez le service SonarQube pour qu'il démarre automatiquement au démarrage:

sudo systemctl enable sonarqube

Comme avec la plupart des autres applications Java, SonarQube mettra un certain temps à s'initialiser. Une fois le processus d'initialisation terminé, vous pouvez passer à l'étape suivante.

Étape 4 - Configuration du proxy inverse

Maintenant que le serveur SonarQube est en cours d’exécution, il est temps de configurer Nginx, qui sera le terminateur de proxy inverse et HTTPS de notre instance SonarQube.

Commencez par créer un nouveau fichier de configuration Nginx pour le site:

sudo nano /etc/nginx/sites-enabled/sonarqube

Ajoutez cette configuration pour que Nginx puisse router le trafic entrant vers SonarQube:

/etc/nginx/sites-enabled/sonarqube

server {
    listen 80;
    server_name sonarqube.example.com;

    location / {
        proxy_pass http://127.0.0.1:9000;
    }
}

Enregistrez et fermez le fichier.

Ensuite, assurez-vous que votre fichier de configuration n'a pas d'erreur de syntaxe:

sudo nginx -t

Si vous voyez des erreurs, corrigez-les et exécutez à nouveausudo nginx -t. Une fois qu'il n'y a plus d'erreur, redémarrez Nginx:

sudo service nginx restart

Pour un test rapide, vous pouvez maintenant visiterhttp://sonarqube.example.com dans votre navigateur Web. L’interface Web SonarQube vous accueillera.

Nous allons maintenant utiliser Let’s Encrypt pour créer des certificats HTTPS pour notre installation, afin que les données soient transférées de manière sécurisée entre le serveur et votre ordinateur local. Utilisezcertbot pour créer le certificat pour Nginx:

sudo certbot --nginx -d sonarqube.example.com

S'il s'agit de votre première demande d'un certificat Let’s Encrypt, Certbot vous demandera votre adresse e-mail et votre contrat de licence CLUF. Entrez votre email et acceptez le CLUF.

Certbot vous demandera ensuite comment vous souhaitez configurer vos paramètres de sécurité. Sélectionnez l'option pour rediriger toutes les demandes vers HTTPS, en veillant à ce que toutes les demandes envoyées à votre serveur soient cryptées.

Maintenant que la configuration du proxy inverse est terminée, nous pouvons passer à la sécurisation de notre serveur SonarQube.

Étape 5 - Sécurisation de SonarQube

SonarQube est livré avec un nom d'utilisateur et un mot de passe administrateur par défaut deadmin. Ce mot de passe par défaut n’est pas sécurisé, nous voudrons donc le mettre à jour pour qu’il soit plus sûr, comme pratique de sécurité efficace.

Commencez par visiter l'URL de votre installation et connectez-vous à l'aide des informations d'identification par défaut.

Une fois connecté, cliquez sur l'ongletAdministration, sélectionnezSecurity dans la liste déroulante, puis sélectionnezUsers:

SonarQube users administration tab

À partir de là, cliquez sur le petit rouage situé à droite de la ligne du compte «administrateur», puis sur «Changer le mot de passe». Assurez-vous de changer le mot de passe pour quelque chose de facile à retenir, mais difficile à deviner.

Créez maintenant un utilisateur normal que vous pouvez utiliser pour créer des projets et soumettre des résultats d'analyse à votre serveur à partir de la même page. Cliquez sur le boutonCreate User en haut à droite de la page:
SonarQube new user dialog

Créez ensuite un jeton pour un utilisateur spécifique en cliquant sur le bouton dans la colonne «Jetons» et en lui attribuant un nom. Vous aurez besoin de ce jeton ultérieurement lorsque vous appelez l'analyseur de code. Veillez donc à le noter dans un endroit sûr.

Enfin, vous remarquerez peut-être que l'instance SonarQube est largement ouverte au monde et que n'importe qui peut voir les résultats de l'analyse et votre code source.
Ce paramètre est très peu sûr, nous allons donc configurer SonarQube pour n'autoriser que les dans l'accès des utilisateurs au tableau de bord. Dans le même onglet d'administration, cliquez surConfiguration, puis surSecurity dans le volet gauche. Tournez le commutateur sur cette page pour demander l'authentification de l'utilisateur.

SonarQube Force authentication switch

Maintenant que nous avons terminé la configuration de notre serveur, configurons le scanner.

Étape 6 - Configuration du scanner de code

Le scanner de code de SonarQube est un package séparé que vous pouvez installer sur un ordinateur différent de celui qui exécute le serveur SonarQube, tel que votre station de travail de développement local ou un serveur à distribution continue. Il existe des packages disponibles pour Windows, MacOS et Linux que vous pouvez trouver à l'adresseSonarQube web site

Dans ce didacticiel, nous allons installer l’analyseur de code sur le même serveur que celui qui héberge notre serveur SonarQube.

Commencez par créer un répertoire pour le scanner et accédez au nouveau répertoire:

sudo mkdir /opt/sonarscanner
cd /opt/sonarscanner

Ensuite, téléchargez le scanner SonarQube pour Linux en utilisantwget:

sudo wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip

Extrayez le scanner, puis supprimez le fichier archive zip:

sudo unzip sonar-scanner-cli-3.0.3.778-linux.zip
sudo rm sonar-scanner-cli-3.0.3.778-linux.zip

Après cela, nous devrons modifier quelques paramètres pour que le scanner fonctionne avec l’installation de notre serveur. Ouvrez le fichier de configuration pour le modifier:

sudo nano sonar-scanner-3.0.3.778-linux/conf/sonar-scanner.properties

Commencez par indiquer au scanner où il doit soumettre les résultats de l'analyse du code. Décommentez la ligne commençant parsonar.host.url et définissez-la sur l'URL de votre serveur SonarQube:

/opt/sonarscanner/sonar-scanner-3.0.3.778-linux/conf/sonar.properties

    sonar.host.url=https://sonarqube.example.com

Enregistrez et fermez le fichier. Maintenant, exécutez le binaire du scanner:

sudo chmod +x sonar-scanner-3.0.3.778-linux/bin/sonar-scanner

Créez ensuite un lien symbolique pour pouvoir appeler le scanner sans spécifier le chemin:

sudo ln -s /opt/sonarscanner/sonar-scanner-3.0.3.778-linux/bin/sonar-scanner /usr/local/bin/sonar-scanner

Maintenant que le scanner est configuré, nous sommes prêts à exécuter notre première analyse de code.

Étape 7 - Exécuter une analyse de test

Si vous souhaitez simplement fouiller avec SonarQube pour voir ce qu'il peut faire, vous pouvez envisager d'exécuter une analyse de test sur lesSonarQube example projects. Ce sont des exemples de projets créés par l'équipe SonarQube et contenant de nombreux problèmes que SonarQube détectera et rapportera ensuite.

Créer un nouveau répertoire de travail dans votre répertoire personnel, puis accédez au répertoire suivant:

cd ~
mkdir sonar-test && cd sonar-test

Téléchargez l'exemple de projet:

wget https://github.com/SonarSource/sonar-scanning-examples/archive/master.zip

Décompressez le projet et supprimez le fichier archive:

unzip master.zip
rm master.zip

Ensuite, passez au répertoire de projet exemple:

cd sonar-scanning-examples-master/sonarqube-scanner

Exécutez le scanner en lui transmettant le jeton que vous avez créé précédemment:

sonar-scanner -D sonar.login=your_token_here

Une fois l’analyse terminée, vous verrez quelque chose comme ceci sur la console:

INFO: Task total time: 9.834 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 14.076s
INFO: Final Memory: 47M/112M
INFO: ------------------------------------------------------------------------

L’exemple de rapport de projet figurera désormais sur le tableau de bord SonarQube, comme suit:

SonarQube Dashboard

Maintenant que vous avez vérifié que le serveur SonarQube et le scanner fonctionnent comme prévu, vous pouvez faire en sorte que SonarQube analyse votre propre code.

Transférez votre projet sur le serveur ou suivez les étapes de l'étape 6 pour installer et configurer le scanner SonarQube sur votre station de travail et le configurer pour qu'il pointe vers votre serveur SonarQube.

Ensuite, dans le répertoire racine de votre projet, créez un fichier de configuration SonarQube:

nano sonar-project.properties

Vous utiliserez ce fichier pour expliquer à votre projet SonarQube:

Tout d'abord, définissez unproject key, qui est un ID unique pour le projet. Vous pouvez utiliser ce que vous voulez, mais cet identifiant doit être unique pour votre instance SonarQube:

sonar-project.properties

    # Unique ID for this project
    sonar.projectKey=foobar:hello-world

    ...

Ensuite, spécifiez le nom du projet et la version pour que SonarQube puisse afficher ces informations dans le tableau de bord:

sonar-project.properties

    ...

    sonar.projectName=Hello World Project
    sonar.projectVersion=1.0

    ...

Enfin, indiquez à SonarQube où rechercher les fichiers de code eux-mêmes. Notez que cela est relatif au répertoire dans lequel réside le fichier de configuration. Définissez-le dans le répertoire actuel:

sonar-project.properties

    # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
    sonar.sources=.

Fermez et enregistrez le fichier.

Vous êtes prêt à exécuter une analyse de la qualité du code sur votre propre code. Exécutez à nouveausonar-scanner en lui passant votre jeton:

sonar-scanner -D sonar.login=your_token_here

Une fois l’analyse terminée, un écran de synthèse semblable à celui-ci apparaît:

INFO: Task total time: 5.417 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 9.659s
INFO: Final Memory: 39M/112M
INFO: ------------------------------------------------------------------------

Et le rapport sur la qualité du code du projet figurera désormais dans le tableau de bord SonarQube.

Conclusion

Dans ce didacticiel, vous avez configuré un serveur SonarQube et un scanner pour l’analyse de la qualité du code. Maintenant, vous pouvez vous assurer que votre code est facile à gérer et à maintenir en effectuant simplement une analyse - SonarQube vous indiquera où les problèmes potentiels pourraient se produire!

À partir de là, vous voudrez peut-être lire lesSonarQube Scanner documentation pour apprendre à exécuter une analyse sur votre machine de développement locale ou dans le cadre de votre processus de construction.