# CI/CD Gitea Actions : à chaque push sur `main`, build des images # (registre de conteneurs intégré à Gitea) puis déploiement SSH sur le VPS. # # Nécessite un runner Gitea Actions (act_runner, exécuteur "docker") attaché # au dépôt ou à l'organisation. # # Secrets à définir (Paramètres du dépôt → Actions → Secrets) : # REGISTRY_TOKEN jeton d'accès (scope "write:package") pour pousser sur # le registre de conteneurs de cette instance Gitea # SSH_KEY clé privée SSH (format OpenSSH) pour se connecter au VPS # # Variables à définir (Paramètres du dépôt → Actions → Variables) : # REGISTRY_HOST hôte du registre (ex. gitea.mon-domaine.fr) # REGISTRY_NAMESPACE espace du registre (ex. /) # REGISTRY_USER utilisateur associé à REGISTRY_TOKEN # SSH_HOST hôte du VPS # SSH_USER utilisateur SSH # DEPLOY_PATH dossier du projet sur le VPS (ex. /opt/benevoles) # VITE_EDITION_ID UUID de l'édition de production, à renseigner APRÈS # la toute première mise en service (voir deploy/README.md) # VITE_HCAPTCHA_SITE_KEY clé de site hCaptcha (publique) — figée au build # du frontend, voir app/api/forms.py et deploy/README.md. # Vide ⇒ formulaire public sans vérification anti-robot. name: ci-cd on: push: branches: [main] concurrency: group: ci-cd-${{ gitea.ref }} cancel-in-progress: false jobs: build-backend: runs-on: ubuntu-latest container: docker:27 steps: - name: Installer git et node run: apk add --no-cache git nodejs - uses: actions/checkout@v4 - name: Connexion au registre run: echo "${{ secrets.REGISTRY_TOKEN }}" | docker login "${{ vars.REGISTRY_HOST }}" -u "${{ vars.REGISTRY_USER }}" --password-stdin - name: Build & push run: | IMAGE="${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_NAMESPACE }}/backend" docker build -t "$IMAGE:${{ gitea.sha }}" -t "$IMAGE:latest" backend docker push "$IMAGE:${{ gitea.sha }}" docker push "$IMAGE:latest" build-frontend: needs: build-backend # séquentiel pour ne pas saturer le CPU runs-on: ubuntu-latest container: docker:27 steps: - name: Installer git et node run: apk add --no-cache git nodejs - uses: actions/checkout@v4 - name: Connexion au registre run: echo "${{ secrets.REGISTRY_TOKEN }}" | docker login "${{ vars.REGISTRY_HOST }}" -u "${{ vars.REGISTRY_USER }}" --password-stdin - name: Build & push run: | IMAGE="${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_NAMESPACE }}/frontend" docker build \ --build-arg VITE_API_MODE=http \ --build-arg VITE_EDITION_ID="${{ vars.VITE_EDITION_ID }}" \ --build-arg VITE_HCAPTCHA_SITE_KEY="${{ vars.VITE_HCAPTCHA_SITE_KEY }}" \ -f frontend/Dockerfile.prod \ -t "$IMAGE:${{ gitea.sha }}" -t "$IMAGE:latest" frontend docker push "$IMAGE:${{ gitea.sha }}" docker push "$IMAGE:latest" deploy: needs: [build-backend, build-frontend] runs-on: ubuntu-latest container: alpine:3.20 steps: - name: Installer les outils run: apk add --no-cache git nodejs openssh-client rsync - uses: actions/checkout@v4 - name: Déployer par SSH run: | mkdir -p ~/.ssh && chmod 700 ~/.ssh echo "${{ secrets.SSH_KEY }}" | tr -d '\r' > ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519 ssh-keyscan -H "${{ vars.SSH_HOST }}" >> ~/.ssh/known_hosts rsync -az -e "ssh -i ~/.ssh/id_ed25519" deploy/docker-compose.prod.yml "${{ vars.SSH_USER }}@${{ vars.SSH_HOST }}:${{ vars.DEPLOY_PATH }}/docker-compose.prod.yml" ssh -i ~/.ssh/id_ed25519 "${{ vars.SSH_USER }}@${{ vars.SSH_HOST }}" sh -s <