Stack qualité CI (MegaLinter, Trivy, ESLint) et purge du backlog lint web
Some checks failed
Qualité & Sécurité / MegaLinter (PMD · Ruff · Bandit · gitleaks · hadolint) (push) Successful in 1m9s
Build & Push Images / build (brain) (push) Successful in 1m10s
Qualité & Sécurité / Trivy (CVE dépendances Maven / pip / npm) (push) Failing after 2m36s
Build & Push Images / build (web) (push) Successful in 1m48s
Build & Push Images / build-switcher (push) Successful in 20s
Build & Push Images / build (core) (push) Successful in 3m9s
Qualité & Sécurité / Web (ESLint · angular-eslint + sonarjs) (push) Successful in 38s

CI (Gitea Actions) :
- Nouveau workflow quality.yml (séparé de ci.yml, non bloquant pour la release) :
  MegaLinter v9 (PMD, Ruff, Bandit, gitleaks, hadolint), ng lint (web) et
  Trivy (CVE des dépendances Maven/pip/npm), sur main + beta + PR
- Trivy : préchargement du cache Maven avant le scan — sans ça Maven Central
  rate-limite l'IP du runner (429) en résolvant les BOMs du parent Spring Boot
- upload-artifact v4 → v3 : l'API artifacts v4 n'est pas supportée par Gitea
  (corrige aussi l'upload du rapport Playwright de e2e.yml, cassé depuis toujours)
- Ruleset PMD projet (java-pmd-ruleset.xml, auto-détecté par MegaLinter) orienté
  bugs réels, sans le style Lombok-hostile du défaut : 11 337 → 65 findings ;
  PMD en mode rapport (JAVA_PMD_DISABLE_ERRORS) le temps de purger ce backlog

Web :
- angular-eslint 21 + eslint-plugin-sonarjs : les règles Sonar vivent désormais
  dans ESLint (config web/eslint.config.js, réglages justifiés en commentaire)
- tsconfig : skipLibCheck + types:[] + node_modules ré-exclu — répare les builds
  desktop Windows/Linux cassés par le conflit @types/eslint-scope vs ESLint 9
- Purge du backlog lint : 114 erreurs → 0 sur 66 fichiers (ngOnDestroy vides
  supprimés, any typés avec les vrais DTOs, outputs (close) → (closed), regex
  super-linéaires désamorcées, ternaires/fonctions imbriqués dépliés, intention
  documentée sur les catch/error volontairement vides)
- Bug latent corrigé au passage : license.service.disconnect() émettait
  undefined au lieu de true en cas de succès (masqué par un double cast)
This commit is contained in:
2026-07-07 01:05:00 +02:00
parent 3e9e828225
commit 42c4b53ced
71 changed files with 353 additions and 276 deletions

73
java-pmd-ruleset.xml Normal file
View File

@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<ruleset xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="LoreMind"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
<description>
Ruleset PMD LoreMind — détecté automatiquement par MegaLinter (JAVA_PMD).
Philosophie : bugs et pièges réels uniquement. Les catégories de STYLE
(codestyle/design/documentation) sont exclues : le défaut MegaLinter y
générait ~11 000 violations hors sujet (conventions incompatibles avec
l'idiome Lombok/slf4j/Spring du projet : champ `log`, DI constructeur…).
</description>
<!-- Bugs probables : null, equals/hashCode, ressources, casts douteux… -->
<rule ref="category/java/errorprone.xml">
<!-- Chaque littéral dupliqué = une violation : du bruit, pas un bug. -->
<exclude name="AvoidDuplicateLiterals"/>
<exclude name="AvoidLiteralsInIfCondition"/>
<!-- Entités JPA/DTO : pas de sérialisation Java native ici. -->
<exclude name="MissingSerialVersionUID"/>
<!-- `this.name = name` en DI/setters : idiome standard. -->
<exclude name="AvoidFieldNameMatchingMethodName"/>
<exclude name="AvoidFieldNameMatchingTypeName"/>
<!-- `while ((x = read()) != null)` : idiome de lecture standard. -->
<exclude name="AssignmentInOperand"/>
<!-- catch(Exception) best-effort : choix assumé du projet (imports,
exports, best-effort serveur) — pas un gate. -->
<exclude name="AvoidCatchingGenericException"/>
<!-- TODO backlog : réactiver et passer les toLowerCase/UpperCase en
Locale.ROOT (27 sites) — bug potentiel (locale turque) mais
changement de comportement à valider posément. -->
<exclude name="UseLocaleWithCaseConversions"/>
</rule>
<!-- Concurrence -->
<rule ref="category/java/multithreading.xml">
<!-- Règle d'époque J2EE : les threads sont légitimes (sidecar, SSE…). -->
<exclude name="DoNotUseThreads"/>
<!-- Flaguerait CHAQUE HashMap, y compris locales à une méthode (×135). -->
<exclude name="UseConcurrentHashMap"/>
</rule>
<!-- Performance (sans les micro-optimisations StringBuilder : le rendu
PDF/HTML fait des milliers d'appends, aucun n'est un point chaud). -->
<rule ref="category/java/performance.xml">
<exclude name="AvoidInstantiatingObjectsInLoops"/>
<exclude name="AppendCharacterWithChar"/>
<exclude name="ConsecutiveLiteralAppends"/>
<exclude name="ConsecutiveAppendsShouldReuse"/>
<exclude name="InsufficientStringBufferDeclaration"/>
</rule>
<!-- Sécurité -->
<rule ref="category/java/security.xml"/>
<!-- Bonnes pratiques (sous-ensemble non-style) -->
<rule ref="category/java/bestpractices.xml">
<!-- slf4j paramétré ({} + args) rend le guard inutile. -->
<exclude name="GuardLogStatement"/>
<!-- Les ports hexagonaux à méthode unique ne sont pas des lambdas. -->
<exclude name="ImplicitFunctionalInterface"/>
<!-- Déclarer List vs ArrayList : style, pas un bug. -->
<exclude name="LooseCoupling"/>
<!-- StringBuilder en champ : pattern builder assumé (export PDF). -->
<exclude name="AvoidStringBufferField"/>
<!-- Style de tests : à l'appréciation du projet, pas un gate. -->
<exclude name="UnitTestAssertionsShouldIncludeMessage"/>
<exclude name="UnitTestContainsTooManyAsserts"/>
<exclude name="UnitTestShouldIncludeAssert"/>
</rule>
</ruleset>