Aller au contenu

Introduction & Fondamentaux

Comprendre les outils de qualité de code et leur rôle dans le cycle de développement.


Pourquoi la qualité de code

La qualité de code n'est pas un luxe ni une tâche "quand on aura le temps". C'est un investissement qui se rembourse des les premières semaines d'un projet.

La dette technique

Chaque raccourci pris aujourd'hui — un # TODO jamais traite, une validation manquante, un test saute — augmente le coût de maintenance futur. La dette technique fonctionne comme une dette financiere : elle accumule des intérêts. Plus vous attendez pour la rembourser, plus le coût explose.

Un code sans standards :

  • est plus long a comprendre pour un nouveau développeur
  • généré plus de bugs lors des évolutions
  • rend le refactoring risque et coûteux

Le coût des bugs

Un bug détecté à l'écriture du code coute quelques minutes a corriger. Le même bug decouvert en production coute 10 a 100 fois plus cher :

Étape Coût relatif
Écriture du code 1x
Revue de code 1,5x
Tests d'intégration 6x
Tests d'acceptance 15x
Production 100x

Chiffres du NIST

Ces ordres de grandeur sont issus d'études du NIST (National Institute of Standards and Technology). Plus un défaut est détecté tard dans le cycle, plus sa correction implique de composants, de tests de régression et de coordination d'équipe.

La sécurité supply chain

Vos dépendances sont un vecteur d'attaque. Votre code peut être parfait, mais si une de vos librairies contient une faille, votre application est vulnerable.

Exemples concrets :

  • Log4Shell (CVE-2021-44228) : une faille critique dans Log4j, une librairie de logging Java utilisée par des millions d'applications. Un simple message de log pouvait exécuter du code arbitraire à distance.
  • event-stream (2018) : un mainteneur npm a cede la maintenance de son package a un inconnu, qui a injecte du code malveillant ciblant un portefeuille Bitcoin. Le package comptait 2 millions de téléchargements hebdomadaires.

Le risque est réel

Même dans un environnement airgap, vous devez scanner vos dépendances avant de les intégrer a votre registre interne. Une dépendance compromise importee une seule fois reste un risque permanent.


Taxonomie des outils

Tous les outils de qualité ne font pas la même chose. Il est essentiel de comprendre les différentes catégories pour savoir quoi utiliser et quand.

graph TB
    subgraph "Votre code"
        A["Formatters<br/>Style automatique"]
        B["Linters<br/>Bugs & mauvaises pratiques"]
        C["SAST<br/>Failles de securite"]
    end
    subgraph "Code des autres"
        D["SCA<br/>CVE dans les dependances"]
    end
    subgraph "Environnement"
        E["Scan d'images<br/>Vulnerabilites OS & systeme"]
    end

Formatters — mise en forme automatique

Les formatters ne s'occupent que du style : indentation, guillemets, longueur de ligne, virgules finales. Ils ne detectent aucun bug et ne changent jamais le comportement du code.

Leur intérêt principal : éliminer les debats de style dans les revues de code. Si le formatter est configuré, la discussion est close.

Exemples : Prettier (JS/TS/CSS/HTML), Black (Python), gofmt (Go).

Linters — détection de bugs et mauvaises pratiques

Les linters analysent le code source pour détecter :

  • des bugs potentiels (variable non utilisée, comparaison toujours fausse)
  • des mauvaises pratiques (code mort, complexité excessive, imports inutiles)
  • des problèmes de qualité (absence de typage, fonctions trop longues)

Contrairement aux formatters, les linters peuvent signaler des problèmes qui changent le comportement du code.

Exemples : ESLint (JS/TS), Ruff (Python), clippy (Rust).

SAST — vulnérabilités dans le code source

Le SAST (Static Application Security Testing) recherche des failles de sécurité directement dans votre code source :

  • Injections SQL
  • Cross-Site Scripting (XSS)
  • Secrets commites (clés API, mots de passe)
  • Deserialisation non sécurisée

Le SAST fonctionne sans exécuter le code : il analyse les fichiers source à la recherche de patterns dangereux.

Exemples : Semgrep, SonarQube (module sécurité), Bandit (Python).

SCA — vulnérabilités dans les dépendances

