|
|
@@ -1,63 +1,56 @@
|
|
|
pipeline {
|
|
|
agent any
|
|
|
+
|
|
|
environment {
|
|
|
NODEJS_HOME = "${tool 'NodeJS'}"
|
|
|
PATH = "${env.NODEJS_HOME}/bin:${env.PATH}"
|
|
|
- DEV_URL = "dev.foodgame.fr"
|
|
|
- PREPROD_URL = "preprod.foodgame.fr"
|
|
|
- PROD_URL = "prod.foodgame.fr"
|
|
|
+
|
|
|
+ DOCKER_REGISTRY = "nexus.foodgame.fr:8123"
|
|
|
+ IMAGE_NAME = "fatboar_repo/workflow_jenkins_1"
|
|
|
+ IMAGE_TAG = "latest"
|
|
|
}
|
|
|
- stages {
|
|
|
-
|
|
|
|
|
|
- stage('Docker Registry Login, Pull, and Push') {
|
|
|
- when {
|
|
|
- branch 'dev'
|
|
|
- }
|
|
|
+ stages {
|
|
|
+ stage('Select Environment') {
|
|
|
steps {
|
|
|
script {
|
|
|
- def registryUrl = 'nexus.foodgame.fr:8123'
|
|
|
- def imageName = 'quay.io/prometheus/node-exporter'
|
|
|
- def imageVersion = 'latest'
|
|
|
-
|
|
|
- docker.withRegistry("https://${registryUrl}", 'nexus') {
|
|
|
- try {
|
|
|
- // Try pulling the image from the registry
|
|
|
- echo "Trying to pull image: ${registryUrl}/${imageName}:${imageVersion}"
|
|
|
- docker.image("${registryUrl}/${imageName}:${imageVersion}").pull()
|
|
|
- } catch (Exception e) {
|
|
|
- echo "Image pull failed. Attempting to build and push."
|
|
|
-
|
|
|
- // Pull base image from Docker Hub
|
|
|
- echo "Pulling base image: ${imageName}:${imageVersion}"
|
|
|
- sh "docker pull ${imageName}:${imageVersion}"
|
|
|
-
|
|
|
- // Tag the image for the private registry
|
|
|
- echo "Tagging image for private registry"
|
|
|
- sh "docker tag ${imageName}:${imageVersion} ${registryUrl}/${imageName}:${imageVersion}"
|
|
|
-
|
|
|
- // Push the tagged image to the private registry
|
|
|
- echo "Pushing image to private registry"
|
|
|
- sh "docker push ${registryUrl}/${imageName}:${imageVersion}"
|
|
|
- }
|
|
|
+ if (env.BRANCH_NAME == 'feature') {
|
|
|
+ env.ENV = 'dev'
|
|
|
+ env.COMPOSE_FILE = 'docker-compose.dev.yml'
|
|
|
+ env.URL = "dev.foodgame.fr"
|
|
|
+ env.BACKUP_CONTAINER = "mongodb-backup-dev"
|
|
|
+ } else if (env.BRANCH_NAME == 'dev') {
|
|
|
+ env.ENV = 'preprod'
|
|
|
+ env.COMPOSE_FILE = 'docker-compose.preprod.yml'
|
|
|
+ env.URL = "preprod.foodgame.fr"
|
|
|
+ env.BACKUP_CONTAINER = "mongodb-backup-preprod"
|
|
|
+ } else if (env.BRANCH_NAME == 'master') {
|
|
|
+ env.ENV = 'prod'
|
|
|
+ env.COMPOSE_FILE = 'docker-compose.prod.yml'
|
|
|
+ env.URL = "fatboar.foodgame.fr"
|
|
|
+ env.BACKUP_CONTAINER = "mongodb-backup-prod"
|
|
|
+ } else {
|
|
|
+ error "Branche non gérée : ${env.BRANCH_NAME}"
|
|
|
}
|
|
|
+ echo "Déploiement sur l'environnement ${env.ENV} (${env.URL})"
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- stage('Stop Containers') {
|
|
|
+
|
|
|
+ stage('Install Dependencies & Test') {
|
|
|
steps {
|
|
|
sh '''
|
|
|
- docker ps | grep "workflow_" -v | awk -F " " '{ if(NR>1) print $1}' | xargs docker kill || true
|
|
|
- docker system prune -f
|
|
|
- '''
|
|
|
+ npm install --legacy-peer-deps
|
|
|
+ npm run test -- --no-watch --no-progress --browsers=ChromeHeadless
|
|
|
+ '''
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- stage('SonarQube Analysis') {
|
|
|
+ stage('SonarQube Analysis') {
|
|
|
steps {
|
|
|
script {
|
|
|
- def scannerHome = tool name: 'SonarQube Scanner', type: 'hudson.plugins.sonar.SonarRunnerInstallation';
|
|
|
- withSonarQubeEnv('SonarQube') { // Nom du serveur SonarQube configuré dans Jenkins
|
|
|
+ def scannerHome = tool name: 'SonarQube Scanner', type: 'hudson.plugins.sonar.SonarRunnerInstallation'
|
|
|
+ withSonarQubeEnv('SonarQube') {
|
|
|
sh """
|
|
|
${scannerHome}/bin/sonar-scanner \
|
|
|
-Dsonar.projectKey=FatboarProject-${env.BRANCH_NAME} \
|
|
|
@@ -69,38 +62,83 @@ pipeline {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- stage('Build & Deploy') {
|
|
|
- steps {
|
|
|
- sh '''
|
|
|
- docker-compose stop
|
|
|
- docker-compose build --no-cache
|
|
|
- docker-compose up -d --force-recreate --remove-orphans
|
|
|
- '''
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
-
|
|
|
+ stage('Stop & Clean Containers') {
|
|
|
+ steps {
|
|
|
+ sh """
|
|
|
+ docker ps | grep "workflow_" -v | awk '{if(NR>1) print \$1}' | xargs docker kill || true
|
|
|
+ docker-compose -f ${env.COMPOSE_FILE} down || true
|
|
|
+ docker system prune -f
|
|
|
+ """
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ stage('Build & Deploy') {
|
|
|
+ steps {
|
|
|
+ sh """
|
|
|
+ docker-compose -f ${env.COMPOSE_FILE} build --no-cache
|
|
|
+ docker-compose -f ${env.COMPOSE_FILE} up -d --force-recreate --remove-orphans
|
|
|
+ """
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // stage('Backup') {
|
|
|
+ // steps {
|
|
|
+ // script {
|
|
|
+ // echo "Lancement du backup sur le container ${env.BACKUP_CONTAINER}"
|
|
|
+ // def backupCmd = "docker exec ${env.BACKUP_CONTAINER} /backup.sh || echo '⚠️ Backup ${env.ENV.toUpperCase()} échoué'"
|
|
|
+ // sh backupCmd
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+
|
|
|
+ stage('Push to Private Registry (Optional)') {
|
|
|
+ when {
|
|
|
+ anyOf {
|
|
|
+ branch 'dev'
|
|
|
+ branch 'master'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ steps {
|
|
|
+ script {
|
|
|
+ docker.withRegistry("https://${DOCKER_REGISTRY}", 'nexus') {
|
|
|
+ try {
|
|
|
+ echo "Pull image from registry"
|
|
|
+ docker.image("${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}").pull()
|
|
|
+ } catch (Exception e) {
|
|
|
+ echo "Build and push image"
|
|
|
+ sh """
|
|
|
+ docker pull ${IMAGE_NAME}:${IMAGE_TAG}
|
|
|
+ docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
|
|
|
+ docker push ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
|
|
|
+ """
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
post {
|
|
|
success {
|
|
|
- echo "Pipeline exécutée avec succès pour la branche ${env.BRANCH_NAME}."
|
|
|
+ echo "✅ Déploiement réussi sur ${env.ENV} !"
|
|
|
}
|
|
|
failure {
|
|
|
- echo "Échec du pipeline pour la branche ${env.BRANCH_NAME}."
|
|
|
+ echo "❌ Échec du pipeline sur ${env.ENV}."
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
|
// pipeline {
|
|
|
// agent any
|
|
|
// environment {
|
|
|
// NODEJS_HOME = "${tool 'NodeJS'}"
|
|
|
// PATH = "${env.NODEJS_HOME}/bin:${env.PATH}"
|
|
|
// DEV_URL = "dev.foodgame.fr"
|
|
|
-// PREPROD_URL = "preprod.foodgame.fr"
|
|
|
+// dev_URL = "dev.foodgame.fr"
|
|
|
// PROD_URL = "prod.foodgame.fr"
|
|
|
// }
|
|
|
// stages {
|
|
|
@@ -111,7 +149,7 @@ pipeline {
|
|
|
// if (env.BRANCH_NAME == 'test') {
|
|
|
// echo "Déploiement sur DEV (${DEV_URL})"
|
|
|
// } else if (env.BRANCH_NAME == 'dev') {
|
|
|
-// echo "Déploiement sur PREPROD (${PREPROD_URL})"
|
|
|
+// echo "Déploiement sur dev (${dev_URL})"
|
|
|
// } else if (env.BRANCH_NAME == 'master') {
|
|
|
// echo "Déploiement sur PROD (${PROD_URL})"
|
|
|
// } else {
|
|
|
@@ -254,7 +292,7 @@ pipeline {
|
|
|
// // }
|
|
|
|
|
|
|
|
|
-// // // stage("Push preprod images to nexus")
|
|
|
+// // // stage("Push dev images to nexus")
|
|
|
// // // {
|
|
|
// // // docker.withRegistry('http://localhost:8083','885ef60c-9352-489a-bd1c-e4b695747c21')
|
|
|
// // // {
|