Bonnes pratiques CI/CD

Les avantages du CI/CD sont bien connus, mais comment tirer pleinement parti de ces processus DevOps ?

L'intégration, la livraison et le déploiement continus simplifient le processus de création, de test et de publication. Ces processus peuvent vous aider à mettre un produit fonctionnel dans les mains de vos utilisateurs plus rapidement que les méthodes traditionnelles. Un pipeline de build bien exécuté vous aidera, vous et votre équipe, à fournir des logiciels fonctionnels rapidement et obtenir des retours rapides sur vos dernières modifications.

Nous allons explorer les bonnes pratiques d'intégration et de livraison continues qui peuvent avoir un impact positif sur votre pipeline.

Valider tôt, valider souvent

S'assurer que l'ensemble du code source, des fichiers de configuration, des scripts et des dépendances sont stockés dans le système de contrôle de version est une première étape essentielle lors de la mise en œuvre de l'intégration continue.

Toutefois, un système de contrôle de version seul ne suffit pas, la façon dont vous l'utilisez compte. Le but de l'intégration continue est de simplifier l'implémentation de changements provenant de multiples contributeurs. La clé de cette approche est de valider et partager vos changements de code plus souvent.

Voici comment cela fonctionne :

  • Chaque commit déclenche une série de tests automatisés qui vous donnent des retours rapides sur vos modifications et permettent de résoudre les bugs rapidement. Plus les commits sont fréquents, plus ces retours sont réguliers.
  • Le partage fréquent des modifications avec votre équipe assure que tout le monde part sur la même base, ce qui facilite la collaboration et réduit les risques de conflits de fusion lors de l'intégration de modifications complexes à grande échelle.
  • Votre stratégie de branching détermine la destination du push de vos modifications : la branche principale, une branche de fonctionnalités dédiée ou une branche de développement dédiée.
  • En règle générale, visez à ce que chacun dans votre équipe fasse un commit et partage ses changements au moins une fois par jour.

Surmonter les problèmes initiaux

Réaliser des commits plus fréquents peut paraître gênant au début, souvent par peur d'un contrôle trop intrusif ou en raison de tâches prenant plus d'une journée. La mise en place d'une culture de la collaboration et non pas du jugement est essentielle au sein de l'équipe. Avant d'implémenter de nouvelles pratiques de travail, il est recommandé de discuter de la meilleure façon de travailler en équipe. La division des tâches en unités plus petites et faciles à gérer peut aider les individus à adopter cette pratique.

Maintenir les builds dans le vert

Vous tirerez le meilleur parti de votre processus de CI/CD si vous maintenez une base de code en permanence prête à être déployée. Cette approche améliore l'efficacité en traitant les bugs dès qu'ils surviennent et vous permet de déployer rapidement un correctif en cas de problème en production.

Bien que les tests automatisés et les différentes étapes du pipeline fournissent un retour immédiat sur la capacité de votre code à être déployé, cette bonne pratique se concentre sur la façon dont vous répondez aux problèmes ainsi mis en évidence.

Résoudre les problèmes de façon collaborative

L'équipe doit assumer une responsabilité collective pour la création de builds et la production en urgence de correctifs rapides en cas de défaillance. Plutôt que de blâmer le dernier développeur ayant apporté des modifications, il faut résoudre les problèmes de façon collaborative, afin d'instiller une culture constructive qui améliore le workflow de CI/CD et introduit constamment des améliorations, en particulier sous pression.

Éliminer les erreurs simples

Afin de réduire le risque d'échecs de builds en raison d'erreurs simples, telles que des erreurs de syntaxe ou des dépendances manquantes, les membres de l'équipe doivent mettre en place et exécuter des tests locaux avant de partager leurs modifications. Tout le monde devrait utiliser les mêmes scripts que le système de CI/CD afin d'éviter la duplication des efforts.

Ne faire d'un build

Une erreur commune consiste à créer un build pour chaque phase de votre pipeline CI/CD. Reconstruire le code pour différents environnements risque d'introduire des incohérences et vous ne pouvez pas avoir la certitude que tous les tests précédents ont réussi.

