Skip to content

🔧 chore(ci): refonte CI — lint bloquant, cache Playwright, dédup coverage, déploiement docs#36

Merged
jefBinomed merged 10 commits into
developfrom
chore/step-16-ci
Jul 14, 2026
Merged

🔧 chore(ci): refonte CI — lint bloquant, cache Playwright, dédup coverage, déploiement docs#36
jefBinomed merged 10 commits into
developfrom
chore/step-16-ci

Conversation

@jefBinomed

@jefBinomed jefBinomed commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator

Résumé

Exécute l'étape 16 du plan d'amélioration (docs/improvements/step-16-ci.md).

  • CI (develop.yml) : job lint bloquant, cache Playwright (clé = version @playwright/test du lockfile), dédup coverage (le job coverage remplace unit-and-integration + web-components — chaque suite ne tourne plus qu'une fois par run), concurrency (annule les runs obsolètes), permissions/timeout-minutes sur chaque job, server-smoke corrigé (le || true masquant est retiré, vérifie le vrai contrat /socket.io/). Actions officielles montées à leur dernière version majeure (checkout v7, setup-node v6, cache v6, configure-pages v6, upload-pages-artifact v5, deploy-pages v5).
  • Docs API : jsdoc-to-markdown remplacé par TypeDoc + typedoc-plugin-markdown — jsdoc ne parse pas le TypeScript, jsdoc:build générait silencieusement 0 fichier depuis la migration. Bug additionnel corrigé au passage : docs:build écrivait docs-dist hors du repo (résolution --outDir relative au cwd, pas à docs-sources).
  • Déploiement docs : nouveau job docs-deploy sur push develop, après succès de toute la CI (needs), déploie sur GitHub Pages (activé sur TalkControl/talk-control, permissions pages: write/id-token: write scopées au job).
  • Release : nouveau workflow release.yml sur tag v* — build+test puis gh release create avec notes tirées du CHANGELOG (pas de publish npm).
  • Résidus corrigés : --legacy-peer-deps retiré de README.md (finalise IMP-004), URLs GitHub réalignées sur TalkControl/talk-control (l'org finale — origin pointait sur le fork sfeir-open-source, corrigé dans cette session avec develop poussé en fast-forward, 106 commits jamais publiés jusqu'alors).

Blocage infra découvert et levé (hors scope initial du plan)

TalkControl (l'organisation) avait allowed_actions: local_onlyaucune Action GitHub officielle ne pouvait s'exécuter sur aucun repo de l'org, avant cette PR. Confirmé en reproduisant le même startup_failure avec l'ancien develop.yml inchangé. Politique changée par un Owner vers « Allow TalkControl, and select non-TalkControl » + « Allow actions created by GitHub » (portée minimale : namespace actions/* uniquement, aucune action tierce). GitHub Pages activé sur ce repo (source = GitHub Actions).

Test plan

  • npx tsc --noEmit — 0 erreur
  • npm run lint / npm run lint:check — 0 erreur
  • NODE_ENV=test npm test — 392/392
  • npm run test:components — 35/35
  • npm run coverage — seuils tenus (93%/90.7%/86.5%/94.4% vs 80/90/70/80), gate testé défaillant avec un seuil artificiellement relevé (revert immédiat)
  • npm run build — OK
  • npm audit — 0 vulnérabilité (npm ci sans flag)
  • npm run test:e2e — 35/35
  • npm run docs:build — doc API non vide (179 pages TypeDoc)
  • Run CI réel sur GitHub Actions : lint bloquant ✅, cache Playwright actif (chromium download skippé sur le 2e run, confirmé via l'API des steps) ✅, coverage gate ✅, concurrency annule un run obsolète (29275092170cancelled au profit de 29275125106) ✅

🤖 Généré avec Claude Code

jsdoc-to-markdown ne parse pas le TypeScript (interfaces, generics, annotations
de type ne sont pas du JS valide) : jsdoc:build scannait des .js disparus
depuis la migration et générait silencieusement 0 fichier. TypeDoc +
typedoc-plugin-markdown gèrent le TS nativement.

docs:build écrivait aussi docs-dist HORS du repo : `vitepress build
docs-sources --outDir ../docs-dist` résout --outDir relatif au cwd du script
npm (racine du repo), pas à docs-sources — le build atterrissait donc dans le
répertoire parent du repo, jamais dans .gitignore ni déployable. Corrigé en
--outDir docs-dist.

docs-sources/developers/code/ (généré à chaque build) devient entièrement
gitignored, y compris index.md qui était committé par erreur.
…cy-peer-deps

origin pointait sur sfeir-open-source/talk-control (fork) alors que
TalkControl/talk-control est l'organisation finale (droits admin vérifiés) —
develop y a été poussé (fast-forward, 106 commits) dans le cadre de cette
étape. Réaligne badges, liens Issues/PR/fork et editLink VitePress sur
TalkControl/talk-control.

README.md:18 — finalise le retrait de --legacy-peer-deps commencé à l'étape 06
(IMP-004) : `npm install` seul suffit désormais.

Note : docs-sources/developers/index.md, users/index.md et index.md
contiennent encore des références sfeir-open-source noyées dans du contenu
pré-migration obsolète (Node 8, parcelJs, mocha/chai) — laissés en l'état,
hors scope (nécessite une réécriture de contenu, pas une simple URL).
…p, concurrency)

Constats de l'audit (docs/improvements/step-16-ci.md) tous confirmés sur l'état
actuel : pas de lint, 3× `playwright install --with-deps` sans cache, job
coverage qui ré-exécutait toutes les suites déjà lancées par
unit-and-integration + web-components, pas de concurrency/permissions/
timeout-minutes, server-smoke qui ne pouvait jamais échouer (`|| true`).

- Nouveau job `lint` → `npm run lint:check`, bloquant.
- Cache `~/.cache/ms-playwright` keyé sur la version de `@playwright/test` du
  lockfile (jobs coverage + e2e) : évite le téléchargement à froid du binaire
  chromium à chaque run, seul `install-deps` (apt, léger) reste nécessaire au
  cache hit.
- Dédup tests/coverage — option (a) retenue (cf. step-16-ci.md) : le job
  `coverage` (jsdom + browser + merge) remplace unit-and-integration et
  web-components. Chaque suite ne tourne plus qu'une fois par run au lieu de
  deux (jsdom/browser exécutés une fois nativement, une fois via coverage:*).
- Coverage gate vérifié réellement bloquant : testé en local avec un seuil
  `lines` artificiellement remonté à 99 → `ERROR: Coverage for lines (94.43%)
  does not meet global threshold (99%)`, exit 1 confirmé, seuils réels remis
  en place.
- `concurrency` (annule les runs obsolètes), `permissions: contents: read` au
  niveau workflow, `timeout-minutes` sur chaque job.
- `server-smoke` : retire le `|| true` masquant, vérifie le vrai contrat de
  `/socket.io/` (HTTP 400 + `Transport unknown` — /  répond 404, pas de route
  racine côté Express, testé en local).
- Nouveau job `docs-deploy` : build + déploie la doc VitePress sur GitHub
  Pages, uniquement sur push develop et après succès de tous les autres jobs
  (`needs`). Permissions minimales `pages: write` / `id-token: write`,
  scopées à ce job. GitHub Pages activé sur TalkControl/talk-control
  (source = GitHub Actions).
build + lint + test + build avant toute release (pas de tag cassé), puis
création d'une release GitHub via `gh release create` — notes extraites de la
section CHANGELOG.md correspondante, fallback sur --generate-notes si absente.
Pas de publish npm : le projet n'est pas une lib (cf. étape 02).
Dédup coverage (option a) et remplacement jsdoc-to-markdown → TypeDoc tracés
dans decisions.md. Étape 16 laissée ⬜ dans le README du plan jusqu'à
l'observation d'un run CI réel (PR #36) — le blocage org GitHub Actions
(allowed_actions=local_only, débloqué en cours de session) empêchait toute
exécution jusqu'ici.
…ajeure

Le premier run réel sur TalkControl/talk-control (PR #36) montre des
avertissements de dépréciation : checkout@v4/setup-node@v4 ciblent Node 20
(déprécié), forcés sur Node 24 par GitHub. Monte checkout v4→v7, setup-node
v4→v6, cache v4→v6, configure-pages v5→v6, upload-pages-artifact v3→v5,
deploy-pages v4→v5 (dernières versions majeures disponibles).
…locage org, coverage gate)

Documente le blocage allowed_actions=local_only découvert au niveau
organisation TalkControl (aucune CI n'avait jamais pu tourner), les durées du
premier run réel (PR #36), et la vérification en local que le coverage gate
échoue réellement sur un seuil non tenu (test + revert immédiat).
Confirme via l'API GitHub Actions que le 2e run (même clé de cache) skip bien
le téléchargement chromium ("Install Playwright chromium (cold)" → skipped,
"cache hit" → success), avec un gain mesuré (~7s sur coverage et e2e).
…ons réelles

Confirme via l'API GitHub Actions que cancel-in-progress annule bien le run
devenu obsolète (29275092170 → cancelled) au profit du plus récent
(29275125106 → succès), déclenché par un 2e push pendant que le 1er tournait
encore. Toutes les validations de l'étape 16 sont désormais faites en
conditions réelles (run CI GitHub Actions), pas seulement en lecture de YAML.
@jefBinomed
jefBinomed merged commit fa09ff3 into develop Jul 14, 2026
7 checks passed
@jefBinomed
jefBinomed deleted the chore/step-16-ci branch July 14, 2026 08:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant