diff --git a/jenkinsfile b/jenkinsfile index 0331643..c696519 100644 --- a/jenkinsfile +++ b/jenkinsfile @@ -1,72 +1,114 @@ pipeline { - agent any - - tools { - maven 'mvn' - nodejs 'npm' - } + agent none environment { - JAVA_HOME = '/opt/java/openjdk' - PATH = "${JAVA_HOME}/bin:${env.PATH}" - SPRING_IMAGE_NAME = 'spring-jenkins' - ANGULAR_IMAGE_NAME = 'angular-jenkins' - IMAGE_TAG = 'latest' - COMPOSE_PROJECT = 'gameovergne-app' + REGISTRY = 'registry.vincent-guillet.fr' + API_IMAGE_DEV = "${REGISTRY}/gameovergne-api:dev-latest" + CLIENT_IMAGE_DEV= "${REGISTRY}/gameovergne-client:dev-latest" + API_IMAGE_PROD = "${REGISTRY}/gameovergne-api:prod-latest" + CLIENT_IMAGE_PROD = "${REGISTRY}/gameovergne-client:prod-latest" + COMPOSE_PROJECT = 'gameovergne-app' } stages { - stage('Checkout sur la branche dev') { - steps { - git branch: 'dev', url: 'https://gitea.vincent-guillet.fr/vincentguillet/gameovergne-app.git' - } - } - stage('Maven Build') { + // Build & push images (toujours sur ct-home-dev) + stage('Build & Push Docker Images') { + agent { label 'ct-home-dev' } + steps { + // Multi-branch friendly : Jenkins fait le checkout de la branche courante + checkout scm + + script { + // Choix des tags selon la branche + if (env.BRANCH_NAME == 'main') { + env.API_IMAGE = API_IMAGE_PROD + env.CLIENT_IMAGE = CLIENT_IMAGE_PROD + } else { + env.API_IMAGE = API_IMAGE_DEV + env.CLIENT_IMAGE = CLIENT_IMAGE_DEV + } + } + + // ----- Build API ----- dir('api') { - sh 'mvn clean package -DskipTests' + sh """ + echo "=== Build image API ${API_IMAGE} ===" + docker build -t ${API_IMAGE} . + """ } - } - } - stage('Angular Build') { - steps { + // ----- Build Client ----- dir('client') { - sh 'npm install' - sh 'npm run build' + sh """ + echo "=== Build image CLIENT ${CLIENT_IMAGE} ===" + docker build -t ${CLIENT_IMAGE} . + """ } + + // ----- Push vers registry ----- + // Si tu as des credentials, tu peux les utiliser ici via withCredentials + sh """ + echo "=== Push images vers ${REGISTRY} ===" + docker push ${API_IMAGE} + docker push ${CLIENT_IMAGE} + """ } } - stage('Spring Docker Build') { - steps { - sh 'docker build -t registry.vincent-guillet.fr/gameovergne-api:dev-latest ./api' + // Déploiement DEV (ct-home-dev, branche dev) + stage('Deploy DEV') { + when { + branch 'dev' } - } + agent { label 'ct-home-dev' } - stage('Angular Docker Build') { steps { - sh 'docker build -t registry.vincent-guillet.fr/gameovergne-client:dev-latest ./client' - } - } + checkout scm - stage('Deployment') { - steps { withEnv([ "DOCKER_HOST=unix:///var/run/docker.sock", "COMPOSE_PROJECT_NAME=${env.COMPOSE_PROJECT}" ]) { - sh ''' - echo "=== Nettoyage des anciens conteneurs nommés ===" + sh """ + echo "=== [DEV] Nettoyage anciens conteneurs ===" docker rm -f gameovergne-api gameovergne-client 2>/dev/null || true - echo "=== docker-compose down sur le projet courant ===" - docker-compose down -v || true + echo "=== [DEV] docker-compose down ===" + docker-compose -f docker-compose.dev.yml down -v || true - echo "=== (Re)création de la stack MySQL + Spring + Angular ===" - docker-compose up -d mysql spring angular - ''' + echo "=== [DEV] docker-compose up ===" + docker-compose -f docker-compose.dev.yml up -d mysql spring angular + """ + } + } + } + + // Déploiement PROD (ct-home-projets, branche main) + stage('Deploy PROD') { + when { + branch 'main' + } + agent { label 'ct-home-projets' } + + steps { + checkout scm + + withEnv([ + "DOCKER_HOST=unix:///var/run/docker.sock", + "COMPOSE_PROJECT_NAME=${env.COMPOSE_PROJECT}" + ]) { + sh """ + echo "=== [PROD] Nettoyage anciens conteneurs ===" + docker rm -f gameovergne-api-prod gameovergne-client-prod 2>/dev/null || true + + echo "=== [PROD] docker-compose down ===" + docker-compose -f docker-compose.prod.yml down -v || true + + echo "=== [PROD] docker-compose up ===" + docker-compose -f docker-compose.prod.yml up -d mysql spring angular + """ } } }