name: CI-CD NDF Complet run-name: Pipeline exécuté par ${{ github.actor }} on: push: branches: - master jobs: test-and-quality: runs-on: ubuntu-latest steps: - name: Récupération du code uses: actions/checkout@v3 with: fetch-depth: 0 - name: Installation et Tests Node.js (Backend) run: | cd ndf/public/backend npm install if grep -q '"test":' package.json; then echo "Script de test trouvé - Lancement des tests..." npm test -- --coverage --watchAll=false else echo "Aucun script de test configuré. Passage à la suite." fi - name: Analyse SonarQube uses: sonarsource/sonarqube-scan-action@master continue-on-error: true env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} with: args: > -Dsonar.projectKey=ndf-Gitea -Dsonar.sources=ndf/public/backend -Dsonar.javascript.lcov.reportPaths=ndf/public/backend/coverage/lcov.info deploy: needs: test-and-quality runs-on: ubuntu-latest env: PORTAINER_API: "https://myportainer.ensup-adm.net/api" steps: - name: Récupération du code pour le déploiement uses: actions/checkout@v3 - name: Préparation du fichier docker-compose pour Gitea run: | sed -i '/build:/d' docker-compose.yml sed -i '/context:/d' docker-compose.yml sed -i '/dockerfile:/d' docker-compose.yml sed -i 's/8024:3024/8025:3024/g' docker-compose.yml sed -i 's/3025:81/3026:81/g' docker-compose.yml sed -i 's/container_name: ndf-backend/container_name: gitea-ndf-backend/g' docker-compose.yml sed -i 's/container_name: ndf-frontend/container_name: gitea-ndf-frontend/g' docker-compose.yml echo "Contenu du compose après modification :" cat docker-compose.yml - name: Envoi à l'API Portainer run: | echo "--- 1. Authentification ---" printf '{"username":"%s","password":"%s"}' "${{ secrets.PORTAINER_USER }}" "${{ secrets.PORTAINER_PASS }}" > auth.json TOKEN=$(curl -s -k -X POST "${PORTAINER_API}/auth" \ -H "Content-Type: application/json" \ -d @auth.json | grep -o '"jwt":"[^"]*"' | cut -d'"' -f4) rm -f auth.json if [ -z "$TOKEN" ]; then echo "Echec Login Portainer" exit 1 fi echo "Authentification réussie" echo "--- 2. Récupération des IDs ---" ENDPOINT_ID=$(curl -s -k \ -H "Authorization: Bearer $TOKEN" \ "${PORTAINER_API}/endpoints" \ | grep -o '"Id":[0-9]*,"Name":"myportainer-cgy-dev"' \ | grep -o '[0-9]*' | head -n 1) echo "Endpoint ID : $ENDPOINT_ID" STACK_ID=$(curl -s -k \ -H "Authorization: Bearer $TOKEN" \ "${PORTAINER_API}/stacks" \ | grep -o '"Id":[0-9]*,"Name":"gitea-action-dev"' \ | grep -o '[0-9]*' | head -n 1) echo "Stack ID : $STACK_ID" echo "--- 3. Génération du Payload ---" node -e ' const fs = require("fs"); const compose = fs.readFileSync("docker-compose.yml", "utf8"); const payload = { stackFileContent: compose, pullImage: true, prune: true }; fs.writeFileSync("payload.json", JSON.stringify(payload)); console.log("Payload size:", JSON.stringify(payload).length, "bytes"); ' echo "--- 4. Envoi à Portainer ---" RESPONSE=$(curl -s -k \ --max-time 300 # attend jusqu'à 5 minutes --retry 3 # réessaie 3 fois si échec --retry-delay 10 # attend 10 secondes entre chaque tentative --retry-all-errors # réessaie même sur les erreurs 5xx comme le 504 -o response_body.json \ -w "%{http_code}" \ -X PUT "${PORTAINER_API}/stacks/${STACK_ID}?endpointId=${ENDPOINT_ID}" \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d @payload.json) echo "HTTP Code : $RESPONSE" echo "Réponse Portainer :" cat response_body.json if [ "$RESPONSE" = "200" ]; then echo "DEPLOIEMENT REUSSI - Frontend: 3026 / Backend: 8025" else echo "Erreur Portainer (Code HTTP $RESPONSE)" exit 1 fi rm -f payload.json response_body.json