Pourquoi CI/CD pour Django avec GitHub Actions ?
La CI/CD (Continuous Integration / Continuous Deployment) est un processus essentiel dans le développement logiciel moderne. Elle permet d'automatiser les étapes de construction, de tests et de déploiement du code source pour une application web. Cela augmente la qualité du code, réduit le temps de livraison et favorise une meilleure collaboration entre les équipes.
Un cas concret est l'intégration continue d'une application Django qui gère un blog. A chaque modification du code, on souhaite que toutes les modifications soient testées automatiquement pour s'assurer qu'elles n'introduisent pas de bugs et que l'application fonctionne toujours correctement.
Prerequis
Pour suivre ce tutoriel, vous aurez besoin des éléments suivants :
- Un compte GitHub
- Python 3.8 ou plus récent installé sur votre ordinateur
- pip (généralement inclus avec Python)
- Git
- Virtualenv (pour créer un environnement virtuel)
Concepts fondamentaux
Workflow
Un workflow est une série d'étapes qui sont exécutées automatiquement. Par exemple, dans le cas de Django sur GitHub Actions, un workflow peut comprendre les étapes suivantes :
- Lancement du workflow : Lorsqu'un push se fait vers la branche principale.
- Chargement du code source : Le code source est téléchargé sur l'agent d'action.
- Création de l'environnement virtuel : Un environnement virtuel est créé pour installer les dépendances.
- Installation des dépendances : Les dépendances sont installées avec pip.
- Exécution des tests : Les tests sont exécutés pour s'assurer que le code fonctionne correctement.
- Déploiement (optionnel) : Si les tests passent, l'application peut être déployée sur un serveur.
Actions
Les actions sont des composants individuels qui effectuent une tâche spécifique dans un workflow. Par exemple :
actions/checkout@v2: Cette action permet de charger le code source du dépôt.actions/setup-python@v2: Cette action configure l'environnement Python.
Triggers
Les triggers définissent quand un workflow doit être lancé. Pour Django sur GitHub Actions, on pourrait utiliser des triggers comme :
on:
push:
branches: [ main ]
Cela signifie que le workflow sera lancé chaque fois qu'un commit est poussé sur la branche main.
Mise en pratique : projet fil rouge
Nous allons créer un mini-projet Django simple, qui sera un gestionnaire de tâches basique. Le projet comprendra :
- Un modèle pour les tâches.
- Une vue pour afficher et ajouter des tâches.
- Un template HTML pour l'affichage des tâches.
Étape 1 : Création du dépôt sur GitHub
- Connectez-vous à votre compte GitHub.
- Cliquez sur le bouton "New" pour créer un nouveau dépôt.
- Nommez-le
django-todo.
Étape 2 : Clôture et création de l'environnement virtuel
git clone https://github.com/votre_nom_utilisateur/django-todo.git
cd django-todo
virtualenv venv
source venv/bin/activate # Sous Windows, utilisez `venv\Scripts\activate`
Étape 3 : Initialisation du projet Django
pip install django
django-admin startproject todo .
touch .gitignore
echo "venv/" >> .gitignore
Ajoutez les fichiers suivants au répertoire todo :
settings.py: Configurez la base de données SQLite.urls.py: Ajoutez une URL pour l'accueil du site.views.py: Créez une vue pour afficher les tâches.
Étape 4 : Création d'un modèle et des vues
Créez un fichier models.py dans le répertoire todo :
from django.db import models
class Task(models.Model):
title = models.CharField(max_length=200)
completed = models.BooleanField(default=False)
def __str__(self):
return self.title
Créez un fichier views.py dans le répertoire todo :
from django.shortcuts import render, redirect
from .models import Task
def index(request):
tasks = Task.objects.all()
return render(request, 'index.html', {'tasks': tasks})
def add_task(request):
if request.method == 'POST':
title = request.POST.get('title')
task = Task(title=title)
task.save()
return redirect('index')
return render(request, 'add_task.html')
Créez un fichier urls.py dans le répertoire todo :
from django.urls import path
from .views import index, add_task
urlpatterns = [
path('', index, name='index'),
path('add/', add_task, name='add_task'),
]
Étape 5 : Création des templates HTML
Créez un répertoire templates dans le répertoire todo, puis créez les fichiers suivants :
index.htmladd_task.html
Fichier index.html :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Todo List</title>
</head>
<body>
<h1>Todo List</h1>
<ul>
{% for task in tasks %}
<li>task.title - task.completed</li>
{% endfor %}
</ul>
<a href="{% url 'add_task' %}">Add Task</a>
</body>
</html>
Fichier add_task.html :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Add Task</title>
</head>
<body>
<h1>Add Task</h1>
<form method="POST">
{% csrf_token %}
<input type="text" name="title" placeholder="Task Title" required>
<button type="submit">Add</button>
</form>
<a href="{% url 'index' %}">Back to List</a>
</body>
</html>
Étape 6 : Configuration de la base de données
Dans settings.py, configurez la base de données :
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
Étape 7 : Migrations et serveur
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
Accédez à http://127.0.0.1:8000/ pour voir l'application en action.
Erreurs frequentes et debugging
Erreur 1 : Le serveur ne démarre pas
Code incorrect :
python manage.py runserver
Correction :
Certains environnements peuvent avoir des problèmes avec les versions de Python installées. Essayez de spécifier une version particulière :
python3.8 -m django runserver
Erreur 2 : Les tests échouent
Code incorrect :
python manage.py test
Correction :
Vérifiez que tous les fichiers de test sont correctement importés et configurés. Assurez-vous que le modèle est correctement défini et que la vue retourne les données attendues.
Erreur 3 : Le déploiement échoue
Code incorrect :
## .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.8
uses: actions/setup-python@v2
with:
python-version: '3.8'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: python manage.py test
Correction :
Assurez-vous que les dépendances nécessaires sont mentionnées dans requirements.txt. Si vous utilisez des services de déploiement, vérifiez les paramètres et la configuration.
Pour aller plus loin
- Tests fonctionnels avec Selenium : Ajoutez des tests fonctionnels pour simuler l'interaction utilisateur.
- Déploiement sur Heroku : Configurez un pipeline GitHub Actions pour déployer votre application Django sur Heroku.
- Intégration avec Docker : Utilisez Docker pour créer une image conteneurisée de votre application.
Défi pratique
Implémentez une fonctionnalité supplémentaire à votre gestionnaire de tâches, par exemple :
- Une fonction pour marquer les tâches comme terminées.
- Un système d'authentification utilisateurs.