SonarQube Scanner

From air
Jump to navigation Jump to search

Auteur

CHANET Zoran

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/