Analyser et tester son code source
Introduction
L’analyse et la vérification du code source sont des étapes incontournables à inclure dans tout pipeline CI/CD, car elles garantissent la qualité et la fiabilité du logiciel. Qu’il s’agisse d’analyser le code avec des outils de linting, de mener des tests automatisés fonctionnels ou d’intégration, ces pratiques permettent d’identifier et de corriger les problèmes dès les premières étapes du cycle de développement.
Ce chapitre explore les différents aspects de ces vérifications tout en abordant une tâche souvent indispensable : la compilation du code source. Celle-ci ne sert pas seulement à produire des artéfacts exécutables, elle permet aussi de faciliter l’exécution d’analyses et de tests approfondis. Nous illustrerons ces concepts à travers des exemples concrets de fichiers .gitlab-ci.yml contenant des jobs de build, après quoi nous examinerons certains outils GitLab pour analyser la qualité du code.
Enfin, nous présenterons des approches de tests automatisés, comme le fuzzing, une technique particulièrement efficace pour détecter des vulnérabilités ou des comportements imprévus. À travers ces étapes, vous apprendrez à structurer vos pipelines pour produire un code non seulement...
Compilation et interprétation du code source
Avant d’approfondir l’analyse du code source, il est essentiel de différencier les types de langages de programmation, car cette distinction influence la configuration des tâches dans un pipeline CI/CD.
1. Les types de langages
Les langages de programmation se divisent généralement en deux grandes catégories : les langages compilés et les langages interprétés. Cependant, une troisième catégorie, celle des langages hybrides, est également très utilisée, notamment avec des technologies comme Java.
a. Les langages compilés
Les langages compilés tels que C, C++, Go, Java et Rust nécessitent une phase de compilation. Cette opération consiste à transformer le code source d’un langage de haut niveau (comme les précédents) en un langage machine exécutable par un ordinateur. Elle est réalisée par un programme nommé compilateur dont le rôle est d’effectuer cette traduction du code source.
Cette méthode assure une exécution rapide du programme, mais elle peut restreindre sa portabilité, car le code compilé est généralement conçu pour une plateforme spécifique.
Par exemple, pour compiler un programme en C à l’aide du compilateur GNU Compiler Collection (GCC), il suffit de fournir le fichier source à ce dernier via une commande dans le terminal. Le compilateur va ensuite analyser le code et générer un fichier exécutable adapté à la plateforme. Le cas échéant, il affichera d’éventuelles erreurs ou avertissements en cas de problèmes dans le code source. Lorsque la compilation est complétée avec succès, le fichier généré peut être directement lancé pour exécuter le programme.
Chaque langage compilé transforme son code en langage machine de manière spécifique, en s’appuyant sur des outils variés. Pour un même langage, il peut exister plusieurs approches ou outils pour effectuer cette tâche. Dans l’exemple précédent, nous avons évoqué le compilateur GNU pour le C, mais il en existe plusieurs autres comme : Clang...
Analyser la qualité du code source
L’analyse de la qualité du code source est une étape essentielle dans le cycle de développement logiciel, car elle permet de s’assurer que le code respecte des standards de lisibilité, de performance et de maintenabilité.
Pour rappel, la maintenabilité du code source désigne la facilité avec laquelle un logiciel peut être compris, corrigé, modifié et amélioré par les développeurs au fil du temps. Un code structuré, bien documenté et modulable, permet de réduire les coûts et les efforts liés à sa maintenance et à son évolution.
Dans le contexte de GitLab, cette analyse peut être directement intégrée au pipeline CI/CD ce qui garantit que chaque modification du code est automatiquement évaluée en fonction de règles prédéfinies. GitLab permet d’utiliser plusieurs types d’outils d’analyse tels que des linters, des analyseurs statiques ou des scanners de sécurité.
Ces outils permettent de détecter des problèmes tels que la duplication de code, des structures complexes, des violations de style ou même des failles de sécurité potentielles. En automatisant cette étape au sein des pipelines, GitLab facilite l’amélioration continue de la qualité du code, tout en renforçant la collaboration et la fiabilité des livraisons logicielles.
1. Abandon de l’outil natif d’analyse de la qualité du code
L’une des nombreuses fonctionnalités...
Exemple d’analyse d’un script Python
Dans les sections qui suivent, nous allons voir comment intégrer des analyses dans un fichier de configuration de .gitlab-ci.yml pour une application simple en Python. Nous allons donc travailler sur la partie CI (intégration continue) de notre pipeline où il s’agit de repérer et corriger les problèmes tôt dans le processus de développement.
Il existe de nombreux outils d’analyse et de tests que nous pouvons intégrer dans un pipeline pour un programme en Python. En voici quelques exemples :
-
Flake8 : analyseur de conformité du code par rapport aux conventions de style (PEP-8) qui identifie les erreurs courantes, comme les espaces superflus ou les imports inutilisés.
PEP 8 est un guide de style pour le langage Python. Il fournit des conventions sur la façon d’écrire un code propre et lisible en couvrant différents éléments comme l’indentation, les noms de variables et les conventions d’espacement.
-
Black : outil de formatage automatique qui applique un style uniforme au code source ;
-
Pylint : analyseur statique complet qui détecte les erreurs de syntaxe, les code smells (problèmes potentiels dans le code source) tout en vérifiant la conformité avec PEP-8 ;
-
Mypy : vérificateur de types statiques pour Python qui valide les déclarations de type de données ;
-
pytest : framework de tests pour exécuter des tests unitaires, d’intégration ou fonctionnels.
Ces outils jouent un rôle essentiel dans l’automatisation de tâches clés telle que la vérification de la conformité du code par rapport aux standards établis afin de s’assurer que la syntaxe et le style du code sont cohérents et lisibles. C’est le rôle notamment des linters dont nous avons déjà parlé qui font des analyses statiques du code pour détecter des erreurs courantes, des structures redondantes ou inefficaces et des violations de certaines conventions de style.
Certains outils vont plus loin en identifiant des vulnérabilités potentielles dans le code ou en validant les déclarations de types de données pour éviter des bugs liés à des incohérences de typage....
Autres types de tests
Il existe de nombreux autres types de tests que vous pouvez expérimenter dans GitLab, comme ceux qui permettent d’évaluer le comportement des applications sous différentes conditions.
Dans les sections suivantes, nous allons présenter brièvement trois autres types de tests, en indiquant quelques outils populaires, et nous verrons quelles fonctionnalités sont offertes avec GitLab Premium et Ultimate pour les intégrer dans les pipelines CI/CD.
1. Les tests de charge
Les tests de charge évaluent la capacité d’une application ou d’un serveur à gérer un volume important d’utilisateurs simultanés. Leur objectif est de mesurer les temps de réponse, la consommation des ressources et d’identifier les goulots d’étranglement (bottleneck) sous une charge croissante.
Voici quelques exemples populaires d’outils qui permettent de simuler un grand nombre de requêtes et d’analyser la stabilité d’une application ou d’un système :
-
JMeter : outil open source qui permet de simuler un grand nombre d’utilisateurs pour tester les performances des applications web et API ;
-
Gatling : solution axée sur les tests de charge et de stress avec une approche orientée développement et une intégration facile dans les pipelines CI/CD ;...
Conclusion
Ce chapitre a débuté par un rappel des principaux types de langages de programmation, suivi d’une clarification sur la différence entre le build et la compilation. Nous avons souligné l’importance de cette dernière dans le cadre des analyses de code source, en expliquant que certains outils nécessitent une compilation préalable pour interagir avec le code en cours d’exécution, tandis que d’autres se contentent d’analyser le code sans l’exécuter.
Après avoir compilé un simple programme Hello World! en Go, nous avons exploré différentes techniques d’analyse du code dans GitLab, notamment les outils de vérification et la couverture de code. Ensuite, nous avons mis en pratique trois types de tests sur une application Python de génération de mots de passe en intégrant à notre pipeline un linter (Pylint), un analyseur de typage (mypy) et un framework de tests unitaires (pytest).
Nous avons également effectué un test de fuzzing qui a généré des entrées aléatoires pour évaluer la robustesse de notre fonction. Si vous souhaitez aller plus loin, GitLab propose des fonctionnalités encore plus avancées, accessibles via les abonnements Premium et Ultimate que vous pouvez tester gratuitement pendant 60 jours.
Les exemples abordés...