Le CI/CD : intégration et déploiement continus

CI/CD avec Gitlab, Github et Jenkins

Qu'est-ce que le DevOps ?

"Devops" est la concaténation des trois premières lettres du mot anglais development (développement) et de l'abréviation ops du mot anglais operations (exploitation).

C'est un terme qui a été inventé par le belge Patrick Debois en 2007.

Le DevOps est un ensemble de pratiques qui visent à réduire le fossé entre le développement logiciel (Dev) et les opérations informatiques (Ops), d'où le terme.

L'idée est de favoriser une collaboration plus étroite et une meilleure communication entre ces deux entités qui, dans les modèles traditionnels, opèrent souvent de manière isolée.

Les principes clés du DevOps comprennent aujourd'hui :

  • l'intégration continue (CI pour continuous integration en anglais - le code est régulièrement fusionné et testé),
  • la livraison continue (CD pour continuous delivery - les mises à jour du logiciel sont régulièrement libérées pour la production),
  • l'infrastructure en tant que code (la gestion et la provision des infrastructures informatiques via le code - IAC en anglais pour Infrastructures As Code),
  • la surveillance et la journalisation (le suivi en temps réel de la performance et des erreurs du logiciel)
  • la culture de la rétroaction (l'encouragement à l'amélioration constante via les retours d'information)

Le schéma classique est celui-ci :

Outils DevOps principaux

1 - Planification et collaboration :

Ces outils permettent de créer des tâches et de gérer un projet. Les plus utilisés sont :

  • Gitlab
  • Github
  • Jira

2 - Gestion du code (développement)

Ces outils permettent d'effectuer un contrôle de version du code. Les plus utilisés sont :

  • GitHub
  • GitLab
  • Bitbucket

3 - Intégration Continue / Déploiement Continu (CI/CD) :

Ces outils surveillent les commits dans votre dépôt par exemple Github. Lorsqu'un commit est effectué, ils lancent automatiquement un "pipeline" d'intégration continue qui peut compiler le code, exécuter des tests unitaires, des tests d'intégration, et d'autres types de tests pour s'assurer que les dernières modifications n'ont pas introduit de bugs.

Si tous les tests passent, ces outils peuvent être configurés pour déployer automatiquement les changements sur un environnement de production, de staging ou de test. Cela accélère le processus de livraison de nouvelles fonctionnalités et de corrections de bugs.

Des solutions très connues sont :

  • Jenkins
  • GitLab CI/CD
  • Github actions
  • AWS CodePipeline
  • Azure DevOps
  • CircleCI
  • Travis CI

4 - Gestion de l'infrastructure :

Ces outils permettent de faire des choses très différentes mais concernent les serveurs et les clusters.

Nous pouvons citer quelques exemples :

  • Docker : pour créer des images et ensuite les exécuter dans des conteneurs sur un cluster.
  • Docker Hub (ou tout autre Container Registry - il y en a plusieurs dizaines) : plateforme de service cloud qui permet aux développeurs de stocker et d'utiliser des images d'applications conteneurisées.
  • Kubernetes : plateforme qui automatise la déploiement, la mise à l'échelle et la gestion des applications conteneurisées, offrant un cadre pour orchestrer et coordonner des conteneurs au sein d'un environnement de cloud.
  • Terraform : outil d'Infrastructure as Code (IaC) open source qui permet aux développeurs de définir et de fournir des infrastructures de centres de données en utilisant un langage de description déclaratif, facilitant ainsi la gestion et l'orchestration des ressources cloud.
  • Ansible : outil d'automatisation open source qui permet la gestion de configuration, le déploiement d'applications et l'orchestration de tâches sur une variété de systèmes et de plateformes (en résumé permet de configurer et de gérer des serveurs plus simplement).

4 - Surveillance et retour d'information :

Ces outils permettent de surveiller (monitoring) des clusters ou plus généralement des applications exécutées sur des serveurs.

Voici une liste des outils les plus courants :

  • Prometheus : système de surveillance et d'alerte qui collecte et stocke les métriques d'application et de système en temps réel, offrant des fonctionnalités de requête et d'alerte pour aider à la détection et à la résolution des problèmes.
  • Grafana : plateforme pour la visualisation et l'analyse de données, permettant aux utilisateurs de créer des tableaux de bord interactifs et compréhensibles pour surveiller et analyser en temps réel les données provenant de diverses sources, le plus souvent de Prometheus.
  • ELK Stack (Elasticsearch, Logstash, Kibana) : suite d'outils qui fournit des capacités de recherche, d'analyse, de journalisation et de visualisation de données, permettant aux utilisateurs de transformer leurs données en insights précieux.
  • Datadog / Nagios / New Relic / Sentry : plateformes de surveillance et d'analyse des performances en temps réel pour les infrastructures cloud, les applications, les journaux et les métriques, facilitant la détection des problèmes et leur résolution.

Vous pouvez retrouver tous les outils principaux utilisés avec Kubernetes ici. Ne soyez pas découragés, il n'y besoin dans la plupart des projets que de n'en connaitre vraiment que quelques-uns.

Qu'est-ce que le CI / CD ?

CI (Continuous Integration - Intégration Continue)

L'Intégration Continue (CI), est une pratique de développement logiciel dans laquelle les développeurs intègrent régulièrement leur code dans un répertoire Git. Chaque fois qu'un développeur pousse du code, une série d'automatisations est déclenchée pour compiler, tester et vérifier le code nouvellement ajouté. L'objectif principal de la CI est de détecter les problèmes d'intégration tôt et de garantir que le code nouvellement ajouté ne casse pas l'application existante.

Les étapes typiques incluent la compilation du code (build), l'exécution de tests unitaires et d'autres tests automatisés, la vérification des normes de code, la génération de rapports de test et la fourniture de commentaires rapide aux développeurs sur l'état de leur code. Dans un contexte de conteneurisation, comme avec Kubernetes, c'est également pendant l'intégration continue que sont build les images.

Les outils CI couramment utilisés incluent Jenkins, Travis CI, CircleCI, GitLab CI/CD, Github Actions, et bien d'autres.

CD (Continuous Deployment - Déploiement Continu)

Le CD, ou Déploiement Continu, est une extension de la CI qui vise à automatiser le déploiement des changements de code nouvellement validés vers les environnements de production ou de pré-production.

Contrairement à la CI qui se concentre principalement sur les builds, les tests et les vérifications, le CD s'intéresse à l'automatisation de la mise en production des changements.

Avec le CD, une fois que le code a passé avec succès les étapes de la CI et qu'il a été validé, il est automatiquement déployé dans un environnement cible, généralement à partir d'un pipeline automatisé. Le CD permet de minimiser le temps nécessaire pour mettre en production de nouvelles fonctionnalités ou des correctifs, tout en réduisant les risques liés aux déploiements manuels.

Il existe deux approches principales en matière de CD :

Continuous Deployment (Déploiement Continu) : dans cette approche, chaque changement de code validé est automatiquement déployé dans l'environnement de production sans intervention humaine. Cela nécessite une confiance élevée dans l'automatisation et une solide suite de tests automatisés.

Continuous Delivery (Livraison Continue) : ici, les changements de code validés sont automatiquement déployés dans un environnement de pré-production ou de staging. La décision de déployer dans l'environnement de production est prise manuellement, généralement par un responsable technique, après avoir évalué les risques.

Suivez nos formations pour apprendre avec de nombreux projets à réaliser des pipelines CI/CD réalistes :