Skip to content

Commit 895d314

Browse files
authored
Merge pull request #69 from ebouchut/ci-test-pipeline
Add the CI test pipeline (GitHub Actions)
2 parents 892bc0d + 67a04ba commit 895d314

11 files changed

Lines changed: 633 additions & 2 deletions

.github/workflows/build.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
name: Build
2+
3+
# Verify that the project compiles on every PR and push.
4+
# One focused workflow per CI concern (build, test, lint) instead of a
5+
# monolithic ci.yml (see issue #49, closed as wontfix). Test compilation
6+
# and execution live in test.yml.
7+
8+
on:
9+
pull_request:
10+
branches: [dev]
11+
push:
12+
branches: [dev, main]
13+
14+
jobs:
15+
build:
16+
runs-on: ubuntu-latest
17+
steps:
18+
- uses: actions/checkout@v4
19+
- uses: actions/setup-java@v4
20+
with:
21+
distribution: temurin
22+
java-version: "21"
23+
cache: maven
24+
- name: Compile the project
25+
run: ./mvnw -B -ntp compile

.github/workflows/lint.yml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
name: Lint
2+
3+
# Code quality check (Checkstyle, Google ruleset) on every PR and push.
4+
# Deliberately non-blocking on day one for an existing codebase:
5+
# - checkstyle:checkstyle only generates a report, it never fails on violations
6+
# - continue-on-error keeps even setup errors from gating merges
7+
# The report is uploaded as a workflow artifact for review.
8+
# Tighten later: switch the goal to checkstyle:check and set
9+
# failOnViolation to true in pom.xml, then drop continue-on-error.
10+
11+
on:
12+
pull_request:
13+
branches: [dev]
14+
push:
15+
branches: [dev, main]
16+
17+
jobs:
18+
checkstyle:
19+
runs-on: ubuntu-latest
20+
continue-on-error: true
21+
steps:
22+
- uses: actions/checkout@v4
23+
- uses: actions/setup-java@v4
24+
with:
25+
distribution: temurin
26+
java-version: "21"
27+
cache: maven
28+
- name: Generate the Checkstyle report
29+
run: ./mvnw -B -ntp checkstyle:checkstyle
30+
- name: Upload the Checkstyle report
31+
if: always()
32+
uses: actions/upload-artifact@v4
33+
with:
34+
name: checkstyle-report
35+
path: target/checkstyle-result.xml

.github/workflows/test.yml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
name: Tests
2+
3+
# Run the test suite (Surefire, all *Test classes) on every PR and push.
4+
# Integration-style tests provision a real PostgreSQL via Testcontainers,
5+
# which uses the Docker daemon built into ubuntu-latest runners.
6+
# No .env file is needed: @ServiceConnection wires the datasource to the
7+
# container and the tests exclude the MongoDB autoconfiguration.
8+
9+
on:
10+
pull_request:
11+
branches: [dev]
12+
push:
13+
branches: [dev, main]
14+
15+
jobs:
16+
test:
17+
runs-on: ubuntu-latest
18+
steps:
19+
- uses: actions/checkout@v4
20+
- uses: actions/setup-java@v4
21+
with:
22+
distribution: temurin
23+
java-version: "21"
24+
cache: maven
25+
- name: Run the test suite
26+
run: ./mvnw -B -ntp test
27+
# JaCoCo is bound to the test phase, so the run above already
28+
# produced the coverage report (HTML and XML).
29+
- name: Upload the coverage report
30+
if: always()
31+
uses: actions/upload-artifact@v4
32+
with:
33+
name: jacoco-coverage-report
34+
path: target/site/jacoco/

