Bladeren bron

configuration sur les environnements

DESKTOP-SMCIPAV\falko 5 maanden geleden
bovenliggende
commit
513a9dbf73

+ 95 - 57
Jenkinsfile

@@ -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')
 // // 	// 	{

+ 5 - 5
README.md

@@ -159,15 +159,15 @@ https://nexus.foodgame.fr/nexus/#welcome
 user : admin
 Mp : azerty10
 
-# Angular(Preprod)
+# Angular(dev)
 
-https://angular-preprod.foodgame.fr
+https://angular-dev.foodgame.fr
 http://51.159.4.88:8080
 
-# Express(Preprod)
+# Express(dev)
 
-Base Api: https://api-preprod.foodgame.fr
-Metrics: https://api-preprod.foodgame.fr/metrics
+Base Api: https://api-dev.foodgame.fr
+Metrics: https://api-dev.foodgame.fr/metrics
 
 # Angular(Prod)
 

+ 2 - 2
angular-client/server.ts

@@ -57,7 +57,7 @@ export function app() {
       providers: [
         { provide: APP_BASE_HREF, useValue: req.baseUrl },
         // Fournit l'URL canonique pour les balises <link rel="canonical">
-        { provide: 'CANONICAL_URL', useValue: `https://angular-preprod.foodgame.fr${req.originalUrl}` }
+        { provide: 'CANONICAL_URL', useValue: `https://angular-dev.foodgame.fr${req.originalUrl}` }
       ]
     });
   });
@@ -136,7 +136,7 @@ export * from './src/main.server';
 //       req,
 //       providers: [
 //         { provide: APP_BASE_HREF, useValue: req.baseUrl },
-//         { provide: 'CANONICAL_URL', useValue: `https://angular-preprod.foodgame.fr${req.originalUrl}` }
+//         { provide: 'CANONICAL_URL', useValue: `https://angular-dev.foodgame.fr${req.originalUrl}` }
 //       ]
 //     });
 //   });

+ 1 - 1
angular-client/src/environments/environment.prod.ts

@@ -1,4 +1,4 @@
 export const environment = {
   production: true,
-  apiUrl: `https://api-preprod.foodgame.fr`,
+  apiUrl: `https://api-dev.foodgame.fr`,
 };

+ 1 - 1
angular-client/src/environments/environment.ts

