Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
## Ce que fait ce MR

<!-- Une phrase : "Ajoute X", "Corrige Y", "Implémente Z" -->

## Couche concernée

- [ ] `model` — entités et POJOs
- [ ] `hypervisor` — IHypervisor / VBoxOrchestrator
- [ ] `data` — DatabaseManager / schema SQL
- [ ] `pdf` — PdfExporter
- [ ] `controller` — LabController
- [ ] `ui` — vues JavaFX
- [ ] Config / build (pom.xml, module-info, CI)

## Checklist avant review

- [ ] `./mvnw test` passe en local (0 failure, 0 error)
- [ ] Javadoc présent sur toutes les classes et méthodes publiques ajoutées
- [ ] Pas de `System.out.println` de debug oublié
- [ ] Pas de TODO non intentionnel
- [ ] Les imports inutilisés ont été supprimés (IntelliJ : Ctrl+Alt+O)

## Pour le reviewer

<!-- Ce qui mérite une attention particulière, un choix d'implémentation à valider, une question -->
34 changes: 34 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: CI

on:
push:
branches: [ "main", "develop", "feature/**", "fix/**" ]
pull_request:
branches: [ "develop", "main" ]

jobs:
build-and-test:
name: Build & Test (Java 17)
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Java 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: maven # met le dépôt Maven en cache → builds 2x plus rapides

- name: Build & run tests
run: ./mvnw test --no-transfer-progress

- name: Upload Surefire reports on failure
if: failure() # s'exécute UNIQUEMENT si les tests échouent
uses: actions/upload-artifact@v4
with:
name: surefire-reports
path: target/surefire-reports/
retention-days: 7
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,4 @@ build/

### Mac OS ###
.DS_Store
target/
74 changes: 74 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Guide de contribution — Cyber Lab Manager

## Branches

| Préfixe | Usage | Exemple |
|---|---|---|
| `feature/` | Nouvelle fonctionnalité | `feature/vbox-orchestrator` |
| `fix/` | Correction de bug | `fix/snapshot-uuid-null` |
| `chore/` | Config, CI, docs | `chore/github-config` |
| `test/` | Ajout ou correction de tests seuls | `test/hypervisor-coverage` |

**Règle absolue :** on ne pousse jamais directement sur `develop` ou `main`.
Toujours passer par un MR depuis une branche `feature/` ou `fix/`.

## Format des commits