Au lieu de cela, le même artefact de build doit être promu à travers chaque étape du pipeline de build et mis en production.

Mettre en place des builds indépendants du système

Assurez-vous que vos builds restent indépendants du système en appelant des variables, des paramètres d'authentification, des fichiers de configuration ou des scripts depuis le script de déploiement au lieu de les intégrer dans le build.

Centraliser le contrôle de version et le stockage des artefacts de build

Traitez les artefacts de build en tant que produits de votre code source. Contrôlez leur version et stockez-les dans un référentiel d'artefacts central, tels que Nexus, plutôt que dans votre système de contrôle de version.

Automatiser le déploiement

Utilisez votre serveur de CI pour automatiser le déploiement du même artefact de build dans chaque environnement de test. À mesure que l'artefact franchit avec succès les différentes étapes, la confiance de votre équipe en sa fiabilité grandit.

Rationaliser vos tests

Le processus de CI/CD recourt de façon intensive aux tests automatisés pour assurer la qualité de votre logiciel, mais cela ne signifie pas pour autant que vous devez tester chaque éventualité.

Il est essentiel de trouver un équilibre entre la couverture des tests et les performances. Si les tests prennent trop de temps à produire des résultats, certaines personnes seront tentées de les ignorer ou de prendre des raccourcis.

Mettre en place plusieurs niveaux de test

Créez plusieurs niveaux de tests automatiques, en commençant par les tests unitaires, puis en introduisant les tests d'intégration ou de composants.

Donner la priorité aux retours rapides

Exécutez les tests les plus rapides en premier pour avoir des retours aussi tôt que possible. En général, les tests unitaires sont les plus rapides à exécuter.

Envisager des tests parallèles

Vous pouvez créer plusieurs lots de tests et les exécuter en parallèle pour obtenir des résultats encore plus rapidement.

Exécuter les tests les plus longs en fin de processus

Ne passez aux tests les plus longs qu'une fois les tests de build les plus rapides terminés de façon satisfaisante.

Limiter la dépendance aux procédures manuelles d'assurance qualité

Étant donné le temps nécessaire pour procéder à une assurance qualité manuelle, il est préférable de n'exécuter cette phase qu'une fois l'ensemble des tests automatiques terminés.

Donner la priorité aux tests de plus haut niveau

N'utilisez pas les tests les plus longs pour vérifier chaque éventualité. Privilégiez une couverture plus large avec des tests de moins haut niveau et réservez les tests de plus haut niveau aux zones à haut risque en fonction des spécificités de votre produit et de vos utilisateurs.

Nettoyer vos environnements

L'exécution prolongée de vos environnements de pré-production risque d'introduire une divergence par rapport à la configuration d'origine et entre les différentes instances. Cette dérive de configuration peut déboucher sur des résultats de test incohérents et contre-productifs.

L'actualisation de vos environnements de test et de staging entre chaque exécution du pipeline est une pratique recommandée.

Utiliser des conteneurs ou des machines virtuelles

Hébergez vos environnements de test dans des conteneurs ou des machines virtuelles pour pouvoir les actualiser rapidement.

Adopter une approche d'infrastructure en tant que code (IaC)

Créez un script pour le processus de création et de suppression des environnements. Vous pourrez ensuite automatiser ces étapes depuis votre serveur de CI/CD.

Penser à l'évolutivité

Scripter la création des environnements facilite l'évolution de votre processus de CI/CD et l'exécution de plusieurs pipelines en parallèle.

Éviter les environnements statiques

Si vous optez pour des environnements statiques, vous devrez les gérer individuellement pour éviter les dérives de configuration. Cela risque de ralentir le processus d'assurance qualité et de retarder les publications.

Sécuriser votre pipeline

