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 --retry 3 --retry-delay 10 --retry-all-errors -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" cat response_body.json if [ "$RESPONSE" = "200" ]; then echo "✅ DEPLOIEMENT REUSSI - Frontend: 3026 / Backend: 8025" else echo "❌ ECHEC - Erreur Portainer (Code HTTP $RESPONSE)" exit 1 fi rm -f payload.json response_body.json