Ce dépôt contient une implémentation d'un pipeline MLOps complet utilisant Airflow pour l'orchestration des workflows et Tekton pour l'intégration et le déploiement continus.
- Architecture
- Prérequis
- Installation
- Utilisation
- Structure du Projet
- Développement
- Déploiement
- Maintenance
- Contributions
- Licence
Le projet suit une architecture modulaire avec les composants principaux suivants :
- Airflow : Orchestration des workflows de données et d'entraînement des modèles
- Tekton : Pipeline CI/CD pour la construction, le test et le déploiement des modèles
- Kubernetes : Exécution des charges de travail conteneurisées
- Trino/Starburst : Requêtage fédéré des données
- MLflow : Suivi des expériences et gestion des modèles
- Kubernetes 1.28+
- Tekton Pipelines 0.56.0+ (API
tekton.dev/v1) - Airflow 3.0+
- Python 3.12+
- Helm 3.0+
- kubectl configuré avec accès au cluster
# Cloner le dépôt
git clone [URL_DU_REPO]
cd ml-airflow-tekton
# Créer un namespace dédié
kubectl create namespace ml-workloads# Installer Tekton
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
# Installer les tâches Tekton
kubectl apply -f tekton/tasks/
# Installer le pipeline Tekton
kubectl apply -f tekton/pipeline.yaml# Ajouter le dépôt Helm d'Airflow
helm repo add apache-airflow https://airflow.apache.org
helm repo update
# Installer Airflow
helm install airflow apache-airflow/airflow -n airflow --create-namespace \
--set executor=KubernetesExecutor \
--set dags.gitSync.enabled=true \
--set dags.gitSync.repo=https://github.com/votre-org/ml-airflow-tekton.git \
--set dags.gitSync.branch=mainLe pipeline de re-entraînement s'exécute automatiquement selon la planification définie dans le DAG (par défaut, tous les jours à 2h du matin).
Pour déclencher manuellement un re-entraînement :
# Lancer le DAG via l'interface web d'Airflow
# ou via la CLI :
kubectl exec -n airflow deploy/airflow-webserver -- airflow dags trigger ml_model_retraining# Créer un PipelineRun
cat <<EOF | kubectl apply -f -
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
generateName: ml-pipeline-run-
spec:
pipelineRef:
name: ml-model-pipeline
params:
- name: git-repo
value: https://github.com/votre-org/ml-airflow-tekton.git
- name: git-revision
value: main
- name: model-name
value: mon-modele
- name: target-env
value: staging
workspaces:
- name: shared-workspace
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
EOF.
├── airflow/ # Configuration et DAGs Airflow
│ ├── config/ # Fichiers de configuration
│ └── dags/ # DAGs Airflow
│ └── utils/ # Utilitaires partagés
├── infrastructure/ # Infrastructure as Code
│ ├── helm-charts/ # Charts Helm personnalisés
│ └── terraform/ # Configuration Terraform
├── model-code/ # Code du modèle ML
│ ├── src/ # Code source
│ │ ├── api/ # API de service
│ │ ├── data/ # Traitement des données
│ │ └── models/ # Définition des modèles
│ └── tests/ # Tests unitaires et d'intégration
└── tekton/ # Pipelines CI/CD
├── tasks/ # Tâches Tekton
├── triggers/ # Déclencheurs d'événements
└── pipeline.yaml # Définition du pipeline principal
# Créer un environnement virtuel
python -m venv .venv
source .venv/bin/activate # Sur Windows: .\.venv\Scripts\activate
# Installer les dépendances (modèle + tests)
pip install -r model-code/requirements.txt
# Installer les hooks pre-commit (ruff, fin de fichier, yaml)
pip install pre-commit && pre-commit install# Script unique (venv + install + pytest)
./scripts/test.sh
# Ou directement avec pytest
pytest model-code/tests/
pytest model-code/tests/ -m unit # filtrer par marqueur# Lint
ruff check .
# Formatage
ruff format .Le déploiement en staging est automatique après validation des tests.
Le déploiement en production nécessite une approbation manuelle :
- Créer une release GitHub
- Déclencher le pipeline avec le paramètre
target-env=production - Valider le déploiement via l'interface de monitoring
- Airflow : Tableau de bord disponible sur
http://airflow.example.com - Prometheus/Grafana : Métriques des applications
- MLflow : Suivi des expériences sur
http://mlflow.example.com
# Voir les logs d'Airflow
kubectl logs -n airflow deploy/airflow-webserver
# Voir les logs des tâches Tekton
tkn pipelinerun logs -fLa suite de tests (61 tests) couvre l'API, le preprocessing, l'entraînement et les fonctions Airflow.
# Crée/réutilise le venv, installe les dépendances de test et lance pytest
./scripts/test.sh
# Avec couverture de code (rapport terminal + HTML)
./scripts/test.sh --cov
# Filtrer par marqueur pytest
./scripts/test.sh -m unit
# Nettoyer le venv et les caches
./scripts/test.sh --cleanLa CI (.github/workflows/ci.yml) exécute Ruff (lint + format) et la suite pytest à chaque push/PR.
- Guides détaillés : voir le dossier
docs/(RUN_TESTS.md,TESTING_INSTRUCTIONS.md,QUICK_TEST_GUIDE.md) - Documentation technique :
model-code/tests/README.md
Des efforts importants ont été faits pour sécuriser ce projet :
- ✅ Variables d'environnement pour les credentials (
.env.examplefourni) - ✅
.gitignorecomplet pour éviter les commits de secrets - ✅ Guide de sécurité complet (
SECURITY.md) - ✅ Checklist pré-production (Infrastructure, Airflow, MLflow, Tekton, API)
SECURITY.md avant le déploiement en production.
README.md- Ce fichier (vue d'ensemble)SECURITY.md- Guide de sécurité completdocs/- Guides détaillés (installation Airflow, Makefile, dépannage Tekton, tests, etc.)model-code/tests/README.md- Documentation technique des tests
Les contributions sont les bienvenues ! Voici comment contribuer :
- Forkez le projet
- Créez une branche pour votre fonctionnalité (
git checkout -b feature/ma-nouvelle-fonctionnalite) - Exécutez les tests (
./scripts/test.sh --cov) - Vérifiez la couverture (≥ 80%)
- Committez vos changements (
git commit -am 'Ajouter une nouvelle fonctionnalité') - Poussez vers la branche (
git push origin feature/ma-nouvelle-fonctionnalite) - Créez une Pull Request
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
Développé avec ❤️ par l'équipe Data Science de CNaaS IT