Un pipeline de CI/CD permet d'accéder à votre code et aux informations d'authentification en vue de la mise en production, ce qui en fait une cible idéale pour les pirates. Il est par conséquent essentiel d'appliquer les bonnes pratiques de sécurité dans vos processus de CI/CD.

  • Accès au contrôle de version : sécurisez l'accès à vos référentiels de contrôle de version et demandez à tous les contributeurs d'utiliser l'authentification multi-facteur. Si vous autorisez des tiers à apporter des modifications, mettez en place un processus de révision de leurs modifications avant de déclencher un build.
  • Gestion des informations d'authentification : des informations d'authentification et des clés d'API sont souvent nécessaires pour accéder aux services et aux environnements du pipeline de CI/CD. Ne stockez en aucun cas les informations d'authentification dans le code source. Utilisez plutôt un gestionnaire de secrets dédié et assurez-vous que les informations d'authentification n'apparaissent pas dans les journaux ou les artefacts de build.
  • Vérifications des dépendances : recherchez les vulnérabilités connues de vos dépendances tierces dans le cadre de vos vérifications d'intégration continue.
  • Communications sécurisées : assurez-vous que les communications entre votre serveur de CI et les machines de build sont sécurisées, et veillez à ce que les correctifs soient systématiquement appliqués sur l'ensemble des machines.
  • Principe du moindre privilège : appliquez le principe du moindre privilège à l'ensemble de votre pipeline. Cela rendra plus difficile les attaques par « island hopping » en cas de compromission d'un compte.
  • Gestion du changement : mettez en place des procédures de gestion du changement pour votre configuration de pipeline de sorte que les modifications soient systématiquement vérifiées avant leur application.

Respecter votre processus

Après avoir mis en place une stratégie de CI/CD et créé un pipeline fiable qui vous donne l'assurance de publications fiables, ne gâchez pas tous ces efforts en permettant à des individus de contourner ce processus.

Les gens ont souvent tendance à contourner le processus de CI/CD en cas de modifications mineures ou urgentes. Il est néanmoins important d'y résister pour plusieurs raisons :

  • Ignorer les phases d'assurance qualité automatisées risque de laisser passer des bugs facilement évitables.
  • Une fois le logiciel en production, il devient difficile de reproduire et d'éliminer les bugs en l'absence d'un build disponible pour les tests.
  • Le diagnostic et la correction des problèmes dans les publications « urgentes » peuvent prendre plus de temps que l'application du processus automatisé normal.

Lorsque quelqu'un demande à contourner le processus, prenez le temps d'expliquer les avantages d'un pipeline de CI/CD. Il est également important de demander si votre processus en place peut être amélioré.

Surveiller et mesurer votre pipeline

Une partie du processus de configuration du pipeline consiste à implémenter la surveillance de l'environnement de production et donc du produit.

La bonne pratique consiste à définir une forme similaire de surveillance du pipeline de CI/CD.

Analyser les mesures CI/CD clés

Utilisez les mesures collectées par votre outil de CI/CD pour identifier les problèmes potentiels et les domaines à améliorer.

Suivre la fréquence des builds

Comparez le nombre de builds déclenchés par semaine, jour ou heure pour mieux comprendre les habitudes d'utilisation de l'infrastructure de votre pipeline. La supervision permet de déterminer s'il est nécessaire de faire évoluer le système et d'identifier les horaires des pics de charge.

Suivre la vitesse de déploiement

Suivez la vitesse des déploiements dans le temps pour repérer les tendances et évaluer quand investir dans les optimisations des performances.

Tirer des enseignements des tests automatisés

Utilisez les statistiques issues des tests automatisés pour déterminer les domaines pouvant bénéficier de la parallélisation.

Examiner les résultats de l'assurance qualité

Identifiez les résultats d'assurance qualité généralement ignorés pour déterminer quels aspects de votre couverture de test pourraient être simplifiés.

En faire un travail d'équipe

La création d'un workflow de CI/CD dépend aussi de la culture de l'équipe et de l'organisation, et pas seulement des processus et des outils que vous employez.

