Webinaire en vedette : MISRA C++ 2023 : tout ce que vous devez savoir | Voir le séminaire

Déploiement de l'analyse statique et des tests unitaires dans des environnements conteneurisés, partie 1

Portrait de Miroslaw Zielinski, directeur de la gestion des produits chez Parasoft
6 juin 2023
11 min lire

Intéressé par les environnements conteneurisés ? Découvrez ce qu'ils sont, pourquoi votre équipe devrait les utiliser et les meilleures pratiques. Découvrez ensuite comment configurer Parasoft C/C++test pour les environnements de développement conteneurisés.

Comprendre les environnements conteneurisés

Les environnements conteneurisés ont gagné en popularité ces dernières années en raison de leur capacité à rationaliser le déploiement et la gestion des applications. Un conteneur est un package léger et autonome qui comprend tout ce qui est nécessaire pour exécuter une application, y compris le code, l'environnement d'exécution, les outils système et les bibliothèques. Il encapsule l'application et ses dépendances, fournissant un environnement cohérent et isolé sur différentes plates-formes et systèmes d'exploitation.

Comprendre les environnements conteneurisés est essentiel pour les développeurs de logiciels, car cela révolutionne la manière dont les applications sont créées et déployées. L'un des principaux avantages de la conteneurisation est sa portabilité.

Les conteneurs encapsulent l'intégralité de l'environnement d'exécution, y compris le code d'application, les bibliothèques et les configurations. Cela permet aux développeurs de créer une image de conteneur une seule fois et de l'exécuter sur n'importe quel système prenant en charge la conteneurisation, comme Docker ou Kubernetes. Il élimine le problème « cela fonctionne sur ma machine », car le conteneur s'exécute de manière cohérente dans les environnements de développement, de test et de production. Cette portabilité simplifie grandement le processus de déploiement, ce qui facilite le déplacement des applications entre différents environnements d'hébergement ou leur mise à l'échelle selon les besoins.

Un autre avantage de la conteneurisation est la possibilité d'isoler les applications et leurs dépendances. Les conteneurs utilisent la virtualisation au niveau du système d'exploitation pour créer des instances isolées qui partagent le même système d'exploitation hôte. Cette isolation garantit que les applications s'exécutant dans un conteneur n'interfèrent pas avec ou n'affectent pas les applications dans d'autres conteneurs, offrant un environnement plus sécurisé et stable. Les développeurs peuvent expérimenter en toute confiance différentes bibliothèques, frameworks et configurations sans se soucier des conflits ou compromettre la stabilité du système global.

Qu'est-ce qu'un environnement de développement conteneurisé ?

Un environnement de développement conteneurisé consiste à utiliser des conteneurs pour encapsuler et gérer l'environnement de développement logiciel. Cela implique la création d'un environnement autonome et isolé qui comprend tous les outils, dépendances et configurations nécessaires au développement d'une application.

Dans un environnement de développement conteneurisé, les outils de développement, les langages de programmation, les bibliothèques et les autres dépendances sont regroupés dans une image de conteneur. Cette image sert de représentation portable et reproductible de l'environnement de développement. Les développeurs peuvent créer, modifier et partager ces images de conteneurs pour assurer la cohérence et faciliter la collaboration entre les membres de l'équipe.

En utilisant la technologie de conteneurisation, telle que Docker, les développeurs peuvent créer des conteneurs légers et autonomes qui sont isolés du système hôte et des autres conteneurs. Chaque conteneur fournit un environnement cohérent et uniforme, quel que soit le système d'exploitation hôte sous-jacent ou la configuration de la machine.

Les environnements de développement conteneurisés offrent plusieurs avantages, tels que la cohérence entre les différentes machines, entre les membres de l'équipe, en particulier dans le environnement de développement de système logiciel embarqué, ce qui peut être très complexe. Un environnement conteneurisé permet aux développeurs de travailler avec la même pile logicielle, les mêmes bibliothèques et configurations, éliminant les problèmes de compatibilité et réduisant le temps consacré à la configuration de l'environnement.

