Skip to content

This project is a Flask API for predicting Iris flower species using a pre-trained RandomForestClassifier. It features Swagger UI for API documentation and testing, with a CI/CD pipeline automating testing and deployment to Render via GitHub Actions.

Notifications You must be signed in to change notification settings

mnassrib/iris-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Guide pour Déployer une API de Prédiction Iris avec un Pipeline CI/CD sur Render

Ce projet implémente une API Flask permettant de prédire la classe d'une fleur Iris à partir de ses caractéristiques, accompagnée d'une documentation Swagger. Le projet inclut également un pipeline CI/CD complet utilisant GitHub Actions pour automatiser les tests et le déploiement de l'application sur Render, avec une image Docker hébergée sur Docker Hub.

Table des matières

  1. Introduction et description du projet
  2. Fonctionnalités
  3. Prérequis
  4. Installation
  5. Structure du projet
  6. Exécution de l'API en local avec Python
  7. Simulation de l'environnement de production avec Docker
  8. Automatisation du déploiement avec un pipeline CI/CD
  9. Tester l'API en production
  10. Améliorations futures

Introduction et description du projet

Ce projet a pour but de démontrer une approche complète de développement d'une API de prédiction utilisant le modèle RandomForestClassifier de scikit-learn, avec une intégration complète de CI/CD (Continuous Integration/Continuous Deployment).

Grâce à cette API, vous pourrez prédire la classe d'une fleur Iris à partir de ses caractéristiques florales (longueur et largeur des sépales et des pétales). L'API est documentée via Swagger UI pour faciliter l'interaction avec les différents endpoints.

Un pipeline CI/CD est mis en place avec GitHub Actions pour automatiser les tests, la construction d'une image Docker, et le déploiement de l'application sur la plateforme Render. Ce pipeline permet une gestion fluide des déploiements en production tout en garantissant la qualité grâce à des tests automatisés.

Fonctionnalités

  • PrĂ©diction : Fournit la classe prĂ©dite (Setosa, Versicolor, Virginica) d'une fleur Iris Ă  partir de 4 caractĂ©ristiques.
  • Documentation Swagger : Swagger UI est intĂ©grĂ© pour documenter les endpoints disponibles.
  • CI/CD AutomatisĂ© : Tests unitaires, construction d'une image Docker, et dĂ©ploiement automatisĂ© sur Render via GitHub Actions.
  • Validation des donnĂ©es : Validation des donnĂ©es d'entrĂ©e avant la prĂ©diction pour s'assurer que les entrĂ©es sont correctes.
  • ModularitĂ© : Organisation modulaire du code pour une meilleure maintenabilitĂ©.

Prérequis

