Passer la QA avant un merge

Ce guide liste dans l'ordre exact toutes les vérifications à effectuer avant d'ouvrir ou de merger une pull request dans gitrust.

Pourquoi cette checklist existe

Gitrust vise la conformité ANSSI PA-074. Chaque gate protège contre une catégorie spécifique de régressions : qualité de code, sécurité mémoire, vulnérabilités de dépendances, ou comportement utilisateur. Aucun gate ne peut être ignoré sauf exception documentée dans la PR.

Ordre d'exécution local

Exécutez les gates dans cet ordre — un gate qui échoue bloque les suivants.

Gate 1 — Formatage

cargo fmt --all -- --check

En cas de diff : appliquez le format, puis relancez --check.

cargo fmt --all
cargo fmt --all -- --check   # doit maintenant retourner 0

Sortie attendue (succès) :

(aucune sortie — code de retour 0)

Gate 2 — Linting (zéro warning)

cargo clippy --workspace -- -D warnings

Sortie attendue :

    Finished `dev` profile [unoptimized + debuginfo] target(s) in Xs

Aucun warning: ne doit apparaître. Les warnings sont traités comme des erreurs (-D warnings).

Lints Rust obligatoires (déjà configurés dans lib.rs de chaque crate) :

#![forbid(unsafe_code)]          // crates core, web, hooks
#![deny(clippy::unwrap_used)]
#![deny(clippy::expect_used)]
#![deny(clippy::panic)]
#![deny(clippy::indexing_slicing)]
#![deny(clippy::mem_forget)]

Gate 3 — Tests unitaires et d'intégration

cargo test --workspace

Sortie attendue :

test result: ok. XXX passed; 0 failed; 0 ignored; 0 measured

Règles de test : - Tests sur vraie DB (pas de mocks pour la couche persistance). - Tests négatifs obligatoires : pour chaque chemin heureux, un test couvre l'accès non authentifié, l'input invalide, et la ressource inexistante. - Pas de sleep() dans les tests — utilisez retry/poll avec timeout. - Chaque test crée ses propres données (pas de dépendance sur l'ordre d'exécution).

Gate 4 — Tests E2E Playwright (si UI modifiée)

À exécuter si vous avez modifié des templates, routes SSR, ou le comportement des pages :

npm run test:e2e

Les tests E2E se trouvent dans tests/e2e/. Sortie attendue :

  XX passed (Xs)

En cas d'échec : consultez tests/e2e/reports/ pour les captures d'écran et traces.

Gate 5 — Rebuild CSS (si templates modifiés)

À exécuter si vous avez modifié un fichier dans templates/ ou ajouté des classes Tailwind :

npx tailwindcss -i static/css/input.css -o static/css/style.css --minify

Commitez le fichier static/css/style.css généré dans votre PR.

Gate 6 — Audit des dépendances

cargo audit

Sortie attendue :

    Fetching advisory database from `https://github.com/RustSec/advisory-db.git`
    Scanning Cargo.lock for vulnerabilities (X crates)
0 vulnerabilities found

En cas de vulnérabilité : mettez à jour la dépendance concernée ou ajoutez une exemption documentée dans deny.toml.

Gate 7 — Licences et dépendances bannies

cargo deny check

Sortie attendue :

    Checking advisories
    Checking bans
    Checking licenses
    Checking sources

Aucune violation ne doit apparaître. Gitrust interdit les licences GPL et AGPL dans les dépendances de production.

Checklist sécurité (features touchant auth/secrets/permissions)

Pour tout changement touchant l'authentification, les tokens, les permissions ou les secrets :

  • [ ] Secrets jamais en clair en base — hash SHA-256 ou bcrypt systématique.
  • [ ] Secrets jamais loggés — vérifiez tracing::info/debug, Display et Debug impls.
  • [ ] Comparaison en temps constant — subtle::ConstantTimeEq pour la validation de secrets (pas de ==).
  • [ ] Rate limiting présent sur les endpoints d'authentification.
  • [ ] Token CSRF sur tous les formulaires POST/PUT/DELETE.
  • [ ] Vérification d'ownership côté serveur (anti-IDOR) — user_id vérifié sur chaque ressource accédée.
  • [ ] Expiration obligatoire sur tout token ou session.
  • [ ] Zeroize — les types contenant des secrets implémentent Zeroize/ZeroizeOnDrop.
  • [ ] Path traversal — validation des chemins disque (pas de .., /, \ dans les slugs).

Checklist pre-merge finale

  • [ ] Gate 1 : cargo fmt --all -- --check → 0 diff
  • [ ] Gate 2 : cargo clippy --workspace -- -D warnings → 0 warning
  • [ ] Gate 3 : cargo test --workspace → 0 échec
  • [ ] Gate 4 : npm run test:e2e → 0 échec (si UI modifiée)
  • [ ] Gate 5 : CSS rebuild commité (si templates modifiés)
  • [ ] Gate 6 : cargo audit → 0 vulnérabilité
  • [ ] Gate 7 : cargo deny check → 0 violation
  • [ ] Aucun secret en clair dans le diff (git diff --staged | grep -i "password\|secret\|token\|key")
  • [ ] Aucune modification dans crates/rustwarden-core/ (framework read-only)
  • [ ] Checklist sécurité §ci-dessus validée (si applicable)

Vérification des secrets dans le diff

Avant tout commit, scannez votre diff :

git diff --staged | grep -iE "(password|secret|token|api_key|private_key)\s*=" | grep -v "test\|example\|dummy\|placeholder"

Si la commande retourne des lignes, examinez-les une par une pour confirmer qu'il ne s'agit pas de vraies valeurs sensibles.

Voir aussi