En d'autres termes, les environnements conteneurisés permettent une configuration et une reproductibilité faciles. Les développeurs peuvent regrouper leurs applications avec toutes les dépendances requises dans une image de conteneur. Cette image peut être partagée, permettant à d'autres de configurer rapidement le même environnement de développement. Il garantit que l'application se comporte de manière cohérente dans différents environnements, facilitant ainsi les processus de collaboration et de déploiement.

Un autre avantage des environnements de développement conteneurisés est qu'ils offrent de la flexibilité. Les développeurs peuvent basculer entre les projets ou différentes versions de logiciels sans conflits. Chaque projet peut avoir son conteneur dédié, isolant ses dépendances et ses configurations. Cette flexibilité permet un développement parallèle et des tests logiciels. Il facilite un flux de travail CI/CD puissant en automatisation de l'analyse statique et des tests unitaires pour chaque développeur après une construction de code réussie. Ce flux de travail permet d'obtenir un code de haute qualité en trouvant des défauts avant que le code ne soit validé dans le référentiel maître.

De plus, la conteneurisation améliore l'évolutivité et l'efficacité des ressources. Les conteneurs sont légers et ont une surcharge minimale, ce qui permet aux développeurs d'utiliser efficacement les ressources système. Plusieurs conteneurs peuvent s'exécuter sur une seule machine hôte, permettant un développement et des tests parallèles. Cette évolutivité est bénéfique lorsque vous travaillez sur de grands projets ou des systèmes distribués.

Pourquoi utiliser un environnement de développement conteneurisé ?

L'utilisation d'un environnement de développement conteneurisé offre plusieurs avantages aux équipes de développement de logiciels. Voici quelques raisons pour lesquelles les développeurs devraient adopter la conteneurisation.

  1. Assure la cohérence. Les conteneurs garantissent la cohérence entre les différents environnements de développement et les membres de l'équipe. Avec la conteneurisation, tout le monde travaille avec la même pile logicielle, les mêmes bibliothèques et configurations. Cela élimine le problème « cela fonctionne sur ma machine » et réduit les problèmes de compatibilité, permettant une collaboration plus fluide et une intégration plus facile des nouveaux membres de l'équipe.
  2. Facilite la reproductibilité. La conteneurisation permet aux développeurs de regrouper leurs applications avec toutes les dépendances nécessaires dans une image de conteneur. Cette image peut être partagée avec d'autres, garantissant ainsi à chacun un environnement de développement identique. Il simplifie le processus de configuration et garantit que l'application se comporte de manière cohérente dans différents environnements, du développement à la production.
  3. Assure la flexibilité. Les environnements de développement conteneurisés offrent de la flexibilité en isolant les dépendances et les configurations au sein des conteneurs. Les développeurs peuvent facilement basculer entre les projets ou différentes versions de logiciels sans conflits. Chaque projet peut avoir son conteneur dédié, permettant un développement parallèle et facilitant l'expérimentation de nouvelles bibliothèques ou outils.
  4. Facilite l'évolutivité et l'efficacité. Les conteneurs sont légers et ont une surcharge minimale, permettant une utilisation efficace des ressources système. Plusieurs conteneurs peuvent s'exécuter sur une seule machine hôte, permettant un développement, des tests et une évolutivité parallèles. De plus, les conteneurs peuvent être facilement mis à l'échelle sur différentes machines ou infrastructures cloud, facilitant le développement de systèmes distribués et améliorant la productivité.
  5. Améliore la collaboration. La conteneurisation simplifie la collaboration au sein des équipes de développement. Les conteneurs fournissent un environnement portable et cohérent, ce qui facilite le partage des environnements de développement entre les membres de l'équipe. Il garantit que tout le monde travaille avec les mêmes outils et dépendances, ce qui permet des révisions de code, un débogage et un partage des connaissances plus fluides.
  6. Fonctionne bien avec le contrôle de version. La conteneurisation s'intègre bien aux systèmes de contrôle de version. Les développeurs peuvent inclure les fichiers de configuration du conteneur, tels que Fichiers Docker, dans leurs référentiels de code. Cela permet la gestion des versions et le suivi des modifications apportées à l'environnement de développement, ce qui facilite la reproduction de versions spécifiques de l'application avec son environnement.
  7. Optimise la sécurité et l'isolement. Les conteneurs offrent une sécurité renforcée en isolant les applications et leurs dépendances du système hôte sous-jacent. Chaque conteneur fonctionne dans son propre environnement isolé, ce qui réduit l'impact des failles de sécurité potentielles. Les images de conteneurs peuvent également être analysées à la recherche de vulnérabilités et les mises à jour peuvent être facilement appliquées, garantissant un environnement de développement plus sécurisé.