@@ -5,7 +5,7 @@
 export const environment = {
   production: false,
   name: "(dev)",
-  apiUrl: `https://api-preprod.foodgame.fr`,
+  apiUrl: `https://api-dev.foodgame.fr`,
 };
 
 /*

+ 2 - 2
angular-client/src/index.html

@@ -17,8 +17,8 @@
   <!-- Open Graph / Facebook -->
   <meta property="og:title" content="Fatboar - Jeu-Concours">
   <meta property="og:description" content="Tentez votre chance pour gagner un Range Rover et d’autres prix avec Fatboar.">
-  <meta property="og:image" content="https://angular-preprod.foodgame.fr/assets/fatboar-og.jpg">
-  <meta property="og:url" content="https://angular-preprod.foodgame.fr">
+  <meta property="og:image" content="https://angular-dev.foodgame.fr/assets/fatboar-og.jpg">
+  <meta property="og:url" content="https://angular-dev.foodgame.fr">
   <meta property="og:type" content="website">
 
   <!-- Twitter Card -->

+ 2 - 2
build/docker/apache/Dockerfile

@@ -10,10 +10,10 @@ RUN docker-php-ext-install opcache \
     && docker-php-ext-install pdo_mysql 
 
 #COPY $PWD/build/docker/apache/app_php.ini /usr/local/etc/php/conf.d/app_php.ini
-COPY $PWD/build/docker/apache/apache.conf /etc/apache2/sites-available/angular-preprod.foodgame.fr.conf
+COPY $PWD/build/docker/apache/apache.conf /etc/apache2/sites-available/angular-dev.foodgame.fr.conf
 
 RUN a2dissite 000-default default-ssl
-RUN a2ensite angular-preprod.foodgame.fr
+RUN a2ensite angular-dev.foodgame.fr
 RUN a2enmod ssl
 RUN a2enmod proxy proxy_http
 RUN a2enmod rewrite

+ 3 - 3
build/docker/apache/apache.conf

@@ -1,5 +1,5 @@
 <VirtualHost *:80>
-    ServerName angular-preprod.foodgame.fr
+    ServerName angular-dev.foodgame.fr
     DocumentRoot /var/www/html/browser
 
     <Directory /var/www/html/browser>
@@ -24,8 +24,8 @@
 
 <VirtualHost *:443>
    DocumentRoot /var/www/html/browser 
-   ServerName angular-preprod.foodgame.fr
-   ServerAlias angular-preprod.foodgame.fr 
+   ServerName angular-dev.foodgame.fr
+   ServerAlias angular-dev.foodgame.fr 
    #SSLEnable
    #SSLEngine ON
    #SSLCertificateFile path/to/server.crt

+ 3 - 3
build/docker/httpd/httpd.conf

@@ -227,8 +227,8 @@ Group daemon
 <VirtualHost *:80>
     # Le premier serveur virtuel de la liste est aussi le
     # serveur par défaut pour *:80
-    ServerName  angular-preprod.foodgame.fr
-    ServerAlias www.angular-preprod.foodgame.fr
+    ServerName  angular-dev.foodgame.fr
+    ServerAlias www.angular-dev.foodgame.fr
     DocumentRoot "/usr/local/apache2/htdocs/"
     <Directory /usr/local/apache2/htdocs/>
         Options +Indexes +FollowSymlinks
@@ -252,7 +252,7 @@ ServerAdmin you@example.com
 #
 # If your host doesn't have a registered DNS name, enter its IP address here.
 #
-ServerName angular-preprod.foodgame.fr
+ServerName angular-dev.foodgame.fr
 
 #
 # Deny access to the entirety of your server's filesystem. You must

+ 49 - 55
docker-compose.yml

@@ -7,41 +7,34 @@ networks:
       name: web
 
 volumes:
-  mongo_data_preprod:
-    driver: local
-    driver_opts:
-      type: none
-      o: bind
-      device: /srv/mongo/data_preprod
-  mongo_backups_preprod:
-    driver: local
+  mongo_data_dev:
+  mongo_backups_dev:
 
 services:
-  express_preprod:
+  express_dev:
     build:
       context: ./express-server
     ports:
-      - "4000:4000"
+      - "4001:4000"  # port hôte différent pour éviter conflit local
     networks:
       - web
       - private
     labels:
       - traefik.enable=true
-      - traefik.http.routers.express_preprod.rule=Host(`api-preprod.foodgame.fr`)
-      - traefik.http.services.express_preprod.loadbalancer.server.port=4000
-      - traefik.http.routers.express_preprod.entrypoints=websecure
-      - traefik.http.routers.express_preprod.tls.certresolver=myresolver
+      - traefik.http.routers.express_dev.rule=Host(`api-dev.foodgame.fr`)
+      - traefik.http.services.express_dev.loadbalancer.server.port=4000
+      - traefik.http.routers.express_dev.entrypoints=websecure
+      - traefik.http.routers.express_dev.tls.certresolver=myresolver
     depends_on:
-      - database_preprod
+      - database_dev
     environment:
-      - MONGODB_URI=mongodb://admin:azerty10@database_preprod:27017/mean-fatboar-db?authSource=admin
+      - MONGODB_URI=mongodb://admin:azerty10@database_dev:27017/mean-fatboar-db?authSource=admin
     restart: always
 
-  database_preprod:
+  database_dev:
     image: mongo:4.4.6
     volumes:
-      - ./backup:/backup
-      - mongo_data_preprod:/data/db
+      - mongo_data_dev:/data/db
     environment:
       - MONGO_INITDB_ROOT_USERNAME=admin
       - MONGO_INITDB_ROOT_PASSWORD=azerty10
@@ -50,13 +43,13 @@ services:
       - private
     restart: always
 
-  mongodb-backup-preprod:
+  mongodb-backup-dev:
     image: tiredofit/mongodb-backup:latest
-    container_name: mongodb-backup-preprod
+    container_name: mongodb-backup-dev
     volumes:
-      - mongo_backups_preprod:/backup
+      - mongo_backups_dev:/backup
     environment:
-      - MONGODB_HOST=database_preprod
+      - MONGODB_HOST=database_dev
       - MONGODB_PORT=27017
       - MONGODB_USER=admin
       - MONGODB_PASS=azerty10
@@ -71,31 +64,32 @@ services:
       - NOTIFICATION_TYPE=none
       - DEBUG_MODE=TRUE
       - CONTAINER_ENABLE_MONITORING=TRUE
-      - CONTAINER_NAME=mongodb-backup-preprod
+      - CONTAINER_NAME=mongodb-backup-dev
     depends_on:
-      - database_preprod
+      - database_dev
     networks:
       - private
     restart: unless-stopped
 
-  angular_ssr_preprod:
+  angular_ssr_dev:
     build:
       context: ./
       dockerfile: build/docker/angular-ssr/Dockerfile
-    # ❌ ports: supprimé
+    ports:
+      - "4002:4000"
     networks:
       - web
       - private
     labels:
       - traefik.enable=true
-      - traefik.http.routers.angular_ssr_preprod.rule=Host(`angular-preprod.foodgame.fr`)
-      - traefik.http.services.angular_ssr_preprod.loadbalancer.server.port=4000
-      - traefik.http.routers.angular_ssr_preprod.entrypoints=websecure
-      - traefik.http.routers.angular_ssr_preprod.tls.certresolver=myresolver
+      - traefik.http.routers.angular_ssr_dev.rule=Host(`angular-dev.foodgame.fr`)
+      - traefik.http.services.angular_ssr_dev.loadbalancer.server.port=4000
+      - traefik.http.routers.angular_ssr_dev.entrypoints=websecure
+      - traefik.http.routers.angular_ssr_dev.tls.certresolver=myresolver
     restart: always
 
   
-  # apache_preprod:
+  # apache_dev:
   #   build:
   #     context: ./
   #     dockerfile: build/docker/apache/Dockerfile
@@ -108,10 +102,10 @@ services:
   #     - /var/log:/var/log/apache2
   #   labels:
   #     - traefik.enable=true
-  #     - traefik.http.routers.apache_preprod.rule=Host(`angular-preprod.foodgame.fr`)
-  #     - traefik.http.services.apache_preprod.loadbalancer.server.port=80
-  #     - traefik.http.routers.apache_preprod.entrypoints=websecure
-  #     - traefik.http.routers.apache_preprod.tls.certresolver=myresolver
+  #     - traefik.http.routers.apache_dev.rule=Host(`angular-dev.foodgame.fr`)
+  #     - traefik.http.services.apache_dev.loadbalancer.server.port=80
+  #     - traefik.http.routers.apache_dev.entrypoints=websecure
+  #     - traefik.http.routers.apache_dev.tls.certresolver=myresolver
   #   restart: always
 
 
@@ -152,10 +146,10 @@ services:
 
 # volumes:
 # #  app_data: {}
-#   mongo_data_preprod:
+#   mongo_data_dev:
 
 # services:
-#   express_preprod:
+#   express_dev:
 #     build:
 #       context: ./express-server
 #     ports:
@@ -165,32 +159,32 @@ services:
 #       - private
 #     labels:
 #       - traefik.enable=true
-#       - traefik.http.routers.express_preprod.rule=Host(`api-preprod.foodgame.fr`)
-#       - traefik.http.services.express_preprod.loadbalancer.server.port=4000
-#       - traefik.http.routers.express_preprod.entrypoints=websecure
-#       - traefik.http.routers.express_preprod.tls.certresolver=myresolver
+#       - traefik.http.routers.express_dev.rule=Host(`api-dev.foodgame.fr`)
+#       - traefik.http.services.express_dev.loadbalancer.server.port=4000
+#       - traefik.http.routers.express_dev.entrypoints=websecure
+#       - traefik.http.routers.express_dev.tls.certresolver=myresolver
 #     links:
-#       - database_preprod
+#       - database_dev
 #     restart: always
 
 
-#   database_preprod:
+#   database_dev:
 # #   container_name: mongo_"${ENV}"
 #     image: mongo:4.4.6
 #     ports:
 #       - "27017:27017"
 #     volumes:
 #       - ./backup:/backup
-#       - mongo_data_preprod:/data/db
-#       # - /var/lib/mongodb/data_preprod:/data/db
+#       - mongo_data_dev:/data/db
+#       # - /var/lib/mongodb/data_dev:/data/db
 # #     - database:/data/database
 #     labels:
 #       - traefik.enable=true
-#       - traefik.http.routers.database_preprod.rule=Host(`mongodb-preprod.foodgame.fr`)
+#       - traefik.http.routers.database_dev.rule=Host(`mongodb-dev.foodgame.fr`)
 # #     - traefik.http.routers.apache_prod.rule=Host(`${URLMONGO}`)
-#       - traefik.http.services.database_preprod.loadbalancer.server.port=27017
-#       - traefik.http.routers.database_preprod.entrypoints=websecure
-#       - traefik.http.routers.database_preprod.tls.certresolver=myresolver  
+#       - traefik.http.services.database_dev.loadbalancer.server.port=27017
+#       - traefik.http.routers.database_dev.entrypoints=websecure
+#       - traefik.http.routers.database_dev.tls.certresolver=myresolver  
 #     networks:
 #       - web
 #       - private
@@ -198,7 +192,7 @@ services:
 #       #- pipeline-test-FatboarProject_private
 #     restart: always
 
-#   apache_preprod:
+#   apache_dev:
 # #   container_name: apache_"${ENV}"    
 #     build:  
 #       context: ./
@@ -215,11 +209,11 @@ services:
 #       - /var/log:/var/log/apache2
 #     labels:
 #       - traefik.enable=true
-#       - traefik.http.routers.apache_preprod.rule=Host(`angular-preprod.foodgame.fr`)
+#       - traefik.http.routers.apache_dev.rule=Host(`angular-dev.foodgame.fr`)
 # #     - traefik.http.routers.apache_prod.rule=Host(`${URLANGULAR}`)
-#       - traefik.http.services.apache_preprod.loadbalancer.server.port=80
-#       - traefik.http.routers.apache_preprod.entrypoints=websecure
-#       - traefik.http.routers.apache_preprod.tls.certresolver=myresolver  
+#       - traefik.http.services.apache_dev.loadbalancer.server.port=80
+#       - traefik.http.routers.apache_dev.entrypoints=websecure
+#       - traefik.http.routers.apache_dev.tls.certresolver=myresolver  
 #     restart: always  
 
 

+ 2 - 2
express-server/index.js

@@ -35,7 +35,7 @@ app.use(express.urlencoded({ extended: true }));
 
 // CORS (configuration d'origine conservée)
 app.use(cors({
-  origin: 'https://angular-preprod.foodgame.fr',
+  origin: 'https://angular-dev.foodgame.fr',
   optionsSuccessStatus: 200
 }));
 
@@ -69,7 +69,7 @@ app.use('/api/restaurants', restaurantRoutes);
 
 // Proxy vers Angular SSR EN DERNIER (pour toutes les autres routes)
 app.use('/', createProxyMiddleware({
-  target: 'http://angular_ssr_preprod:4000',
+  target: 'http://angular_ssr_dev:4000',
   changeOrigin: true,
   // Supprimez pathFilter - les routes API sont déjà gérées au-dessus
 }));

+ 1 - 1
express-server/lib/db.js

@@ -1,7 +1,7 @@
 const mongoose = require('mongoose');
 
 // Chaîne de connexion avec authentification (identifiants en clair)
-const db = 'mongodb://admin:azerty10@database_preprod:27017/mean-fatboar-db?authSource=admin';
+const db = 'mongodb://admin:azerty10@database_dev:27017/mean-fatboar-db?authSource=admin';
 
 const options = {
   useNewUrlParser: true,