Aller au contenu principal

CI/CD

Intégration continue et déploiement continu

Qu'est-ce que la CI et le CD ?

L'intégration continue (CI) et le déploiement continu (CD) sont des pratiques essentielles dans le développement logiciel moderne.

Elles visent à améliorer la qualité du code, à réduire les erreurs et à accélérer la livraison des applications.

L'intégration continue consiste à intégrer fréquemment les modifications de code dans un référentiel partagé. Chaque intégration est vérifiée par une compilation automatisée et des tests, permettant de détecter rapidement les problèmes.

Le déploiement continu va plus loin en automatisant le processus de mise en production. Une fois que le code a passé tous les tests, il est automatiquement déployé dans l'environnement de production.

Les principaux avantages du CI/CD sont :

  1. Détection précoce des bugs : Les problèmes sont identifiés rapidement, ce qui facilite leur résolution.
  2. Réduction des risques : Les petites modifications fréquentes sont moins risquées que les grands changements occasionnels.
  3. Feedback rapide : Les développeurs obtiennent rapidement des retours sur leur travail.
  4. Livraison plus rapide : Les nouvelles fonctionnalités atteignent plus vite les utilisateurs.
  5. Amélioration de la qualité : Les tests automatisés garantissent un niveau de qualité constant.

Un pipeline CI/CD typique comprend les étapes suivantes :

  1. Commit : Le développeur pousse son code vers le dépôt.
  2. Build : Le code est compilé et les dépendances sont résolues.
  3. Test : Des tests automatisés sont exécutés (unitaires, d'intégration, etc.).
  4. Analyse : Le code est analysé pour détecter les problèmes de qualité ou de sécurité.
  5. Déploiement : L'application est déployée dans un environnement de test ou de production.

Pour mettre en place un pipeline CI/CD, on utilise généralement des outils spécialisés comme Jenkins, GitLab CI, Travis CI ou CircleCI. Ces outils s'intègrent avec les systèmes de gestion de version comme Git et peuvent être configurés pour s'exécuter automatiquement à chaque modification du code.

Principaux outils de CI/CD

Voici une liste des principaux soutils de CI/CD (en 2024) :

  1. Jenkins

    Jenkins est un serveur d'intégration continue open source très populaire, offrant une grande flexibilité grâce à son vaste écosystème de plugins. Il permet d'automatiser la construction, les tests et le déploiement de logiciels sur diverses plateformes.

  2. GitLab CI

    GitLab CI est une solution complète intégrée à la plateforme GitLab, offrant des fonctionnalités de contrôle de version, de révision de code et de CI/CD dans un seul tableau de bord.

  3. GitHub Actions

    GitHub Actions est une plateforme d'intégration et de livraison continues (CI/CD) qui permet d'automatiser les workflows de développement, de test et de déploiement directement depuis vos dépôts GitHub.

  4. CircleCI

    CircleCI est une plateforme CI/CD basée sur le cloud, particulièrement adaptée aux projets open source et à grande échelle. Elle offre une grande flexibilité et s'intègre facilement avec les principaux systèmes de contrôle de version.

  5. Travis CI

    Travis CI est un service d'intégration continue distribué, principalement utilisé pour les projets hébergés sur GitHub. Il offre une configuration simple et un hébergement dans le cloud.

  6. Bamboo

    Développé par Atlassian, Bamboo est un outil CI/CD puissant qui s'intègre parfaitement avec d'autres produits Atlassian comme JIRA et Bitbucket.

  7. Azure DevOps

    Azure DevOps est une plateforme complète de Microsoft pour le développement d'infrastructures, permettant la création, les tests et le déploiement dans divers langages et environnements.

  8. TeamCity

    TeamCity, développé par JetBrains, est un outil CI/CD open source basé sur Java, offrant une excellente intégration avec Docker et Kubernetes.

  9. Buildkite

    Buildkite est une plateforme CI/CD rapide, sécurisée et évolutive, particulièrement utile pour concevoir des sites web sur une infrastructure personnalisée.

  10. Semaphore

    Semaphore est une application CI/CD hébergée, intégrée à GitHub, qui permet d'automatiser les pipelines de livraison continue et supporte les applications basées sur Docker.

  11. GoCD

    GoCD est un outil open source pour la création et la publication de logiciels, offrant une configuration facile et un contrôle complet du flux de travail de bout en bout.

  12. Woodpecker CI

    Woodpecker est un outil CI/CD open source et gratuit, basé sur des conteneurs Docker. Il permet de créer facilement plusieurs workflows pour un projet, qui peuvent même dépendre les uns des autres.

  13. Dokploy

    Dokploy est une plateforme tout-en-un open source qui simplifie le déploiement et la gestion d'applications. Elle offre des fonctionnalités telles que le déploiement en un clic de modèles open source, la gestion avancée des utilisateurs et l'accès direct aux terminaux des conteneurs.

  14. Forgejo Runner

    Forgejo Runner est un daemon qui récupère les workflows à exécuter depuis une instance Forgejo, les exécute, renvoie les logs et rapporte le succès ou l'échec. Il s'installe séparément de l'instance principale Forgejo et supporte différents environnements d'exécution comme Docker, Podman et LXC.

Exemple pratique

Mise en place d'un pipeline CI/CD avec GitHub Actions

Imaginons que vous développez une application web simple en JavaScript. Voici comment vous pourriez mettre en place un pipeline CI/CD basique avec GitHub Actions :

  1. Créez un fichier .github/workflows/ci-cd.yml dans votre dépôt GitHub.

  2. Ajoutez le contenu suivant au fichier :

name: CI/CD Pipeline

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

jobs:
build-and-test:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v2
with:
node-version: '14.x'
- run: npm ci
- run: npm run build --if-present
- run: npm test

deploy:
needs: build-and-test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'

steps:
- name: Deploy to production
run: |
echo "Déploiement en production..."
# Ici, vous ajouteriez les commandes pour déployer votre application

Ce pipeline effectue les actions suivantes :

  • À chaque push ou pull request sur la branche main
  • Il installe les dépendances, construit l'application et exécute les tests
  • Si tout réussit et que c'est un push sur main, il simule un déploiement

Pour utiliser ce pipeline, assurez-vous d'avoir des scripts npm appropriés pour build et test dans votre package.json.

Test de mémorisation/compréhension


Quelle pratique peut paradoxalement ralentir le déploiement initial d'une application tout en améliorant la vitesse de déploiement à long terme ?


Dans un pipeline CI/CD, quelle étape peut potentiellement introduire des vulnérabilités de sécurité si elle n'est pas correctement gérée ?


Quelle affirmation sur le déploiement continu est vraie, bien qu'elle puisse sembler contre-intuitive ?


Quel aspect du CI/CD peut initialement sembler réduire la sécurité, mais en réalité l'améliore souvent ?


Quelle pratique CI/CD peut sembler augmenter la complexité du développement mais simplifie souvent la gestion à long terme ?



TP pour réfléchir et résoudre des problèmes

Dans ce TP, nous allons simuler la mise en place d'un pipeline CI/CD pour une application web simple.

Vous allez créer un fichier de configuration pour GitHub Actions qui automatisera le processus de build, test et déploiement de l'application.

Étapes :

  1. Créez un nouveau dépôt GitHub pour une application web fictive.

  2. Dans ce dépôt, créez un fichier .github/workflows/ci-cd.yml.

  3. Configurez le pipeline pour qu'il effectue les étapes suivantes :

    • Déclenchez le pipeline sur chaque push et pull request sur la branche main
    • Utilisez la dernière version de Ubuntu comme environnement d'exécution
    • Configurez Node.js version 14.x
    • Installez les dépendances avec npm ci
    • Exécutez les tests avec npm test
    • Construisez l'application avec npm run build
    • Si c'est un push sur main, simulez un déploiement en affichant un message
  4. Ajoutez une étape d'analyse statique du code avec ESLint.

  5. Configurez le pipeline pour qu'il ne déploie que si tous les tests et l'analyse de code passent.

  6. Ajoutez une étape pour créer et publier un artefact contenant les fichiers de build.

Rédigez le contenu du fichier .github/workflows/ci-cd.yml pour réaliser ces tâches.

Une solution