Meilleures pratiques pour l'environnement de développement conteneurisé

En ce qui concerne les environnements de développement conteneurisés, le respect des meilleures pratiques peut considérablement améliorer la productivité et garantir des workflows de développement fluides. Voici quelques lignes directrices clés à considérer.

Utiliser un Dockerfile

Les Dockerfiles sont essentiels pour définir la configuration et les dépendances de votre environnement conteneurisé. Au lieu de configurer manuellement les conteneurs, utilisez Dockerfiles pour automatiser le processus. Commencez avec une image de base, spécifiez les dépendances nécessaires et incluez les commandes pour créer et exécuter votre application. Cette approche garantit la cohérence et la reproductibilité dans différents environnements.

Tirez parti de l'orchestration des conteneurs

Les plates-formes d'orchestration de conteneurs telles que Kubernetes fournissent des outils puissants pour gérer les applications conteneurisées à grande échelle. Ils activent des fonctionnalités telles que la mise à l'échelle automatique, l'équilibrage de charge et la découverte de services. L'adoption de l'orchestration de conteneurs simplifie le déploiement et la surveillance, ce qui facilite la gestion et la mise à l'échelle efficaces de vos applications.

Optimiser la taille et les performances des conteneurs

Gardez vos images de conteneur aussi petites que possible en minimisant le nombre de couches et en supprimant les dépendances inutiles. Les images plus petites sont plus rapides à créer, transférer et déployer. De plus, assurez-vous que vos conteneurs sont correctement configurés pour la gestion des ressources. Vous pouvez utiliser Parasoft C/C++test pour simplifier le processus de création d'une image de conteneur. Avec Parasoft C/C++test, vous pouvez facilement définir des limites de ressources et des requêtes de manière appropriée pour empêcher les conteneurs de consommer des ressources excessives et d'affecter les performances des autres conteneurs.

Automatiser la configuration de l'environnement de développement

La configuration manuelle des environnements de développement peut prendre du temps et être source d'erreurs. Au lieu de cela, automatisez le processus à l'aide d'outils de gestion de configuration comme GitHub ou d'outils de provisionnement comme Vagrant. Grâce à l'automatisation, vous pouvez rapidement créer ou supprimer des environnements de développement conteneurisés en quelques commandes seulement, ce qui réduit le temps de configuration et garantit la cohérence au sein de l'équipe.

Mettre en œuvre des pratiques de sécurité

Les conteneurs doivent être traités comme des entités éphémères et jetables. Mettez régulièrement à jour vos images de conteneur et vos images de base pour inclure les derniers correctifs de sécurité. Évitez d'exécuter des conteneurs avec des privilèges inutiles et appliquez des contrôles d'accès stricts pour minimiser le risque d'accès non autorisé. En outre, envisagez d'analyser les images de conteneurs à la recherche de vulnérabilités à l'aide d'outils tels que Clair ou Anchore.

Images du conteneur de contrôle de version