Avant de commencer, assurez-vous d'avoir les éléments suivants :

  • Python
  • GitHub et un dĂ©pĂ´t Git
  • Compte Render (pour hĂ©berger l'application)
  • Compte Docker Hub (pour hĂ©berger l'image Docker de l'application)

Installation

  1. Cloner le dépôt Git :

    git clone https://github.com/mnassrib/iris-api.git
    cd iris-api
  2. Installer les dépendances :

    pip install -r requirements.txt
  3. Entraîner le modèle (si le modèle n'est pas encore disponible dans le dossier models) :

    python train_model.py

Structure du projet

La structure du projet est la suivante :

iris-api
├── app.py
├── train_model.py
├── models
│   └── iris_model.pkl
├── utils
│   ├── model_utils.py
│   └── validation.py
├── swagger
│   ├── index.yml
│   └── predict.yml
├── tests
│   └── __init__.py
│   └── test_app.py
├── Dockerfile
├── requirements.txt
├── .gitignore
├── README.md
└── .github
    └── workflows
        └── ci-cd.yml

Explication des fichiers principaux :

  • app.py : Fichier principal de l'API. Il contient les routes pour les prĂ©dictions et la page d'accueil.
  • train_model.py : Script pour entraĂ®ner le modèle RandomForestClassifier et le sauvegarder.
  • models/iris_model.pkl : Modèle prĂ©-entraĂ®nĂ© utilisĂ© pour faire des prĂ©dictions.
  • utils/model_utils.py : Contient la fonction de chargement du modèle.
  • utils/validation.py : Contient la fonction de validation des donnĂ©es d'entrĂ©e.
  • utils/swagger_config.py : Contient le template de configuration de Swagger.
  • swagger/ : Contient les fichiers YAML dĂ©finissant la documentation Swagger pour les diffĂ©rents endpoints.
  • tests/test_app.py : Tests unitaires pour valider le bon fonctionnement de l'API.
  • __init__.py : Fichier qui indique Ă  Python que le rĂ©pertoire doit ĂŞtre traitĂ© comme un module, souvent utilisĂ© pour initialiser des packages et gĂ©rer les imports au sein du rĂ©pertoire.
  • .gitignore : Fichier pour exclure certains fichiers ou rĂ©pertoires du suivi de version Git, tels que les fichiers gĂ©nĂ©rĂ©s automatiquement ou les donnĂ©es sensibles.
  • .github/workflows/ci-cd.yml : Pipeline CI/CD pour exĂ©cuter les tests et dĂ©ployer l'application sur Render.

Exécution de l'API en local avec Python

  • Description : Cette Ă©tape vous permet de lancer l'API directement sur votre machine locale en utilisant Python. Elle est utile pour tester les fonctionnalitĂ©s de l'API rapidement et sans avoir besoin de Docker ou d'un environnement complexe. Les dĂ©veloppeurs peuvent exĂ©cuter python app.py pour dĂ©marrer l'API sur localhost:5000 et interagir avec celle-ci en envoyant des requĂŞtes HTTP pour vĂ©rifier son bon fonctionnement.
  1. Lancer l'application localement :

    python app.py

    L'application sera disponible Ă  l'adresse http://127.0.0.1:5000.

  2. Tester l'API avec une requĂŞte curl :

    curl -X POST http://localhost:5000/predict \
    -H "Content-Type: application/json" \
    -d "{\"features\": [5.1, 3.5, 1.4, 0.2]}"

    Vous recevrez une réponse JSON avec la classe prédite :

    {
      "prediction": 0
    }
  3. Accéder à la documentation Swagger : Accédez à http://127.0.0.1:5000/apidocs/ pour voir la documentation complète de l'API générée automatiquement via Swagger.

  4. Tests : Pour exécuter les tests unitaires :

    pytest

    Les tests se trouvent dans le répertoire tests/ et couvrent les fonctionnalités principales de l'API.

Note : Sur Windows, utilisez ^ pour les requêtes multi-lignes, tandis que sur Linux/macOS, utilisez \. Si vous rencontrez des erreurs, ajustez le format des requêtes en fonction de votre système d'exploitation.

Simulation de l'environnement de production avec Docker

  • Description : Cette Ă©tape simule un environnement de production localement en exĂ©cutant l'API dans un conteneur Docker. Cela permet de tester l'application dans un environnement isolĂ©, avec toutes ses dĂ©pendances, comme ce sera le cas en production. Vous construisez l'image Docker de l'application, puis vous la lancez dans un conteneur sur localhost:5000, assurant ainsi que l'application est prĂŞte pour le dĂ©ploiement.
  1. Construire l'image Docker :

    docker build -t iris-api .
  2. Lancer le conteneur Docker :

    docker run -p 5000:5000 iris-api

    L'application sera disponible Ă  http://127.0.0.1:5000.

  3. Tester l'API avec une requĂŞte curl :

    curl -X POST http://localhost:5000/predict \
    -H "Content-Type: application/json" \
    -d "{\"features\": [5.1, 3.5, 1.4, 0.2]}"
  4. Accéder à la documentation Swagger : Accédez à http://127.0.0.1:5000/apidocs/ pour voir la documentation complète de l'API générée automatiquement via Swagger.

  5. Tests : Pour exécuter les tests unitaires :

    pytest

Automatisation du déploiement avec un pipeline CI/CD

  • Description : Cette Ă©tape est dĂ©diĂ©e Ă  l'automatisation complète du cycle de dĂ©veloppement Ă  travers un pipeline CI/CD (Continuous Integration/Continuous Deployment) utilisant GitHub Actions. Le pipeline automatise les tests unitaires, la construction de l'image Docker, et le dĂ©ploiement sur Render en production. Chaque modification apportĂ©e au code dĂ©clenche le pipeline pour garantir que les mises Ă  jour sont testĂ©es et dĂ©ployĂ©es de manière fiable et sans intervention manuelle. C'est une Ă©tape cruciale pour assurer la qualitĂ© et la rapiditĂ© des dĂ©ploiements en production.

Importance du CI/CD

Qu'est-ce que le CI/CD ?

Le CI/CD, ou Continuous Integration/Continuous Deployment, est une pratique de développement logiciel qui automatise les processus de test, d'intégration et de déploiement des applications. Cette approche permet d'intégrer les nouvelles modifications dans le code source de manière continue, de tester ces modifications automatiquement, et de déployer rapidement et de manière fiable les nouvelles versions de l'application.

Pourquoi est-il important ?

L'importance du CI/CD réside dans les bénéfices suivants :

  • Automatisation : Le CI/CD permet d'automatiser des processus fastidieux comme les tests et les dĂ©ploiements. Cela rĂ©duit les erreurs humaines et garantit des processus fiables et reproductibles.
  • RapiditĂ© : En automatisant les tests et les dĂ©ploiements, les dĂ©veloppeurs peuvent itĂ©rer plus rapidement et mettre Ă  jour leurs applications plus frĂ©quemment, avec des retours immĂ©diats en cas de problèmes.
  • QualitĂ© : Grâce Ă  des tests automatisĂ©s exĂ©cutĂ©s Ă  chaque modification du code, le CI/CD amĂ©liore la qualitĂ© du code en dĂ©tectant rapidement les rĂ©gressions ou les bugs.
  • Confiance : En s'appuyant sur des pipelines bien configurĂ©s, les dĂ©veloppeurs peuvent dĂ©ployer en production avec confiance, sachant que les tests ont Ă©tĂ© effectuĂ©s et que les Ă©tapes de dĂ©ploiement sont automatisĂ©es.

Relations entre GitHub Actions, Docker Hub et Render

Le CI/CD (Continuous Integration/Continuous Deployment) est essentiel pour automatiser tout le processus de développement. Ce projet est configuré avec un pipeline CI/CD dans le fichier .github/workflows/ci-cd.yml. Chaque fois qu'un développeur pousse une modification sur le dépôt GitHub, le pipeline CI/CD est déclenché via GitHub Actions, qui suit ces étapes :

  1. Installation des dépendances : À chaque push sur la branche principale du dépôt GitHub, le pipeline commence par installer les dépendances définies dans requirements.txt.
  2. Tests et validation : Le pipeline commence par exécuter les tests unitaires via pytest. Si les tests échouent, le processus s'arrête ici.
  3. Construction de l'image Docker : Si les tests réussissent, une image Docker de l'API est automatiquement construite et envoyée vers Docker Hub.
  4. Déploiement automatique sur Render : Une fois l'image Docker prête et validée, le déploiement est déclenché sur Render via un webhook. Render récupère l'image depuis Docker Hub et l'utilise pour déployer la nouvelle version de l'application en production.

🚨 Notez qu'il est important de désactiver l'option Auto-Deploy sur Render pour que le déploiement suive uniquement le workflow GitHub Actions et ne se déclenche qu'après validation complète du pipeline CI/CD. 🚨

Secrets dans CI/CD

Les secrets pour Docker Hub et Render doivent être ajoutés dans les secrets GitHub de votre dépôt. Pour ce faire :

  1. Ajouter les secrets GitHub :

    • DOCKER_USERNAME : Votre nom d'utilisateur Docker Hub.
    • DOCKER_PASSWORD : Votre mot de passe Docker Hub.
    • RENDER_DEPLOY_HOOK : URL du webhook Render pour dĂ©ployer l'application.
  2. Allez dans les paramètres de votre dépôt GitHub, puis dans la section Secrets and variables > Actions pour ajouter ces secrets.

Tester l'API en production

L'API de ce projet est déployée sur Render et est disponible à l'adresse suivante :

https://iris-api-7cbf.onrender.com

Tester l'API en production

Vous pouvez tester l'API en envoyant une requĂŞte POST Ă  l'endpoint /predict :

curl -X POST https://iris-api-7cbf.onrender.com/predict \
-H "Content-Type: application/json" \
-d "{\"features\": [5.1, 3.5, 1.4, 0.2]}"

Vous recevrez une réponse JSON avec la classe prédite. Par exemple :

{
  "prediction": 0
}

Consulter la documentation de l'API

Vous pouvez également accéder à la documentation Swagger de l'API en production à l'adresse suivante :

https://iris-api-7cbf.onrender.com/apidocs/

Améliorations futures

  • Ajouter des tests supplĂ©mentaires pour amĂ©liorer la couverture.
  • Optimiser la gestion des erreurs pour plus de robustesse.
  • ImplĂ©menter un système de cache pour les prĂ©dictions.
  • Ajouter des fonctionnalitĂ©s de monitoring et de logging pour la production.

Ce guide est conçu pour vous fournir un aperçu complet du projet, de l'installation à l'utilisation, en passant par les tests, le déploiement et l'importance du CI/CD dans ce projet.

About

This project is a Flask API for predicting Iris flower species using a pre-trained RandomForestClassifier. It features Swagger UI for API documentation and testing, with a CI/CD pipeline automating testing and deployment to Render via GitHub Actions.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published