# 🚀 CI/CD Multi-Environnements - Proposition

## 📊 Configuration Actuelle

**Trigger** :
```yaml
on:
  push:
    branches:
      - preprod  # ← UNIQUEMENT preprod
```

**Tags créés** :
- `xpeditis-backend:preprod`
- `xpeditis-frontend:preprod`

**Problème** : Si vous créez d'autres branches (staging, production), elles ne déclenchent pas la CI/CD.

---

## ✅ Solution 1 : Multi-Environnements (Recommandé)

### Configuration Proposée

```yaml
on:
  push:
    branches:
      - main          # Production
      - preprod       # Pre-production
      - staging       # Staging (optionnel)
      - develop       # Development (optionnel)
```

### Tags Créés Automatiquement

| Branche | Tags Créés | Usage |
|---------|------------|-------|
| `main` | `xpeditis-backend:main`<br>`xpeditis-backend:latest` | Production |
| `preprod` | `xpeditis-backend:preprod` | Pre-production |
| `staging` | `xpeditis-backend:staging` | Staging |
| `develop` | `xpeditis-backend:develop` | Development |

### Avantages

- ✅ Chaque environnement a son tag dédié
- ✅ Tag `latest` automatiquement créé pour production (`main`)
- ✅ Workflow GitFlow supporté
- ✅ Pas besoin de modifier les tags manuellement

---

## ✅ Solution 2 : Ajouter Tag `latest` pour Preprod

Si vous voulez que `preprod` crée aussi un tag `latest` :

```yaml
tags: |
  type=ref,event=branch
  type=raw,value=latest  # ← Enlever le "enable={{is_default_branch}}"
```

**Résultat** :
- Push sur `preprod` → Tags : `preprod` + `latest`

**Inconvénient** : Le tag `latest` pointe toujours vers la dernière image buildée, peu importe la branche.

---

## ✅ Solution 3 : Tags Supplémentaires (Git SHA, Date)

Pour avoir plus de traçabilité :

```yaml
tags: |
  type=ref,event=branch
  type=sha,prefix={{branch}}-
  type=raw,value=latest,enable={{is_default_branch}}
```

**Résultat pour preprod** :
- `xpeditis-backend:preprod` (tag principal)
- `xpeditis-backend:preprod-a1b2c3d` (tag avec commit SHA)

**Avantages** :
- ✅ Rollback facile vers un commit spécifique
- ✅ Traçabilité complète

---

## ✅ Solution 4 : Tags Sémantiques (Releases)

Pour les releases en production avec versioning :

```yaml
on:
  push:
    branches:
      - main
      - preprod
    tags:
      - 'v*.*.*'  # v1.0.0, v1.2.3, etc.

tags: |
  type=ref,event=branch
  type=semver,pattern={{version}}
  type=semver,pattern={{major}}.{{minor}}
  type=raw,value=latest,enable={{is_default_branch}}
```

**Résultat pour tag `v1.2.3`** :
- `xpeditis-backend:1.2.3`
- `xpeditis-backend:1.2`
- `xpeditis-backend:latest`

---

## 📋 Recommandation pour Xpeditis

### Configuration Proposée (Production-Ready)

```yaml
name: CI/CD Pipeline

on:
  push:
    branches:
      - main      # Production
      - preprod   # Pre-production
  pull_request:
    branches:
      - main
      - preprod

env:
  REGISTRY: rg.fr-par.scw.cloud/weworkstudio
  NODE_VERSION: '20'

jobs:
  backend:
    name: Backend - Build, Test & Push
    runs-on: ubuntu-latest
    # ...

    steps:
      # ... (setup steps)

      - name: Extract metadata for Docker
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY }}/xpeditis-backend
          tags: |
            # Tag avec le nom de la branche
            type=ref,event=branch

            # Tag "latest" seulement pour main (production)
            type=raw,value=latest,enable={{is_default_branch}}

            # Tag avec le commit SHA (pour rollback)
            type=sha,prefix={{branch}}-,format=short

            # Tag avec la date (optionnel)
            type=raw,value={{branch}}-{{date 'YYYYMMDD-HHmmss'}}

      - name: Build and push Backend Docker image
        uses: docker/build-push-action@v5
        with:
          context: ./apps/backend
          file: ./apps/backend/Dockerfile
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          platforms: linux/amd64,linux/arm64
```

### Tags Créés

**Push sur `preprod`** :
- `xpeditis-backend:preprod`
- `xpeditis-backend:preprod-a1b2c3d`
- `xpeditis-backend:preprod-20251119-143022`

**Push sur `main`** :
- `xpeditis-backend:main`
- `xpeditis-backend:latest` ← Production stable
- `xpeditis-backend:main-a1b2c3d`
- `xpeditis-backend:main-20251119-143022`

---

## 🎯 Configuration Minimale (Actuelle + Latest)

Si vous voulez juste ajouter le tag `latest` pour `preprod` :

```yaml
tags: |
  type=ref,event=branch
  type=raw,value=latest
```

**Résultat** :
- Push sur `preprod` → Tags : `preprod` + `latest`

---

## 📊 Tableau Comparatif

| Solution | Tags pour Preprod | Tags pour Main | Rollback | Complexité |
|----------|-------------------|----------------|----------|------------|
| **Actuelle** | `preprod` | ❌ Pas de CI/CD | ❌ | ⚡ Simple |
| **Solution 1** | `preprod` | `main`, `latest` | ❌ | ⚡ Simple |
| **Solution 2** | `preprod`, `latest` | ❌ | ❌ | ⚡ Simple |
| **Solution 3** | `preprod`, `preprod-SHA` | `main`, `latest`, `main-SHA` | ✅ | 🔧 Moyen |
| **Solution 4** | `preprod`, tags sémantiques | `main`, `1.2.3`, `latest` | ✅ | 🔧 Avancé |

---

## ✅ Ma Recommandation

**Pour Xpeditis, utilisez Solution 1** (Multi-environnements) :

1. Ajouter branche `main` au trigger CI/CD
2. `main` → Production (avec tag `latest`)
3. `preprod` → Pre-production (tag `preprod`)
4. Optionnel : Ajouter SHA tags pour rollback

**Workflow Git** :
```
develop → preprod → main
  ↓         ↓        ↓
staging   testing   production
```

---

## 🔧 Fichier à Modifier

**Fichier** : `.github/workflows/ci.yml`

**Modification minimale** (lignes 3-6) :
```yaml
on:
  push:
    branches:
      - main     # ← AJOUTER pour production
      - preprod  # ← Garder pour pre-production
```

**Résultat** :
- Push sur `preprod` → Build et tag `preprod`
- Push sur `main` → Build et tag `main` + `latest`

---

**Date** : 2025-11-19
**Impact** : 🟡 Moyen - Permet déploiement multi-environnements
**Urgence** : 🟢 Basse - Configuration actuelle fonctionne pour preprod
