# ───────────────────────────────────────────────────────────── # Déploiement Continu (CD) — CESIZen / Application Web Laravel # Déclenché après un merge sur `main` (ou un tag de version). # Chaîne : build image Docker → push vers le Container Registry # de Gitea → déclenchement du webhook Portainer (redéploiement). # ───────────────────────────────────────────────────────────── name: CD - Déploiement Web (Production) on: push: branches: [main] paths: - 'WEB/**' - '.gitea/workflows/deploy.yml' tags: - 'v*' workflow_dispatch: {} # permet un déclenchement manuel depuis l'UI Gitea env: # Registre de conteneurs intégré à Gitea REGISTRY: gitea.sam-coffre.duckdns.org IMAGE_NAME: ${{ github.repository_owner }}/cesizen-web jobs: build-and-deploy: runs-on: ubuntu-latest steps: # 1. Récupération du code source - name: Checkout du dépôt uses: actions/checkout@v4 # 2. Préparation de Docker Buildx - name: Configuration de Docker Buildx uses: docker/setup-buildx-action@v3 # 3. Authentification sur le Container Registry Gitea # Les identifiants sont stockés dans les secrets du dépôt. - name: Connexion au registre Gitea uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ secrets.REGISTRY_USERNAME }} password: ${{ secrets.REGISTRY_TOKEN }} # 4. Calcul des tags de l'image (latest + SHA court + tag Git) - name: Définition des tags id: meta run: | echo "sha=$(echo ${{ github.sha }} | cut -c1-7)" >> "$GITHUB_OUTPUT" # 5. Build et push de l'image (contexte = dossier WEB) - name: Build & Push de l'image Docker uses: docker/build-push-action@v6 with: context: ./WEB file: ./WEB/Dockerfile push: true tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.sha }} cache-from: type=gha cache-to: type=gha,mode=max # 6. Déclenchement du redéploiement Portainer # Portainer re-pull l'image `latest` et recrée le conteneur. # L'URL du webhook est un secret (ne jamais l'exposer en clair). - name: Redéploiement via webhook Portainer run: | echo "Déclenchement du redéploiement Portainer..." curl --fail --silent --show-error -X POST "${{ secrets.PORTAINER_WEBHOOK_URL }}" echo "Redéploiement demandé avec succès." # 7. (Optionnel) Vérification de disponibilité post-déploiement - name: Health check run: | sleep 20 curl --fail --silent --show-error https://cesizen.sam-coffre.duckdns.org/up \ || echo "::warning::Le health check /up n'a pas répondu — vérifier le conteneur."