On suit [Conventional Commits](https://www.conventionalcommits.org/fr) :

```
<type>(<scope optionnel>): <description courte en français>
```

| Type | Quand l'utiliser |
|---|---|
| `feat` | Ajout d'une fonctionnalité |
| `fix` | Correction d'un bug |
| `test` | Ajout ou modification de tests |
| `docs` | Documentation (Javadoc, Markdown) |
| `refactor` | Refactoring sans changement de comportement |
| `chore` | Config build, CI, dépendances |

**Exemples :**
```
feat(model): add Snapshot uuid and online fields
fix(hypervisor): handle VBoxManage non-zero exit code
test(model): add LabTest unmodifiable list assertion
docs(hypervisor): complete Javadoc on IHypervisor
chore: add GitHub Actions CI workflow
```

## Ouvrir un MR

1. Ta branche est à jour avec `develop` (`git rebase develop` ou `git merge develop`)
2. `./mvnw test` passe en local — **0 failure, 0 error**
3. Javadoc présent sur toutes les classes et méthodes publiques ajoutées
4. Ouvre le MR vers `develop` sur GitHub
5. Remplis le template de MR (pré-rempli automatiquement)
6. Assigne au moins un reviewer

## Revue de code

- Le reviewer a **48h** pour donner son retour
- Un commentaire `[bloquant]` doit être résolu avant le merge
- Un commentaire `[suggestion]` est optionnel
- Approuver = confirmer que les tests passent ET que le code est lisible

## Standards de code

- **Java 17**, style standard IntelliJ (Ctrl+Alt+L pour formatter)
- Javadoc obligatoire sur toutes les classes et méthodes `public`
- Pas de `System.out.println` → utiliser `java.util.logging.Logger`
- Imports inutilisés supprimés (Ctrl+Alt+O dans IntelliJ)
- Pas de TODO non documenté dans un MR

## Responsabilités par package

| Package | Responsable |
|---|---|
| `tg.cyberlabmanager.model` | Rôle 3 |
| `tg.cyberlabmanager.hypervisor` | Rôle 3 |
| `tg.cyberlabmanager.data` | Rôle 2 |
| `tg.cyberlabmanager.pdf` | Rôle 2 |
| `tg.cyberlabmanager.ui` | Rôle 1 |
| `tg.cyberlabmanager.controller` | Rôle 1 |
89 changes: 89 additions & 0 deletions docs/Markdowns/SETUP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# SETUP — Environnement de développement

## Prérequis

| Outil | Version minimale | Vérification |
|---|---|---|
| JDK | 17 (LTS) | `java -version` |
| Maven | 3.8+ | `./mvnw -version` |
| VirtualBox | 7.0+ | Pour les tests d'intégration |
| Git | 2.x | `git --version` |

> Le projet utilise le Maven Wrapper (`./mvnw`) — pas besoin d'installer Maven globalement.

---

## Configuration IDE — point critique à lire

Le projet compile en **Java 17** même si tu as un JDK plus récent (21, 22…) sur ta machine.
C'est contrôlé par cette ligne dans `pom.xml` :

```xml
<maven.compiler.release>17</maven.compiler.release>
```

Cette propriété fixe simultanément la syntaxe acceptée, le bytecode cible (class file version 61)
et les APIs accessibles — le compilateur de ton JDK s'adapte automatiquement.

### IntelliJ IDEA

**File → Project Structure → Project** :
- SDK : ton JDK installé (17, 21, peu importe)
- Language level : **17**

**File → Settings → Build → Compiler → Java Compiler** :
- Target bytecode version : **17**

### Pourquoi c'est important

Si quelqu'un compile avec bytecode Java 21 et pousse du code, les autres obtiendront :
```
UnsupportedClassVersionError: Unsupported major.minor version 65.0
```
La version 65 = Java 21. La version 61 = Java 17 (notre cible).
Garder tout le monde sur la même cible évite ce type de conflit au merge.

---

## Lancer le projet

```bash
# Compiler et lancer tous les tests
./mvnw test

# Lancer l'application JavaFX
./mvnw javafx:run

# Générer la Javadoc dans target/reports/apidocs/
./mvnw javadoc:javadoc
```

> Si tu utilises un JDK non standard, préfixe avec JAVA_HOME :
> `JAVA_HOME=/usr/lib/jvm/jdk-21.0.11-oracle-x64 ./mvnw test`

---

## Structure des branches

```
main ← releases stables uniquement
develop ← intégration continue (branche de référence)
feature/x ← développement d'une fonctionnalité
fix/x ← correction de bug
chore/x ← config, CI, documentation
```

Voir [CONTRIBUTING.md](../CONTRIBUTING.md) pour les conventions complètes.

---

## Responsabilités par package

| Package | Rôle | Contenu |
|---|---|---|
| `tg.cyberlabmanager.model` | Rôle 3 | Entités métier (Lab, VM, Snapshot…) |
| `tg.cyberlabmanager.hypervisor` | Rôle 3 | IHypervisor, VBoxOrchestrator |
| `tg.cyberlabmanager.data` | Rôle 2 | DatabaseManager, SQLite |
| `tg.cyberlabmanager.pdf` | Rôle 2 | PdfExporter |
| `tg.cyberlabmanager.ui` | Rôle 1 | Vues JavaFX |
| `tg.cyberlabmanager.controller` | Rôle 1 | LabController |
Loading