# Procédure de mise en production

Ce document décrit le workflow Git pour développer une fonctionnalité, créer une release et déployer en production.

## Branches utilisées

Le projet utilise les branches principales suivantes :

| Branche     | Rôle                                     |
| ----------- | ---------------------------------------- |
| `develop`   | Branche de développement                 |
| `master`    | Branche de production                    |
| `feature-*` | Branche pour une nouvelle fonctionnalité |
| `hotfix-*`  | Branche pour un correctif urgent         |
| `release-*` | Branche de préparation de release        |

## Scripts disponibles

| Script              | Rôle                                                                                     |
| ------------------- | ---------------------------------------------------------------------------------------- |
| `start-branch.sh`   | Créer une branche `feature` ou `hotfix` depuis `develop`                                 |
| `finish-branch.sh`  | Finaliser une branche `feature` ou `hotfix` et la merger dans `develop`                  |
| `create-release.sh` | Créer une branche de release depuis `develop`                                            |
| `deploy-release.sh` | Merger la release dans `master` et `develop`, créer un tag, puis déployer sur le serveur |

> Si le script s’appelle encore `finish-feature.sh`, il peut être utilisé pareil. Le nom recommandé est `finish-branch.sh`.

---

# 1. Créer une branche de développement

Pour créer une nouvelle fonctionnalité :

```bash
./start-branch.sh feature nom-de-la-feature
```

Exemple :

```bash
./start-branch.sh feature login
```

Cela crée une branche :

```bash
feature-login
```

Pour créer un correctif :

```bash
./start-branch.sh hotfix nom-du-correctif
```

Exemple :

```bash
./start-branch.sh hotfix bug-cache
```

Cela crée une branche :

```bash
hotfix-bug-cache
```

---

# 2. Développer sur la branche

Vérifier la branche actuelle :

```bash
git branch
```

Voir les fichiers modifiés :

```bash
git status
```

Ajouter et committer manuellement si besoin :

```bash
git add .
git commit -m "message du commit"
```

Le script `finish-branch.sh` peut aussi faire le commit automatiquement s’il détecte des changements.

---

# 3. Finaliser la feature ou le hotfix

Quand le développement est terminé :

```bash
./finish-branch.sh
```

Ou, si le fichier s’appelle encore `finish-feature.sh` :

```bash
./finish-feature.sh
```

Ce script va :

1. vérifier la branche actuelle ;
2. committer les changements si besoin ;
3. mettre à jour `develop` ;
4. rebaser la branche actuelle sur `develop` ;
5. pousser la branche ;
6. merger la branche dans `develop` ;
7. pousser `develop` ;
8. proposer de supprimer la branche locale et distante.

À la fin, le code est intégré dans :

```bash
develop
```

---

# 4. Créer une release

Une fois que `develop` contient les modifications à mettre en production, créer une release.

Exemple pour la version `1.0.0` :

```bash
./create-release.sh 1.0.0
```

Ce script crée automatiquement la branche :

```bash
release-1.0.0
```

Il pousse aussi la branche sur le dépôt distant.

---

# 5. Se placer sur la branche de release

Avant de déployer, aller sur la branche de release :

```bash
git checkout release-1.0.0
```

Vérifier la branche actuelle :

```bash
git branch
```

La branche active doit être :

```bash
release-1.0.0
```

---

# 6. Déployer la release en production

Lancer le script de déploiement avec le numéro de version :

```bash
./deploy-release.sh 1.0.0
```

Le script utilise automatiquement :

```bash
release-1.0.0
```

Et crée automatiquement le tag :

```bash
v1.0.0
```

Le script va :

1. vérifier que l’on est bien sur la branche `release-1.0.0` ;
2. committer les changements restants si besoin ;
3. pousser la branche de release ;
4. merger la release dans `master` ;
5. pousser `master` ;
6. merger la release dans `develop` ;
7. pousser `develop` ;
8. créer le tag `v1.0.0` ;
9. pousser le tag ;
10. se connecter au serveur distant ;
11. mettre à jour le code serveur sur `master` ;
12. vider le cache Symfony en production.

---

# 7. Vérifier les releases existantes

Voir tous les tags :

```bash
git tag
```

Voir les tags du plus récent au plus ancien :

```bash
git tag --sort=-creatordate
```

Voir uniquement les releases au format `v*` :

```bash
git tag --list "v*"
```

Voir le détail d’une release :

```bash
git show v1.0.0
```

---

# 8. Workflow complet

Exemple complet pour une nouvelle fonctionnalité :

```bash
./start-branch.sh feature login

# Développement...

./finish-branch.sh

./create-release.sh 1.0.0

git checkout release-1.0.0

./deploy-release.sh 1.0.0
```

Exemple complet pour un hotfix :

```bash
./start-branch.sh hotfix bug-cache

# Correction...

./finish-branch.sh

./create-release.sh 1.0.1

git checkout release-1.0.1

./deploy-release.sh 1.0.1
```

---

# 9. Règles de version

Le projet utilise le format :

```bash
MAJOR.MINOR.PATCH
```

Exemples :

```bash
1.0.0
1.0.1
1.1.0
2.0.0
```

## Quand changer chaque numéro ?

### Patch

Pour un correctif sans nouvelle fonctionnalité :

```bash
1.0.0 → 1.0.1
```

### Minor

Pour une nouvelle fonctionnalité compatible :

```bash
1.0.1 → 1.1.0
```

### Major

Pour une grosse évolution ou un changement cassant :

```bash
1.1.0 → 2.0.0
```

---

# 10. Annuler le dernier commit

Si le commit n’a pas encore été poussé :

```bash
git reset --soft HEAD~1
```

Si le commit a déjà été poussé, méthode propre :

```bash
git revert HEAD
git push
```

Méthode destructive, à éviter si d’autres personnes travaillent sur la branche :

```bash
git reset --hard HEAD~1
git push --force-with-lease
```

---

# 11. Supprimer un mauvais tag

Exemple avec un mauvais tag `v1.0.1` :

```bash
git tag -d v1.0.1
git push origin :refs/tags/v1.0.1
```

Créer ensuite le bon tag :

```bash
git checkout master
git pull origin master
git tag -a v1.0.0 -m "Release 1.0.0"
git push origin v1.0.0
```

---

# 12. Commandes utiles

Voir la branche actuelle :

```bash
git branch
```

Voir l’état du dépôt :

```bash
git status
```

Récupérer les dernières infos du dépôt distant :

```bash
git fetch origin
```

Voir les branches locales :

```bash
git branch
```

Voir les branches distantes :

```bash
git branch -r
```

Voir les branches release :

```bash
git branch --list "release-*"
```

Voir les branches release distantes :

```bash
git branch -r --list "origin/release-*"
```

---

# 13. Résumé rapide

Pour développer :

```bash
./start-branch.sh feature ma-feature
```

Pour finaliser :

```bash
./finish-branch.sh
```

Pour créer une release :

```bash
./create-release.sh 1.0.0
```

Pour déployer :

```bash
git checkout release-1.0.0
./deploy-release.sh 1.0.0
```

Pour vérifier les releases :

```bash
git tag --sort=-creatordate
```