L'intégration, la livraison et le déploiement continus sont au cœur des processus de DevOps. Ils ont pour vocation de supprimer le cloisonnement traditionnel entre les développeurs, les ingénieurs en assurance qualité et les opérations, et encouragent la collaboration entre les disciplines. L'adoption de ces bonnes pratiques de DevOps présente plusieurs avantages.

Visibilité et collaboration accrues

Les membres de l'équipe bénéficient d'une vue complète de l'ensemble du workflow et ont la possibilité de collaborer et de tirer parti de différents domaines d'expertise.

Responsabilité partagée

Le partage de la responsabilité de la maintenance du pipeline évite qu'une seule personne devienne un point de défaillance unique.

Autonomisation et contribution

Encourager le partage des responsabilités lors de la mise en production du logiciel permet à l'ensemble des membres de l'équipe d'apporter une contribution, que ce soit en corrigeant les builds, en automatisant les tâches ou en améliorant les processus.

Promouvoir une culture de la confiance

La promotion d'une culture de la confiance, où les membres de l'équipe sont capables d'expérimenter et de partager des idées, est bénéfique aussi bien pour l'organisation que le logiciel à livrer.

En cas de problème, vous pouvez utiliser cette opportunité pour tirer des leçons et rendre vos pratiques de CI/CD plus robustes et efficaces.

Pourquoi appliquer les bonnes pratiques de CI/CD ?

L'application des bonnes pratiques d'intégration continue, de livraison et de déploiement présente plusieurs avantages.

Livraison plus rapide

L'automatisation des tâches de build, de test et de déploiement accélère le processus de publication et permet de livrer les mises à jour plus rapidement. Le processus de CI/CD automatisé est essentiel pour réduire le temps de commercialisation et mettre les nouvelles fonctionnalités plus rapidement à la disposition des utilisateurs.

Retours réguliers

Des déploiements plus fréquents se traduisent par des retours plus réguliers des utilisateurs. Les connaissances ainsi acquises permettent de préciser les plans et d'adapter les stratégies.

Amélioration de la qualité du code

Les processus d'assurance qualité automatisés détectent les bugs plus tôt au cours du cycle de développement, afin de parvenir à une résolution plus rapide et de créer un cycle vertueux de code de meilleure qualité et de logiciels plus résistants.

Satisfaction utilisateur accrue

Les vérifications automatisées permettent de s'assurer que chaque changement est vérifié de façon constante, afin de minimiser le risque de laisser passer des bugs dans la version de production. Ainsi, les utilisateurs bénéficient d'une expérience plus fluide et la probabilité de temps d'arrêt est bien moindre.

Plus de temps pour la créativité

L'automatisation des tâches répétitives de création, de test et de déploiement de vos logiciels libère du temps permettant aux membres de l'équipe de se focaliser sur les tâches créatives, telles que le développement de nouvelles fonctionnalités, des conceptions plus novatrices ou l'amélioration de vos pratiques globales de DevOps.

Comment implémenter une stratégie de déploiement de CI/CD

L'implémentation de l'intégration, de la livraison et/ou du déploiement continus peut sembler insurmontable. Une stratégie de CI/CD réussie implique plusieurs éléments clés et nécessite le développement d'une culture forte du DevOps au fil du temps.

Définir des objectifs clairs

Comme pour les projets de développement logiciels, la définition et la communication des objectifs à votre équipe sont essentielles.

Que vous visiez une cadence de publication hebdomadaire avec des livraisons continues dans un environnement de pré-production ou la poursuite du déploiement continu avec des mises à jour rapides pour les utilisateurs, la définition d'objectifs clairs est essentielle.

Fractionner votre travail en tâches faciles à traiter

Une fois l'objectif défini, créez une succession de tâches facilement gérables pour y parvenir. L'implémentation incrémentielle de votre pipeline permet de profiter des avantages du CI/CD dès le début.

Commencer par le CI

L'intégration continue est le point de départ de la plupart des équipes. Le CI implique des tâches telles que le contrôle de version, les stratégies de branching, l'ajout ou l'expansion de la couverture des tests automatisés et le début de l'automatisation des builds et des tests. L'utilisation d'un serveur de CI vous aidera à coordonner ces activités, collecter les résultats et implémenter de la logique pour automatiser les phases successives de création et de test.