Traitez les images de conteneurs comme des artefacts de code et exploitez les systèmes de contrôle de version pour les gérer. La conservation d'un historique des versions de vos images de conteneur vous permet de revenir facilement à un état antérieur en cas de problème. De plus, l'utilisation d'un registre de conteneurs facilite la distribution et le partage d'images de conteneurs au sein de votre équipe de développement.

Bien que le respect de ces meilleures pratiques puisse garantir des environnements de développement conteneurisés efficaces et fiables, la qualité et la fiabilité du code dans les environnements conteneurisés restent une préoccupation essentielle pour les développeurs. Déploiement de l'analyse statique et tests unitaires dans des environnements conteneurisés offre une solution puissante pour relever ces défis. Vous trouverez ci-dessous une explication détaillée de la manière dont les développeurs peuvent tirer parti de ParasoftC/C++ pour utiliser efficacement les conteneurs Docker.

Comment configurer le test Parasoft C/C++ pour les environnements de développement conteneurisés

Parasoft C / C ++test est facile à utiliser avec les conteneurs Docker. Je vais vous guider à travers les étapes de configuration de C/C++test pour qu'il fonctionne dans des environnements de développement conteneurisés.

Les équipes de développement intégrées adorent les conteneurs Docker

Les déploiements conteneurisés d'outils de développement deviennent le pain quotidien des équipes de développement embarquées. Même si les conteneurs ont été initialement développés pour résoudre les problèmes de déploiement de microservices et d'applications Web, ils ont récemment gagné en popularité parmi les équipes intégrées, en particulier les grandes équipes qui utilisent des conteneurs pour gérer des chaînes d'outils complexes.

Lorsqu'il s'agit de gérer des environnements de développement complexes, en particulier dans l'espace critique pour la sécurité, les équipes sont généralement confrontées aux défis suivants:

  • Synchroniser les mises à niveau pour toute l'équipe vers une nouvelle version d'un outil comme un compilateur, créer une chaîne d'outils, etc.
  • Réagir dynamiquement à un nouveau correctif de sécurité pour la bibliothèque ou le kit de développement logiciel (SDK), etc.
  • Assurer la cohérence de la chaîne d'outils pour tous les membres de l'équipe et de l'infrastructure automatisée (CI / CD).
  • Possibilité de versionner l'environnement de développement et de le restaurer pour entretenir l'ancienne version du produit qui a été certifiée avec la chaîne d'outils spécifique.
  • Intégration et mise en place de nouveaux développeurs.

Tous ces problèmes sont faciles à résoudre avec des conteneurs. Pas étonnant que les équipes adorent les conteneurs ! Voyons comment configurer le test C/C++ pour une utilisation dans un environnement conteneurisé.

Utilisation de Parasoft C / C ++ test Professional avec une chaîne d'outils de compilation conteneurisée

Il est facile de configurer Parasoft C / C ++ test Professional pour qu'il fonctionne avec une chaîne d'outils de compilation et l'environnement d'exécution déployé dans des conteneurs. Nous prenons en charge les déploiements basés sur des conteneurs Linux et Docker. Voici un aperçu de haut niveau de l'apparence de ce type de configuration:

Comme vous pouvez le voir, le test C / C ++ accède au compilateur conteneurisé (GNU GCC) et aux environnements d'exécution. Dans cette configuration spécifique, il existe deux conteneurs Docker distincts:

  • Un pour le compilateur et les outils de construction
  • Un autre pour l'environnement d'exécution (par exemple, version dépouillée de Linux embarqué)

Voyons comment configurer C / C ++ Test Professional pour qu'il fonctionne avec une chaîne d'outils de compilation et un environnement d'exécution dans le conteneur. Dans l'exemple, nous utiliserons la dernière GCC image de conteneur disponible via le hub Docker.

Voyons comment configurer C / C ++ Test Professional pour qu'il fonctionne avec une chaîne d'outils de compilation et un environnement d'exécution dans le conteneur. Dans l'exemple, nous utiliserons la dernière GCC image de conteneur disponible via le hub Docker.

