SonarQube Scanner
Auteur
Introduction
Cette page explique rapidement le fonctionnement des scanners SonarQube, et en explique la configuration afin qu'il analyse un projet au sein d'un pipeline d'intégration continue GitLab CI/CD et envoie les données récoltées à SonarCloud. Il est également possible d'installer un server SonarQube et de configurer le scanner pour qu'il envoie les informations sur ce server (sonar.host.url
). Pour l'installation d'un tel serveur, voir SonarQube.
Scanner
Le scanner est celui qui nous permettra de parcourir les fichiers et de relever les erreurs. Il doit être installé sur la machine qui l’utilise. Dans le cas de l'intégration continue GitLab CI/CD, il doit donc être installé sur le runner qui exécute le job correspondant. Afin d’éviter de devoir contrôler précisément quels runners sont utilisés pour le job, et de devoir synchroniser les installations sur tous les runners du projet, il est possible de télécharger et installer le scanner au début du script dans le fichier .gitlab-ci.yml
qui définit le pipeline.
Serveur
Le scanner se contente d’analyser le code. Pour obtenir le bel affichage auquel nous a habitué SonarQube, le résultat de cette analyse doit être envoyé à un serveur. Dans le cas de l'intégration continue GitLab CI/CD, puisque le scan tourne sur le runner, il faut que le serveur soit actif et exposé (si le serveur sonar était installé sur le runner et lancé en local avant le scan, il serait détruit à l’arrêt du runner). Il est possible d'utiliser SonarCloud, un serveur sonar public et gratuit pour les projets opensource. Il faut alors configurer le projet scanné pour que l’analyse soit envoyée à SonarCloud, en renseignant le bon projet, la bonne compagnie et le bon token d’authentification (il faut que l’utilisateur ait le droit de lancer une analyse).
Configuration
Afin que le runner nouvellement installé bénéficie simplement de la configuration décidée en amont, cette configuration est faite pour le projet, dans le fichier sonar-project.properties
dans le dossier racine du projet. Ce fichier spécifie la configuration utilisée par le scanner pour l’analyse du projet.
Comme expliqué dans la page dédiée à GitLab CI/CD, le fichier .gitlab-ci.yml
définit le comportement du pipeline. Ici, il nous est donc utile à télécharger, installer et utiliser le scanner.
Le fichier sonar-project.properties
définit les variables de configuration utilisées par le scanner. Il est également possible de configurer le scanner en ligne de commande, en ajoutant les options sous la forme -D <property-name>=<property-value>
lors de l'appel au scanner.
.gitlab-ci.yml
/!\ Ce fichier est un .yml
, l’identation (avec des espaces et non des tabulations) est importante.
Le script sonar-analysis télécharge d'abord une archive de scanner (ici, la version '3.3.0.1492'), puis l'extrait (au cas où le scanner ne puisse utiliser unzip, un fichier python est défini pour extraire l'archive). Après avoir donné au runner les droits d'exécution du scanner, l'analyse est lancée.
stages: - test sonar-analysis: stage: test script: - wget "https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.3.0.1492-linux.zip" - echo "import zipfile" > unzip.py - echo "" >> unzip.py - echo "with zipfile.ZipFile('sonar-scanner-cli-3.3.0.1492-linux.zip', \"r\") as z:" >> unzip.py - echo " z.extractall(\".\")" >> unzip.py - python unzip.py - rm unzip.py - rm sonar-scanner-cli-3.3.0.1492-linux.zip - chmod -R +x sonar-scanner-3.3.0.1492-linux/ - sonar-scanner-3.3.0.1492-linux/bin/sonar-scanner
sonar-project.properties
# sonarqube server sonar.host.url=https://sonarcloud.io # Required metadata # must be unique in a given SonarQube instance sonar.projectKey=<project-key> sonar.organization=<organization> sonar.login=<authentication-token> sonar.projectVersion=1.0 # Optional metadata # Default: master # sonar.branch.name=<branch-name> # Comma-separated paths to directories with sources (required) # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. # This property is optional if sonar.modules is set. sonar.sources=. sonar.exclusions=sonar-scanner-3.3.0.1492-linux/**,<paths-to-exclude-from-scan> # Language #sonar.language=javascript sonar.c.file.suffixes=- sonar.cpp.file.suffixes=- sonar.objc.file.suffixes=- # Encoding of the source code. Default is default system encoding sonar.sourceEncoding=UTF-8
Sources
https://docs.sonarqube.org/latest/setup/get-started-2-minutes/
https://docs.sonarqube.org/latest/analysis/analysis-parameters/
https://docs.sonarqube.org/latest/project-administration/narrowing-the-focus/