125 lines
4.3 KiB
YAML
125 lines
4.3 KiB
YAML
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 \
|
|
-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 |