Les instructions suivantes supposent que vous disposez d'un Moteur Docker correctement installé et configuré dans votre environnement. Et de même pour C/C++test Professional.

Étape 1: Démarrez le test Parasoft C / C ++

  1. Assurez-vous que votre Docker fonctionne. Commençons par un test rapide et imprimons le numéro de version du compilateur GCC inclus dans la "dernière" image du conteneur GCC.
  2. Avant de commencer le test Parasoft C / C ++, définir une variable environnementale dédiée CPPTEST_CONTAINER_NAME au nom du conteneur. C'est un moyen simple d'indiquer au test C / C ++ quel conteneur doit être utilisé pour appeler le compilateur ou l'éditeur de liens. Cela fonctionne bien avec les emplois Jenkins.
  3. De plus, je vous recommande définir la variable CPPTEST_INSTALL pour pointer vers le répertoire d'installation du test C / C ++. Cela permet une configuration simple. Une fois les variables définies, nous pouvons démarrer le test C / C ++.
  4. Pour votre espace de travail, sélectionnez un emplacement quelque part dans le répertoire HOME (plus à ce sujet plus tard).


Étape 2: créer un projet de démonstration

Pour rendre la création d'un projet de démonstration très simple, créons le projet par défaut «HelloWorld» à l'aide de l'assistant standard «Nouveau projet».

  1. Choisissez le menu Fichier> Nouveau> Projet C ++, puis choisissez «Projet C ++ Hello World».
  2. Entrez le nom de votre choix pour votre projet. Cela devrait ressembler plus ou moins à la capture d'écran ci-dessous.
  3. Cliquez Finition pour créer le projet par défaut pour notre exemple.


Étape 3: modifier les paramètres du compilateur

Une fois le projet créé, modifiez quelques éléments dans les paramètres de build du test C / C ++.

  1. Cliquez avec le bouton droit sur le projet et sélectionnez Propriétés, puis Parasoft>C/C++test>Paramètres de construction.
  2. Dans le panneau Paramètres de construction, modifiez deux éléments dans la section Paramètres du compilateur:
    • Famille. Modifiez pour correspondre au compilateur installé dans le conteneur. Au moment de la rédaction de ce blog, la dernière image «gcc» contenait le compilateur GNU GCC 9.2, qui a incité à sélectionner la configuration du compilateur «GNU GCC 9.x (x86_64)».
    • Exécutables du compilateur par défaut. Les exécutables par défaut du compilateur doivent être remplacés par des wrappers spéciaux pour appeler le compilateur intégré au conteneur au lieu du compilateur normal installé directement dans le système d'exploitation hôte. Ces emballages, remote-gcc et remote-g ++, sont livrés dans la distribution de test C/C++. Dans la capture d'écran ci-dessous, j'utilise une variable d'environnement d'assistance pour le répertoire d'installation C/C++test. Vous pouvez soit définir une variable similaire pour votre environnement, soit utiliser des chemins d'accès complets pour localiser les scripts d'encapsulation.


Étape 4: Vérifiez que le conteneur est en cours d'exécution

Assurez-vous que le conteneur avec votre chaîne d'outils de compilation est opérationnel avant d'utiliser le test Parasoft C / C ++.

Les wrappers de compilateur que nous avons configurés à l'étape précédente sont conçus pour exécuter les commandes du compilateur dans le conteneur en cours d'exécution, ce qui est plus rapide que de démarrer le conteneur pour chaque appel.

