J7 — Contribuer
Vérifié contre le produit le .
L’objectif du jour : une première contribution qui passe le pipeline du premier coup — et savoir lire le pipeline quand elle ne passe pas.
| Durée réaliste | une journée, contribution comprise |
| Prérequis | J1 (l’environnement) et J3 (savoir où va votre changement) |
Les commandes, dans l’ordre de la CI
Section intitulée « Les commandes, dans l’ordre de la CI »C’est le même ordre, et ce n’est pas un hasard : le reproduire en local vous évite d’apprendre l’échec sur GitHub.
bun run lint # Biomebun run typecheck # TypeScript, sur tout le workspacebun run build # AVANT les tests — voir plus basbun run test # Vitest côté TS, Gradle côté solveurDeux commandes de plus, que la CI ne joue pas :
| Commande | Ce qu’elle fait | Quand la lancer |
|---|---|---|
bun run format |
Biome, en écriture — corrige au lieu de signaler | avant de committer |
bun run test:contract |
l’équivalence de scoring entre le moteur TypeScript et le solveur JVM | dès que vous touchez à une contrainte ou au contrat de solve |
test:contract n’est dans aucun job de la CI. Si votre changement touche au scoring, cette
vérification n’existe que si vous la lancez.
Ce que la CI exécute vraiment
Section intitulée « Ce que la CI exécute vraiment »Deux jobs dans .github/workflows/ci.yml, et le second attend le premier.
verify—lint,typecheck,build,test, avec PostgreSQL et Redis démarrés en services, aux mêmes images et aux mêmes identifiants quedocker-compose.yml.lighthouse— construit tout le dépôt, puis mesure le site vitrine. Il est bloquant : une story de section qui dégrade la performance du site marketing ne peut pas être fusionnée. Ce n’est pas un rapport décoratif.
Les quatre choses que ce fichier sait et que vous ignorez
Section intitulée « Les quatre choses que ce fichier sait et que vous ignorez »Elles sont écrites en commentaires dans ci.yml — les voici en clair, parce qu’elles ont chacune
coûté du temps à quelqu’un.
1. Les suites de bout en bout d’apps/api se sautent d’elles-mêmes. Chaque test commence par
if (!pgUp) return ctx.skip(). La convention garde bun run test utilisable sans Docker, mais
elle a un jour réduit la CI à des tests unitaires — quelque 277 vérifications, tous les chemins
HTTP, toutes les isolations RLS, les workers d’import et de solve — en rapportant vert. D’où
les services déclarés dans le job.
2. Le rôle beemyschool_app n’est pas provisionné en CI, volontairement. Chaque suite crée sa
propre base et joue migrateDb(), dont la migration 0000 crée ce rôle. Le provisionner une
seconde fois dans le workflow, c’est le laisser diverger de la migration.
3. build passe avant test. Les gardes du site vitrine lisent dist/ : elles vérifient ce
qui a été émis, pas ce que les sources ont l’intention d’émettre. Sans build préalable, elles
se sautent en silence et l’étape passe en ne vérifiant rien.
4. Lighthouse tourne après verify, jamais avant. Mesurer une build qui ne compile pas ne
vaut rien, et une exécution de Chrome coûte une minute.
Les conventions
Section intitulée « Les conventions »- Le code est en anglais — noms, commentaires, messages de commit. Le contenu est en français — l’interface, la documentation, ce site.
- Bun, jamais npm ni pnpm. Biome, jamais ESLint ni Prettier. Les deux règles se lisent
dans le dépôt :
bun.lockd’un côté,biome.jsonde l’autre. - La documentation part dans la même pull request que la fonctionnalité. Une page de ce site qui décrit un écran doit bouger quand l’écran bouge ; livrée plus tard, elle ne l’est jamais.
- Ce qui touche
docs/reste dansdocs/. Le dossier porte la documentation de conception — contrats, décisions, spécifications. Ce site porte l’usage. On lie, on ne duplique pas.
Le gabarit de pull request
Section intitulée « Le gabarit de pull request ».github/pull_request_template.md se remplit tout seul dans la description de votre PR. Dix
lignes, dont la seule qui compte vraiment : la case documentation, avec ses trois issues.
- mise à jour dans cette PR — les pages concernées ;
- pas nécessaire, parce que… — une réponse parfaitement légitime, à condition de dire pourquoi ;
- suivie par une story — avec sa référence.
Trois cases plutôt qu’une, parce qu’une case unique se coche par réflexe. Le gabarit est un aide-mémoire, pas un contrôle : ce qu’il empêche, c’est qu’un écran change sans que la page qui le décrit bouge — après quoi le site ment, et personne ne s’en aperçoit avant un client.
Le dépôt n’a pas de CONTRIBUTING.md : le reste des conventions vit dans les revues, et ici.
Votre première contribution
Section intitulée « Votre première contribution »Une contribution réaliste et complète, qui traverse la chaîne sans être risquée : ajouter un champ optionnel à un contrat existant et le faire remonter jusqu’à l’écran — l’exercice de J5.
Elle a le mérite de toucher tout ce qui compte : un schéma partagé, une migration, un DTO, la chaîne OpenAPI, le client généré, un écran, et les tests des deux côtés. Si elle passe, vous savez livrer.
Avant de pousser :
bun run format && bun run lint && bun run typecheck && bun run build && bun run testLe piège du jour
Section intitulée « Le piège du jour »Ce qui doit exister à la fin de la journée
Section intitulée « Ce qui doit exister à la fin de la journée »- Les cinq commandes passent en local, dans l’ordre de la CI
- Vous savez quelles suites se sautent, et à quelle condition
- Vous savez que
test:contractn’est joué par personne d’autre que vous - Votre première pull request est ouverte, documentation comprise
- Le job
verifyest vert, et le joblighthouseaussi
Et après
Section intitulée « Et après »Le parcours s’arrête ici, mais deux réflexes le prolongent.
Rejouez le produit du point de vue de l’utilisateur. Si vous n’avez pas encore fait le chemin de 2 heures, faites-le : placer un cours et lire une heatmap change la façon dont on lit le code du scoring.
Servez-vous de docs/. Les trente et un documents du dossier répondent aux « pourquoi » que
ce parcours a délibérément laissés de côté ; la page d’entrée
dit lequel ouvrir pour quelle question.