Site personnel de Hicham ATATRI, professeur agrégé d'informatique en CPGE. Transmettre le savoir, former les ingénieurs de demain.
🌐 https://hatatri.github.io · 🗂️ Projets · 🗓️ Chronologie · 📰 Flux RSS
- Structure du dépôt
- Fonctionnement du workflow
- Ajouter un projet
- Vérifier le site en local
- Mise en route (une seule fois)
- Dépannage
.
├── _config.yml Configuration Jekyll (thème Cayman, collection projects, plugins)
├── _data/
│ ├── repositories.yml ★ Liste des projets validés (source de vérité unique)
│ └── categories.yml Catégories (id, libellé, emoji, description)
├── _includes/
│ ├── nav.html Menu de navigation
│ ├── repo-card.html Carte d'un projet (badges, tags, date, liens)
│ └── date-fr.html Formatage des dates en français
├── _layouts/
│ ├── default.html Layout Cayman surchargé (français, menu, RSS, favicon)
│ └── project.html Page détaillée d'un projet
├── _projects/ Pages détaillées facultatives (<slug>.md)
├── projets/
│ ├── index.md /projets/ : statistiques, filtres, cartes
│ ├── chronologie.md /projets/chronologie/ : timeline par mois
│ └── feed.xml /projets/feed.xml : flux RSS des nouveaux projets
├── assets/
│ ├── css/style.scss Styles du thème + personnalisations
│ ├── js/projects.js Filtres (recherche, catégorie, tags) — URL partageable
│ └── favicon.svg
├── scripts/
│ ├── validate_data.py Validation YAML + schéma des données (utilisé par la CI)
│ ├── add_repository.py Ajout d'un dépôt à partir de l'API GitHub
│ └── requirements.txt Dépendances Python (PyYAML, html5validator)
├── .github/
│ ├── workflows/deploy-pages.yml Build + tests + déploiement
│ ├── workflows/add-repository.yml Ajout automatique d'un projet validé
│ ├── ISSUE_TEMPLATE/nouveau-projet.yml Formulaire « Proposer un projet »
│ └── dependabot.yml Mises à jour des actions, gems et paquets pip
├── index.md Page d'accueil (la section « Projets » lit _data/repositories.yml)
├── Gemfile / Gemfile.lock Environnement Ruby identique à GitHub Pages + HTMLProofer
├── assets/img/hicham-atatri.jpg Photo de profil (480×480)
├── cv.pdf CV téléchargeable
└── README.md Ce fichier (exclu du site)
Fichier : .github/workflows/deploy-pages.yml
push sur main ─┐
pull request ──┼──► validate ──► build ──► test ──► deploy ──► https://hatatri.github.io
manuel ────────┘ (YAML) (Jekyll) (HTML, (main
liens) uniquement)
| Job | Rôle | Détails |
|---|---|---|
| validate | Refuse les données incorrectes avant le build | scripts/validate_data.py : syntaxe YAML de _config.yml, _data/, .github/ et des front matter ; schéma de repositories.yml (champs obligatoires, slug unique, date valide et non future, catégorie connue, URL https://, tags…). actionlint vérifie les workflows. Les erreurs apparaissent en annotations sur la PR. |
| build | Construit le site | actions/configure-pages@v5 + actions/jekyll-build-pages@v1 (mêmes versions que GitHub Pages), puis actions/upload-pages-artifact. |
| test | Contrôle qualité du site généré | Validation HTML5/CSS par le Nu Html Checker (W3C) et vérification des liens internes, ancres, images, scripts, favicon et Open Graph par HTMLProofer. Les deux contrôles tournent même si l'un échoue. |
| deploy | Publie le site | actions/deploy-pages@v4, environnement github-pages, uniquement sur main (jamais pour une PR). |
Bonnes pratiques mises en œuvre
- Permissions minimales : lecture seule par défaut ;
pages: writeetid-token: writeuniquement pour le jobdeploy. - Concurrence : une PR mise à jour annule son run précédent ; sur
main, les runs sont mis en file et un déploiement en cours n'est jamais interrompu (group: pages-deploy). - Un seul build : le job
testcontrôle exactement l'artefact qui sera déployé. - Cache : gems via
ruby/setup-ruby(bundler-cache: true, groupe:testuniquement) et paquets Python viaactions/setup-python(cache: pip). - Rapports : chaque job écrit un résumé (onglet Summary du run) ; en cas d'échec les dernières lignes des logs y sont affichées et les rapports complets sont archivés (artefact
rapports-qualite, 14 jours). - Logs détaillés : lancer le workflow manuellement en cochant verbose, ou Re-run jobs ▸ Enable debug logging.
- Dependabot maintient les versions des actions, des gems et des paquets pip.
Toutes les pages (Projets, Chronologie, RSS, statistiques, section « Projets » de l'accueil) sont générées à partir de _data/repositories.yml. Ajouter un projet = ajouter une entrée dans ce fichier. Trois méthodes :
- Onglet Actions ▸ Ajouter un projet ▸ Run workflow.
- Saisir le dépôt (
Hatatri/mon-depot), la catégorie, éventuellement les tags et « Afficher sur la page d'accueil ». - Le workflow lit le nom, la description, le langage, le site web et les topics via l'API GitHub, ajoute l'entrée, la valide, commite sur
mainet lance le déploiement. Le projet est en ligne en 2 à 3 minutes.
- Quiconque remplit le formulaire Proposer un projet (lien aussi présent en bas de la page Projets).
- Pour valider, le propriétaire du dépôt pose le label
validésur l'issue. - Le workflow ajoute le projet, déploie le site, commente et ferme l'issue. En cas d'erreur (dépôt privé, introuvable, déjà présent…), il commente l'issue avec le lien du log.
Seul le propriétaire (
Hatatri) peut déclencher l'ajout : un label posé par un autre compte est ignoré.
Ajouter un bloc à la fin de _data/repositories.yml :
- slug: jumeau-numerique-bananeraie # unique, minuscules et tirets
name: Jumeau numérique d'une bananeraie
description: Modèle et capteurs pour suivre l'irrigation et la croissance des bananiers.
category: recherche # id de _data/categories.yml
repo: Hatatri/jumeau-numerique-bananeraie
homepage: https://exemple.org # facultatif
language: Python # facultatif (alimente les statistiques)
tags: [digital-twin, agriculture, iot] # facultatif
added: 2026-10-10 # date d'ajout, AAAA-MM-JJ sans guillemets
status: en-developpement # actif | en-developpement | archive
featured: true # facultatif : visible sur l'accueilOu, en ligne de commande (métadonnées lues sur GitHub) :
pip install -r scripts/requirements.txt
python3 scripts/add_repository.py Hatatri/mon-depot --category enseignement --tags python,cpge --dry-run # aperçu
python3 scripts/add_repository.py Hatatri/mon-depot --category enseignement --tags python,cpge
python3 scripts/validate_data.py
git add _data/repositories.yml && git commit -m "Ajouter le projet mon-depot" && git pushPage détaillée (facultatif) : créer _projects/<slug>.md avec un title dans le front matter et un texte libre en Markdown ; la carte du projet pointera alors vers /projets/<slug>/. Exemple : _projects/mp-psi-algorithmique.md.
Nouvelle catégorie : l'ajouter dans _data/categories.yml et dans les listes options de .github/workflows/add-repository.yml et .github/ISSUE_TEMPLATE/nouveau-projet.yml (le validateur signale tout oubli).
Prérequis : Ruby 3.x (ruby -v), Bundler, Python 3 ; Java 11+ pour la validation HTML.
# 1. Installer l'environnement identique à GitHub Pages (une fois)
bundle config set --local path vendor/bundle
bundle install
# 2. Aperçu avec rechargement automatique → http://localhost:4000
bundle exec jekyll serve --livereload
# 3. Reproduire les contrôles de la CI
pip install -r scripts/requirements.txt
python3 scripts/validate_data.py # données
bundle exec jekyll build # build
html5validator --root _site --also-check-css # HTML/CSS
bundle exec htmlproofer _site --disable-external --no-enforce-https # liens internesSous Windows, utiliser RubyInstaller (avec DevKit) ou WSL.
- Settings ▸ Pages ▸ Build and deployment ▸ Source : « GitHub Actions » (sinon l'ancien build automatique continue de publier le site sans les contrôles).
- Settings ▸ Actions ▸ General ▸ Workflow permissions : laisser « Read repository contents » ; les droits nécessaires sont déclarés dans chaque workflow.
- Issues ▸ Labels : créer les labels
nouveau-projetetvalidé. - Fusionner la branche dans
main: le premier déploiement démarre automatiquement (onglet Actions). - Si
mainest protégée par une règle exigeant une PR, autorisergithub-actions[bot]à pousser, ou utiliser la méthode 3.
| Symptôme | Cause probable / solution |
|---|---|
| Job validate rouge | Lire le résumé du run : fichier, ligne et champ fautif sont indiqués. Reproduire avec python3 scripts/validate_data.py. |
| Job test rouge, Nu Html Checker | HTML invalide (balise mal fermée, attribut interdit, espace dans une URL…). Le log indique fichier, ligne et colonne. |
| Job test rouge, HTMLProofer | Lien interne vers une page/ancre inexistante, image manquante, alt absent. Corriger le lien ou le slug. |
| Job deploy : « Ensure GitHub Pages has been enabled » | Étape 1 de la mise en route non effectuée. |
| Ajout automatique : « dépôt introuvable » | Dépôt privé ou faute de frappe dans propriétaire/nom. |
| Badges des cartes vides | Les badges sont servis par shields.io ; ils s'affichent dès que le dépôt est public. |
© Hicham ATATRI — tous droits réservés (texte, photo et CV).