Pour Déploiements CI / CD, démarrer le conteneur avant l'exécution du test C / C ++ et l'arrêter après peut faire partie du travail Jenkins. Dans cet exemple, nous supposons que la base GUI est utilisée. Nous pouvons créer des configurations d'exécution d'éclipse à cet effet. Je suggère de créer deux configurations de type «Application C / C ++» et de les nommer comme suit:

  • "Démarrer le conteneur gcc"
  • "Arrêter le conteneur gcc"
  1. Sélectionnez le menu Exécuter> Exécuter les configurations…
  2. Créez deux configurations d'exécution nommées «Démarrer le conteneur gcc» et «Arrêter le conteneur gcc».
  3. Dans l'onglet Principal pour les deux configurations, entrez votre chemin vers Docker en tant que «Application C / C ++» comme indiqué ci-dessous:

  1. Pour "Démarrer le conteneur gcc", dans l'onglet arguments, entrez la commande suivante:

style = "padding-left: 40px;">run –rm -d -it –name gcc -v $ {env_var: HOME}: $ {env_var: HOME}
-v
$ {env_var: CPPTEST_INSTALL}: $ {env_var: CPPTEST_INSTALL} gcc

Comme le montre la capture d'écran ci-dessous :


La partie intéressante de cette commande sont les options -v, qui sont utilisées pour mapper les volumes.

La première option -v mappe le répertoire HOME local au système de fichiers du conteneur. L'intention ici est de permettre l'accès au code source pour le compilateur fonctionnant à l'intérieur du conteneur et également pour le test Parasoft C / C ++, qui s'exécute dans le système d'exploitation hôte.

J'utilise HOME dans mon exemple pour plus de commodité car j'ai placé mon espace de travail directement dans HOME.

Pour les configurations réelles, vous ne pouvez mapper strictement que la partie du système de fichiers qui contient l'arborescence source et l'espace de travail eclipse avec project.

La deuxième option -v mappe l'emplacement du répertoire d'installation de test C / C ++ pour permettre l'accès aux fichiers d'en-tête de test C / C ++ à l'intérieur du conteneur.

  1. Pour "Arrêter le conteneur gcc", dans l'onglet arguments, entrez la commande suivante comme indiqué dans l'image ci-dessous:

arrêter gcc

  1. Utilisons la configuration d'exécution «Démarrer le conteneur gcc» pour exécuter le conteneur.

La console Eclipse devrait vous montrer le hachage du conteneur. Pour vous assurer que tout va bien, vous pouvez passer à la ligne de commande et appeler la commande suivante:

Si vous voyez notre conteneur «gcc» dans la liste, vous pouvez commencer à utiliser le test C / C ++ pour tester votre code.

  1. Sélectionnons le projet dans le navigateur. À l'aide du menu Parasoft, sélectionnez Test avec> Intégré> Test unitaire> Générer des tests unitaires.

Vous devriez voir un nouveau répertoire «tests» créé dans votre projet avec un seul test unitaire créé pour la fonction «main».

  1. Une fois les cas de test générés, vous êtes prêt à les exécuter. Pour l'exécution, sélectionnez Test en utilisant> Intégré> Test unitaire> Exécuter des tests unitaires dans le conteneur.

Le test C / C ++ doit appeler une collection de compilations dans le conteneur et des lignes de commande de liaison, se terminant par une création et une exécution binaires de test dans le conteneur.

C'est tout! Avec ces étapes, vous avez préparé le test Parasoft C / C ++ pour effectuer des activités de test à l'aide de la chaîne d'outils de compilation dans le conteneur.

Si vous avez besoin de changer le compilateur d'un projet ou de modifier quelque chose dans l'environnement d'exécution d'exécution, vous pouvez mettre à jour l'image du conteneur ou la changer vers une version différente. (N'oubliez pas de mettre à jour la variable CPPTEST_CONTAINER_NAME.)

Vous voulez en savoir plus ? Lire la partie 2 où j'explique comment déployer l'analyse statique et les tests unitaires à l'aide de Parasoft C/C++test Standard dans un conteneur Docker.

Découvrez comment les conteneurs et le test Parasoft C/C++ s'intègrent dans votre pipeline CI/CD et augmentez la productivité.

Article connexe + ressources