Le dépôt n'avait aucun test, aucun linter, aucune vérification de types. Outillage - ESLint 9 (flat config) sur api + les deux frontends, Ruff sur le Python - tsc --checkJs sur l'API (pas de TypeScript, juste la vérification) - Vitest : 401 tests JS ; pytest : 43 tests Python - Tests de mutation (Stryker), deux profils : logique pure et API complète - Hook pre-push `npm run check` (~17 s) — le déploiement Coolify est sur webhook, c'est donc la seule porte de qualité avant la mise en ligne - Workflow Forgejo Actions prêt (inerte tant qu'aucun runner n'est enregistré) Sécurité - Injection SQL authentifiée dans resolve-conflict : `field` était interpolé dans le SET sans allowlist - timingSafeEqual levait sur un jeton multi-octets (500 au lieu de 401) - setErrorHandler écrasait tous les 4xx en 500 - .env.example : ADMIN_JWT_SECRET et ADMIN_SEED_* n'étaient documentés nulle part alors que leur absence casse toute connexion admin Annulation réelle des crawl_run (migration 014) - L'API posait status='error' sans que le crawler en sache rien : le process continuait, et son UPDATE final ne matchait plus (run réussi affiché en erreur) - Protocole coopératif : drapeau cancel_requested lu à chaque lot, le crawler écrit lui-même status='cancelled' Cohérence géographique (migration 014) - Le trigger 013 supprimait les band_locations sans purger le point dénormalisé - L'édition admin de lat/lon n'atteignait jamais band_locations : la carte ignorait la correction. Override step_order = -1, dans une transaction Corrections - limit/offset NaN → 500 au lieu de 400 - OPTIONS sans `return reply` (Fastify poursuivait le cycle de vie) - listen() sans catch, cast ::text en dur sur les colonnes numériques - /admin/api/logs ne renvoyait pas sa pagination - a11y : sélecteur de langue annoncé comme liste vide (role=option manquant) Nettoyage - apps/web/quizz-site supprimé (sans rapport avec le projet) - Code mort : openModal(), LANG_NAMES, double import, variables inutilisées - .dockerignore ajoutés ; node_modules racine n'était pas gitignoré Co-Authored-By: Claude <noreply@anthropic.com>
75 lines
2.1 KiB
YAML
75 lines
2.1 KiB
YAML
# CI informative.
|
|
#
|
|
# Le déploiement reste piloté par le webhook Coolify (push → redeploy), CE
|
|
# WORKFLOW NE BLOQUE RIEN : il marque simplement le commit vert ou rouge dans
|
|
# Forgejo. La vraie porte de qualité est le hook `.githooks/pre-push` côté
|
|
# poste de dev (voir README-CI.md).
|
|
#
|
|
# ⚠ Prérequis : un runner Forgejo Actions (act_runner) enregistré sur le VPS.
|
|
# Sans runner, ce fichier est inerte — aucun job ne démarre et aucun statut
|
|
# n'apparaît. C'est le cas aujourd'hui : ce workflow est là pour le jour où
|
|
# un runner sera ajouté.
|
|
name: CI
|
|
|
|
on:
|
|
push:
|
|
branches: [dev, main]
|
|
pull_request:
|
|
branches: [dev, main]
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
javascript:
|
|
runs-on: docker
|
|
container:
|
|
image: node:22-alpine
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Installer les dépendances
|
|
run: npm ci
|
|
|
|
- name: ESLint
|
|
run: npm run lint
|
|
|
|
- name: Vérification de types (tsc --checkJs)
|
|
run: npm run typecheck
|
|
|
|
- name: Tests unitaires + a11y
|
|
run: npm run test
|
|
|
|
- name: Audit des dépendances
|
|
run: npm run audit:js
|
|
continue-on-error: true # informatif : ne doit pas masquer un échec de test
|
|
|
|
python:
|
|
runs-on: docker
|
|
container:
|
|
image: python:3.12-slim
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Installer l'outillage
|
|
run: pip install --no-cache-dir ruff pytest pip-audit
|
|
|
|
- name: Ruff (lint + règles de sécurité bandit)
|
|
run: ruff check .
|
|
|
|
- name: Tests du parseur de géocodage
|
|
run: cd apps/geocoder && python -m pytest tests -q
|
|
|
|
- name: Audit des dépendances
|
|
run: pip-audit -r apps/crawler/requirements.txt -r apps/geocoder/requirements.txt
|
|
continue-on-error: true
|
|
|
|
# Les tests de mutation prennent ~1 min : trop lents pour chaque push, mais
|
|
# utiles en revue. Déclenchement manuel uniquement.
|
|
mutation:
|
|
runs-on: docker
|
|
container:
|
|
image: node:22-alpine
|
|
if: github.event_name == 'workflow_dispatch'
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- run: npm ci
|
|
- run: npm run test:mutation
|