GLOSSAIRE.md

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
# Glossaire
2+
3+
Définitions des termes métier et techniques utilisés dans le projet learn-dev.
4+
Pour les outils concrets et leurs versions, voir [docs/tech-stacks.md](docs/tech-stacks.md) ;
5+
pour l'articulation des composants, voir [ARCHITECTURE.md](ARCHITECTURE.md) ;
6+
pour la justification des décisions de conception, voir les [ADR](docs/adr/README.md).
7+
8+
> [!NOTE]
9+
> 🇬🇧 English version: [GLOSSARY.md](GLOSSARY.md).
10+
> Les deux fichiers sont la traduction l'un de l'autre : toute entrée ajoutée,
11+
> modifiée ou supprimée dans l'un doit l'être aussi dans l'autre.
12+
13+
## Termes métier
14+
15+
- **Archive (archiver)** — Dépublier un cours ou une leçon pour qu'il ne soit
16+
plus accessible aux étudiants, sans le supprimer.
17+
- **Course (cours)** — Une unité de contenu pédagogique appartenant à un
18+
formateur ; contient des leçons.
19+
- **Deactivate (désactiver)** — Neutraliser un compte (formateur ou étudiant,
20+
par exemple) pour qu'il ne puisse plus être utilisé, sans le supprimer.
21+
Voir aussi *compte désactivé*.
22+
- **Drop a course (abandonner un cours)** — Le retrait d'un étudiant d'un cours
23+
avant de l'avoir terminé.
24+
- **Enrollment (inscription)** — La relation qui lie un étudiant à un cours
25+
qu'il a rejoint.
26+
- **Lesson (leçon)** — Un élément de contenu individuel au sein d'un cours.
27+
- **Role (rôle)** — Un ensemble nommé de permissions accordées à un
28+
utilisateur. Les rôles fournis par défaut sont `STUDENT`, `INSTRUCTOR` et
29+
`ADMIN` ; `SUPERADMIN` est prévu (voir l'issue #65).
30+
31+
## Authentification et sécurité
32+
33+
- **Authority (autorité)** — Dans Spring Security, une permission unitaire
34+
détenue par un utilisateur authentifié. Les rôles sont représentés comme des
35+
autorités préfixées par `ROLE_` (le rôle `ADMIN` devient l'autorité
36+
`ROLE_ADMIN`).
37+
- **BCrypt** — Une fonction de hachage de mots de passe adaptative. Les mots de
38+
passe sont stockés sous forme de hachés BCrypt, jamais en clair.
39+
- **CSRF (Cross-Site Request Forgery)** — Une attaque qui pousse le navigateur
40+
d'un utilisateur connecté à soumettre une requête à son insu. Contrée par un
41+
jeton par formulaire (injecté par Thymeleaf) et l'attribut de cookie
42+
`SameSite`.
43+
- **Compte désactivé (disabled account)** — Un compte qui existe mais n'est pas
44+
autorisé à s'authentifier (issu du drapeau `is_active = false`). À distinguer
45+
d'un *compte verrouillé*.
46+
- **HttpOnly** — Un attribut de cookie qui masque le cookie au JavaScript côté
47+
client, ce qui limite le vol de session via XSS.
48+
- **IDOR (Insecure Direct Object Reference)** — Une faille de contrôle d'accès
49+
où un identifiant fourni par le client est utilisé sans vérification
50+
d'autorisation. Les clés primaires UUID des utilisateurs limitent
51+
l'énumération (voir [ADR-0003](docs/adr/0003-uuid-pk-for-users-bigint-elsewhere.md)).
52+
- **Compte verrouillé (locked account)** — Un compte temporairement empêché de
53+
s'authentifier (par exemple après trop d'échecs de connexion), issu du
54+
drapeau `is_locked`. À distinguer d'un *compte désactivé*.
55+
- **Principal** — L'entité actuellement authentifiée (en général l'utilisateur)
56+
dans un contexte de sécurité.
57+
- **SameSite** — Un attribut de cookie qui contrôle l'envoi du cookie par le
58+
navigateur sur les requêtes inter-sites. Positionné sur `Lax` ici comme
59+
défense en profondeur contre le CSRF.
60+
- **Secure (cookie)** — Un attribut de cookie qui restreint le cookie au HTTPS.
61+
Activé seulement lorsque l'application sera servie en TLS.
62+
- **Session (côté serveur)** — L'état d'authentification conservé sur le
63+
serveur et référencé par un cookie de session (`JSESSIONID`), plutôt qu'un
64+
jeton autoporteur (voir [ADR-0001](docs/adr/0001-use-server-side-sessions-over-jwt.md)).
65+
- **XSS (Cross-Site Scripting)** — L'injection de scripts malveillants dans des
66+
pages vues par d'autres utilisateurs. Limitée par l'échappement automatique
67+
de Thymeleaf et par `HttpOnly`.
68+
69+
## Persistance et modélisation des données
70+
71+
- **Changelog / Changeset (Liquibase)** — Un changelog est la liste ordonnée
72+
des migrations ; un changeset est une migration atomique, identifiée par
73+
`path::id::author`.
74+
- **ERD (Entity-Relationship Diagram)** — Un diagramme des entités et de leurs
75+
relations (produit ici avec Mermaid).
76+
- **Hibernate** — L'implémentation JPA (ORM) utilisée pour faire correspondre
77+
les entités Java aux tables.
78+
- **JPA (Jakarta Persistence API)** — L'API Java standard du mapping
79+
objet-relationnel ; implémentée par Hibernate.
80+
- **JSESSIONID** — Le nom par défaut du cookie de session servlet.
81+
- **Liquibase** — L'outil de migration du schéma de base de données. Les
82+
migrations sont des fichiers SQL formatés écrits à la main et appliqués au
83+
démarrage (voir [ADR-0005](docs/adr/0005-handwrite-liquibase-migrations-over-mcd-ddl.md)).
84+
- **Merise** — Une méthode française de modélisation des données produisant
85+
trois vues : MCD, MLD, MPD.
86+
- **MCD (Modèle Conceptuel de Données)** — Le modèle conceptuel ; les entités
87+
et relations, indépendamment de toute base de données.
88+
- **MLD (Modèle Logique des Données)** — Le modèle logique ; le schéma
89+
relationnel (tables, clés) dérivé du MCD.
90+
- **MPD (Modèle Physique des Données)** — Le modèle physique ; le schéma
91+
concret tel qu'implémenté dans PostgreSQL.
92+
- **ORM (Object-Relational Mapping)** — La correspondance entre objets Java et
93+
tables relationnelles ; assurée par Hibernate/JPA.
94+
- **UUID** — Un identifiant sur 128 bits utilisé comme clé primaire des
95+
utilisateurs pour éviter l'énumération d'identifiants séquentiels.
96+
97+
## Build, tests et outillage
98+
99+
- **ADR (Architecture Decision Record)** — Un document court, numéroté et en
100+
ajout seul qui capture une décision de conception et ses compromis, au
101+
format MADR.
102+
- **Bean Validation** — Le standard Jakarta de déclaration de contraintes
103+
(`@NotBlank`, `@Email`, `@Size`) sur les champs de formulaires/DTO,
104+
appliquées avec `@Valid`.
105+
- **Checkstyle** — Un outil d'analyse statique qui vérifie les sources Java
106+
contre un référentiel de style. Exécuté ici avec le référentiel Google
107+
fourni (`google_checks.xml`) en mode rapport seul (voir
108+
[ADR-0011](docs/adr/0011-start-ci-quality-checks-as-advisory-reports.md)).
109+
- **Code coverage (couverture de code)** — Le pourcentage de code exercé par
110+
la suite de tests. Mesuré ici par JaCoCo ; rapporté, sans seuil imposé pour
111+
l'instant.
112+
- **DTO (Data Transfer Object)** — Un objet qui transporte des données à
113+
travers une frontière, volontairement distinct des entités. Un DTO `...Form`
114+
porte un formulaire HTML.
115+
- **Failsafe** — Le plugin Maven qui exécute les tests d'intégration `*IT`
116+
dans la phase `verify`. Ce projet ne l'utilise **pas** (voir
117+
[ADR-0009](docs/adr/0009-run-tests-under-surefire-not-failsafe.md)).
118+
- **FIFO (tube nommé)** — Un fichier spécial qui transmet les données à la
119+
lecture. Le `.env` du projet est une FIFO remplie par 1Password ; le
120+
`source` du shell ne peut pas la lire (taille nulle au `stat`).
121+
- **HikariCP** — Le pool de connexions JDBC fourni avec Spring Boot.
122+
- **Test d'intégration (integration test)** — Un test qui démarre un contexte
123+
Spring et exerce plusieurs couches ensemble (ici `@SpringBootTest` contre un
124+
vrai conteneur Postgres).
125+
- **JaCoCo (Java Code Coverage)** — L'outil de couverture de code pour Java.
126+
Son plugin Maven instrumente les tests (`prepare-agent`) et écrit un rapport
127+
HTML/XML dans `target/site/jacoco/` pendant la phase `test` ; la CI le
128+
publie comme artefact de workflow.
129+
- **Linter** — Un outil qui signale les problèmes de style et de qualité dans
130+
le code source sans l'exécuter (analyse statique). Le linter du projet est
131+
Checkstyle.
132+
- **Lombok** — Une bibliothèque qui génère le code répétitif (accesseurs,
133+
constructeurs) à partir d'annotations, à la compilation.
134+
- **MADR (Markdown ADR)** — Le format léger de modèle d'ADR utilisé dans
135+
`docs/adr/`.
136+
- **Maven Wrapper (`mvnw`)** — Un script de lancement versionné qui télécharge
137+
et exécute la version de Maven épinglée par le projet, pour que les builds
138+
ne dépendent pas d'un Maven installé localement (utilisé par la CI :
139+
`./mvnw -B -ntp ...`).
140+
- **Slice test (test de tranche)** — Un test qui ne charge qu'une couche du
141+
contexte (par exemple `@DataJpaTest` pour la couche de persistance).
142+
- **Smoke test (test de fumée)** — Un test minimal vérifiant que le contexte
143+
de l'application démarre (`LearnDevApplicationTests`).
144+
- **Surefire** — Le plugin Maven qui exécute les tests `*Test`/`*Tests`
145+
(unitaires et d'intégration) dans la phase `test`. Tous les tests du projet
146+
passent par Surefire.
147+
- **Testcontainers** — Une bibliothèque qui démarre des conteneurs
148+
Docker/Podman jetables pour les tests ; utilisée pour exécuter un vrai
149+
PostgreSQL (voir [ADR-0006](docs/adr/0006-test-against-real-postgres-testcontainers.md)).
150+
- **Ryuk** — Le conteneur compagnon de Testcontainers qui nettoie les
151+
ressources ; désactivé sous Podman dans ce projet.
152+
- **YAGNI (You Aren't Gonna Need It)** — Le principe de ne pas construire une
153+
fonctionnalité avant d'en avoir réellement besoin (par exemple le report du
154+
rôle `SUPERADMIN`).
155+
156+
## Infrastructure et processus
157+
158+
- **Advisory check (contrôle consultatif)** — Un contrôle de CI qui signale
159+
les problèmes sans bloquer la fusion (goal en rapport seul et/ou
160+
`continue-on-error`). Le lint et la couverture démarrent en mode consultatif
161+
ici (voir [ADR-0011](docs/adr/0011-start-ci-quality-checks-as-advisory-reports.md)).
162+
- **CI (intégration continue)** — Construire et tester automatiquement chaque
163+
changement (chaque PR et chaque push) pour détecter les régressions au plus
164+
tôt. Mise en oeuvre avec GitHub Actions (issues #45 à #48).
165+
- **Docker Compose** — L'orchestration déclarative de plusieurs conteneurs ;
166+
fait tourner ici Postgres et Mongo. Sur la machine de développement,
167+
`docker` est Podman.
168+
- **GitButler** — L'outil de gestion de versions qui enveloppe Git ; utilisé
169+
via la CLI `but` quand la branche courante est `gitbutler/workspace`.
170+
- **GitHub Actions** — Le service de CI de GitHub. Chaque workflow est un
171+
fichier YAML sous `.github/workflows/` ; ce projet utilise un workflow ciblé
172+
par préoccupation (voir [ADR-0010](docs/adr/0010-structure-ci-as-focused-workflows-per-concern.md)).
173+
- **Podman** — Un moteur de conteneurs sans démon, utilisé comme remplaçant de
174+
`docker`.
175+
- **Runner (exécuteur)** — La machine qui exécute un job GitHub Actions
176+
(`ubuntu-latest` ici) ; elle embarque un démon Docker, que Testcontainers
177+
utilise directement.
178+
- **Profil Spring (Spring profile)** — Un jeu de configuration nommé (par
179+
exemple `dev`) qui sélectionne des propriétés spécifiques et des contextes
180+
Liquibase.
181+
- **Temurin** — La distribution Eclipse Adoptium de l'OpenJDK ; le build
182+
Java 21 utilisé en local (via SDKMAN) et sur la CI (via
183+
`actions/setup-java`).
184+
- **Thymeleaf** — Le moteur de templates HTML côté serveur. Son **dialecte**
185+
Spring Security (espace de noms `sec:`) expose l'utilisateur authentifié aux
186+
templates.
187+
- **Workflow (GitHub Actions)** — Un fichier YAML qui déclare quand
188+
(déclencheurs) et comment (jobs, étapes) la CI s'exécute. Ce projet contient
189+
`build.yml`, `test.yml`, `lint.yml` et `schema-drift.yml`.
190+
- **Workflow artifact (artefact de workflow)** — Un fichier ou dossier publié
191+
depuis une exécution de workflow et téléchargeable depuis la page de
192+
l'exécution (ici : le rapport XML de Checkstyle et les rapports JaCoCo).
193+
194+
## Certification
195+
196+
- **CCP (Certificat de Compétences Professionnelles)** — Un bloc de
197+
compétences d'un Titre Professionnel français ; le DWWM comprend un CCP
198+
front-end et un CCP back-end.
199+
- **DWWM (Développeur Web et Web Mobile)** — Le Titre Professionnel français
200+
visé par ce projet de fin de formation.
201+
- **REAC (Référentiel Emploi Activités Compétences)** — Le référentiel
202+
officiel de compétences qui définit ce que la certification évalue.

GLOSSARY.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ project. For the concrete tools and versions, see [docs/tech-stacks.md](docs/tec
55
for how the pieces fit together, see [ARCHITECTURE.md](ARCHITECTURE.md); for the
66
rationale behind design decisions, see the [ADRs](docs/adr/README.md).
77

8+
> [!NOTE]
9+
> 🇫🇷 French version: [GLOSSAIRE.md](GLOSSAIRE.md).
10+
> The two files are translations of each other: when you add, change, or
11+
> remove an entry in one, apply the same change to the other.
12+
813
## Domain terms
914

1015
- **Archive** — Unpublish a course or lesson so it is no longer available to
@@ -80,6 +85,11 @@ rationale behind design decisions, see the [ADRs](docs/adr/README.md).
8085
capturing one design decision and its trade-offs, in MADR format.
8186
- **Bean Validation** — The Jakarta standard for declaring constraints
8287
(`@NotBlank`, `@Email`, `@Size`) on form/DTO fields, enforced with `@Valid`.
88+
- **Checkstyle** — A static-analysis tool that checks Java source against a
89+
style ruleset. Runs here with the bundled Google ruleset (`google_checks.xml`)
90+
in report-only mode (see [ADR-0011](docs/adr/0011-start-ci-quality-checks-as-advisory-reports.md)).
91+
- **Code coverage** — The percentage of code exercised by the test suite.
92+
Measured here by JaCoCo; reported, not yet enforced as a threshold.
8393
- **DTO (Data Transfer Object)** — An object carrying data across a boundary,
8494
deliberately separate from entities. A `...Form` DTO backs an HTML form.
8595
- **Failsafe** — The Maven plugin that runs `*IT` integration tests in the `verify`
@@ -89,9 +99,17 @@ rationale behind design decisions, see the [ADRs](docs/adr/README.md).
8999
- **HikariCP** — The JDBC connection pool bundled with Spring Boot.
90100
- **Integration test** — A test that boots a Spring context and exercises multiple
91101
layers together (here `@SpringBootTest` against a real Postgres container).
102+
- **JaCoCo (Java Code Coverage)** — The code-coverage tool for Java. Its Maven
103+
plugin instruments the tests (`prepare-agent`) and writes an HTML/XML report to
104+
`target/site/jacoco/` during the `test` phase; CI uploads it as a workflow artifact.
105+
- **Linter** — A tool that flags style and quality issues in source code without
106+
running it (static analysis). The project's linter is Checkstyle.
92107
- **Lombok** — A library that generates boilerplate (getters, constructors) from
93108
annotations at compile time.
94109
- **MADR (Markdown ADR)** — The lightweight ADR template format used in `docs/adr/`.
110+
- **Maven Wrapper (`mvnw`)** — A committed launcher script that downloads and runs
111+
the project's pinned Maven version, so builds do not depend on a locally
112+
installed Maven (used by CI: `./mvnw -B -ntp ...`).
95113
- **Slice test** — A test that loads only one layer of the context (for example
96114
`@DataJpaTest` for the persistence layer).
97115
- **Smoke test** — A minimal test that the application context starts at all
@@ -107,15 +125,33 @@ rationale behind design decisions, see the [ADRs](docs/adr/README.md).
107125

108126
## Infrastructure and process
109127

128+
- **Advisory check** — A CI check that reports problems without blocking the
129+
merge (report-only goal and/or `continue-on-error`). Linting and coverage
130+
start advisory here (see [ADR-0011](docs/adr/0011-start-ci-quality-checks-as-advisory-reports.md)).
131+
- **CI (Continuous Integration)** — Automatically building and testing every
132+
change (each PR and push) to catch regressions early. Implemented with
133+
GitHub Actions (issues #45 to #48).
110134
- **Docker Compose** — Declarative multi-container orchestration; here it runs
111135
Postgres and Mongo. `docker` on the dev machine is Podman.
112136
- **GitButler** — The version-control tool wrapping Git; used via the `but` CLI when
113137
the current branch is `gitbutler/workspace`.
138+
- **GitHub Actions** — GitHub's CI service. Each workflow is a YAML file under
139+
`.github/workflows/`; this project uses one focused workflow per concern
140+
(see [ADR-0010](docs/adr/0010-structure-ci-as-focused-workflows-per-concern.md)).
114141
- **Podman** — A daemonless container engine, used as the `docker` drop-in.
142+
- **Runner** — The machine that executes a GitHub Actions job (`ubuntu-latest`
143+
here); it ships with a Docker daemon, which Testcontainers uses directly.
115144
- **Spring profile** — A named configuration set (for example `dev`) selecting
116145
profile-specific properties and Liquibase contexts.
146+
- **Temurin** — The Eclipse Adoptium distribution of the OpenJDK; the Java 21
147+
build used locally (via SDKMAN) and on CI (via `actions/setup-java`).
117148
- **Thymeleaf** — The server-side HTML template engine. Its Spring Security
118149
**dialect** (`sec:` namespace) exposes the authenticated user to templates.
150+
- **Workflow (GitHub Actions)** — A YAML file declaring when (triggers) and how
151+
(jobs, steps) CI runs. This project has `build.yml`, `test.yml`, `lint.yml`,
152+
and `schema-drift.yml`.
153+
- **Workflow artifact** — A file or folder uploaded from a workflow run and
154+
downloadable from the run page (here: the Checkstyle XML and JaCoCo reports).
119155

120156
## Certification
121157

0 commit comments

Comments
 (0)