Le SCA (Software Composition Analysis) ne regarde pas votre code mais celui de vos dépendances. Il compare les versions de vos packages a des bases de données de CVE (Common Vulnerabilities and Exposures) connues.

Un projet typique a des centaines de dépendances transitives. Le SCA les analyse toutes.

Exemples : pip-audit (Python), npm audit (Node.js), Trivy filesystem (multi-langage).

Scan d'images — vulnérabilités dans les conteneurs

Le scan d'images analyse les couches OS et système de vos images conteneur. Il détecté :

  • les packages système avec des CVE connues (openssl, glibc, curl...)
  • les configurations dangereuses (exécution en root, ports exposes)
  • les images basées sur des distributions obsolètes

C'est la dernière ligne de defense avant le déploiement.

Exemples : Trivy image, Grype, Docker Scout.


Quand intervient chaque outil

Chaque outil a sa place dans le cycle de développement. L'objectif est de détecter les problèmes le plus tôt possible (shift-left).

graph LR
    A["Ecriture"] -->|"Formatter + Linter"| B["Commit"]
    B -->|"Pre-commit hooks"| C["Push"]
    C -->|"SonarQube + SAST + SCA"| D["Build"]
    D -->|"Scan image"| E["Deploy"]

À l'écriture

Le formatter et le linter tournent en temps réel dans votre éditeur (VSCode, Neovim...). Chaque sauvegarde de fichier déclenche un formatage automatique et une analyse instantanée. Les erreurs apparaissent directement dans l'éditeur.

Au commit — pre-commit hooks

Avant chaque commit, des hooks Git exécutent automatiquement le formatter et le linter sur les fichiers modifies. Si une erreur est détectée, le commit est bloque. Cela garantit qu'aucun code non conforme n'entre dans l'historique Git.

Pre-commit hooks

Les pre-commit hooks sont votre filet de sécurité. Même si un développeur n'a pas configure son éditeur, les hooks rattrapent les problèmes avant qu'ils n'atteignent le dépôt.

Au push — analyse approfondie

Le push vers Gitea déclenche le pipeline CI qui exécuté les analyses plus lourdes :

  • SonarQube : analyse de qualité complète, quality gates, métriques de couverture
  • SAST (Semgrep) : détection de failles de sécurité dans le code source
  • SCA (pip-audit, npm audit, Trivy) : scan des dépendances pour les CVE connues

Au build — scan d'image

Après la construction de l'image conteneur, Trivy scanne toutes les couches pour détecter les vulnérabilités système. Si des CVE critiques sont trouvees, le pipeline échoué et le déploiement est bloque.


Stack retenue

Catégorie Outil Pourquoi ce choix
Formatter JS/TS Prettier Standard de facto, zero config
Formatter Python Black Opinionated, aucun debat de style
Linter JS/TS ESLint Extensible, écosystème riche
Linter Python Ruff Ultra rapide, remplacé flake8+isort
Analyse statique SonarQube CE Dashboard, quality gates, multi-langage
SAST Semgrep OSS Règles OWASP, offline natif, YAML lisible
SCA Python pip-audit Base PyPI, mode offline
SCA JS npm audit Intégré a npm
SCA unifie Trivy filesystem Multi-langage, base offline
Scan images Trivy image Multi-cible, format SARIF

Tous les outils sont self-hosted et airgap compatible

Chaque outil de cette stack peut fonctionner entièrement hors ligne, sans connexion a internet. Les bases de données de vulnérabilités peuvent être telechargees une fois puis servies depuis un miroir interne. Aucune donnée de code ne quitte votre infrastructure.


Pre-requis

Avant de commencer ce tutoriel, assurez-vous d'avoir les outils suivants installes :

Outil Version minimale Installation
Podman 4.9+ podman.io/docs/installation
Gitea 1.21+ docs.gitea.com/installation
Node.js 20 LTS nodejs.org
Python 3.11+ python.org/downloads
Git 2.40+ git-scm.com/downloads

Podman Rootless

Si Podman n'est pas encore configuré sur votre machine, suivez d'abord le tutoriel Podman Rootless qui couvre l'installation et la configuration complète en mode rootless sur AlmaLinux 9.