Passer au volet CD

Une fois le flux de CI automatisé en place, vous pouvez aborder la livraison ou le déploiement continu.

L'automatisation de la création des environnements permet de gagner du temps sur le long terme et rend votre pipeline plus fiable et robuste. Vous pouvez ensuite utiliser ces environnements pour exécuter davantage de tests, qu'ils soient automatisés ou manuels.

Analyser les données

Que ce soit pendant la phase d'implémentation ou une fois la stratégie de CI/CD en place, il est intéressant d'analyser les données de vos outils de CI/CD et de communiquer avec les membres de l'équipe pour identifier les opportunités d'amélioration de votre processus. Cette approche itérative assure l'amélioration continue et maximise les avantages du CI/CD pour votre équipe et votre organisation.

Résumé

L'adoption de ces bonnes pratiques de DevOps vous permettra de tirer pleinement parti de votre processus d'intégration, de livraison et de déploiement continus :

  • Faites des commits de code plus fréquents. Cela simplifie l'intégration des modifications et permet d'obtenir des retours plus réguliers sur votre travail en provenance des builds et tests automatisés.
  • Donnez la priorité à la réussite des builds. Maintenir votre base de code déployable améliore la qualité du code et vous permet de traiter les problèmes urgents en production.
  • Ne faites qu'un seul build. La promotion du même artefact de build dans différents environnements signifie que vous avez l'assurance que le code a franchi les différentes phases de test.
  • Simplifiez les tests automatisés. Les tests automatisés peuvent eux aussi prendre du temps à s'exécuter. Exécutez ceux qui fournissent les retours les plus rapides en premier.
  • Actualisez les environnements après chaque exécution de pipeline. Cela évite la dérive de la configuration et permet de s'assurer que vous pouvez compter sur les résultats de chaque phase de CI/CD.
  • Sécurisez votre pipeline. Dans la mesure où ils ont accès au code source et à l'environnement de production, les pipelines de CI/CD peuvent devenir des cibles lucratives pour les pirates, ce qui rend l'implémentation de la sécurité de CI/CD vitale.
  • Respectez votre processus. Contourner votre pipeline de CI/CD peut sembler tentant lorsqu'une modification est triviale ou urgente, mais cela coûte souvent plus cher à long terme.
  • Surveillez et mesurez votre pipeline. L'analyse des données de votre pipeline permet de le rendre plus robuste et efficace.
  • Faites du processus un effort collectif. L'entretien du pipeline ne devrait jamais être le travail d'une seule personne. L'adoption d'une approche DevOps présente de nombreux avantages.

Comment TeamCity peut vous aider

TeamCity est une plateforme d'automatisation de CI/CD conçue pour créer et faire évoluer vos pipelines de CI/CD. Quel que soit le niveau actuel d'automatisation de vos builds et de vos tests, la prise en main de TeamCity est simple.

Les intégrations étendues de tous les principaux systèmes de contrôle de version, de prise en charge de frameworks populaires de build et de test, et une interface utilisateur intuitive basée sur le web permettent de créer votre premier pipeline en quelques minutes. La prise en charge de la configuration en tant que code (CaC) permet de générer l'ensemble de vos définitions de pipeline depuis l'interface utilisateur et de les stocker dans le système de contrôle de version.

La conception hautement évolutive et performante de TeamCity fournit des retours rapides à partir de tests automatisés, tandis que les intégrations avec les principaux IDE et les plateformes de messagerie permettent d'obtenir des notifications quel que soit l'endroit où vous travaillez. Les fonctionnalités étendues de sécurité permettent de protéger votre code source et vos pipelines contre les attaques.

Au fur et à mesure que votre processus s'affine, vous pouvez profiter des rapports de couverture de test intégrés de TeamCity, identifier les tests instables et créer des statistiques d'agents pour poursuivre l'optimisation de vos processus de CI/CD.