diff --git a/Jenkinsfile b/Jenkinsfile index b63fe07..978797b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -10,7 +10,14 @@ pipeline { environment { CI_NETWORK = "tiptop-ci-${BUILD_NUMBER}" CI_DATABASE = "tiptop-ci-db-${BUILD_NUMBER}" + DATABASE_URL = "postgresql://tiptop_ci:tiptop_ci_password@${CI_DATABASE}:5432/the_tip_top_ci" + + REGISTRY = "localhost:5000" + IMAGE_TAG = "${BUILD_NUMBER}" + + BACKEND_IMAGE = "${REGISTRY}/the-tip-top/backend" + FRONTEND_IMAGE = "${REGISTRY}/the-tip-top/frontend" } stages { @@ -23,15 +30,14 @@ pipeline { stage('Vérification du workspace') { steps { sh ''' - echo "Workspace Jenkins : ${WORKSPACE}" - - ls -lah backend - ls -lah frontend - test -f backend/package.json test -f backend/package-lock.json test -f frontend/package.json test -f frontend/package-lock.json + test -f deploy/dev/docker-compose.yml + + echo "Commit : ${GIT_COMMIT}" + echo "Tag Docker : ${IMAGE_TAG}" ''' } } @@ -59,7 +65,6 @@ pipeline { fi if [ "$i" -eq 30 ]; then - echo "PostgreSQL ne répond pas." docker logs "${CI_DATABASE}" exit 1 fi @@ -72,6 +77,7 @@ pipeline { --volumes-from furious-jenkins \ --user "$(id -u):$(id -g)" \ -e HOME=/tmp \ + -e NPM_CONFIG_CACHE=/tmp/.npm \ -e DATABASE_URL="${DATABASE_URL}" \ -e JWT_SECRET=jenkins_ci_secret \ -e NODE_ENV=test \ @@ -87,13 +93,14 @@ pipeline { } } - stage('Frontend - Lint and Build') { + stage('Frontend - Lint et Build') { steps { sh ''' docker run --rm \ --volumes-from furious-jenkins \ --user "$(id -u):$(id -g)" \ -e HOME=/tmp \ + -e NPM_CONFIG_CACHE=/tmp/.npm \ -w "${WORKSPACE}/frontend" \ node:22-alpine \ sh -c " @@ -105,12 +112,68 @@ pipeline { } } - stage('Docker Build') { + stage('Construction des images Docker') { steps { sh ''' + docker build \ + -t "${BACKEND_IMAGE}:${IMAGE_TAG}" \ + -t "${BACKEND_IMAGE}:latest" \ + backend + + docker build \ + --build-arg VITE_API_URL=http://192.168.1.23:5001 \ + -t "${FRONTEND_IMAGE}:${IMAGE_TAG}" \ + -t "${FRONTEND_IMAGE}:latest" \ + frontend + ''' + } + } + + stage('Publication dans le Registry') { + steps { + sh ''' + docker push "${BACKEND_IMAGE}:${IMAGE_TAG}" + docker push "${BACKEND_IMAGE}:latest" + + docker push "${FRONTEND_IMAGE}:${IMAGE_TAG}" + docker push "${FRONTEND_IMAGE}:latest" + ''' + } + } + + stage('Déploiement DEV') { + steps { + sh ''' + REGISTRY="${REGISTRY}" \ + IMAGE_TAG="${IMAGE_TAG}" \ docker compose \ - -f docker-compose.dev.yml \ - build + -p tiptop-dev \ + -f deploy/dev/docker-compose.yml \ + up -d \ + --pull always \ + --remove-orphans + + echo "Attente du backend DEV..." + + for i in $(seq 1 30); do + if curl -fsS http://localhost:5001/ >/dev/null; then + echo "Backend DEV opérationnel." + break + fi + + if [ "$i" -eq 30 ]; then + docker compose \ + -p tiptop-dev \ + -f deploy/dev/docker-compose.yml \ + logs --tail=100 + exit 1 + fi + + sleep 5 + done + + curl -fsS http://localhost:5173/ >/dev/null + echo "Frontend DEV opérationnel." ''' } } @@ -125,11 +188,11 @@ pipeline { } success { - echo 'Pipeline CI réussi.' + echo "Pipeline CI/CD réussi. Version DEV déployée : ${IMAGE_TAG}" } failure { - echo 'Pipeline CI en échec. Consulte la Console Output.' + echo "Pipeline CI/CD en échec. Consulte la Console Output." } } } diff --git a/backend/Dockerfile b/backend/Dockerfile index 771b161..f09f7a9 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -10,6 +10,6 @@ RUN npx prisma generate COPY . . -EXPOSE 3000 +EXPOSE 5000 CMD ["npm", "start"] diff --git a/deploy/dev/docker-compose.yml b/deploy/dev/docker-compose.yml new file mode 100644 index 0000000..95a170f --- /dev/null +++ b/deploy/dev/docker-compose.yml @@ -0,0 +1,74 @@ +services: + postgres: + image: postgres:16-alpine + restart: unless-stopped + + environment: + POSTGRES_USER: tiptop + POSTGRES_PASSWORD: tiptop_dev_password + POSTGRES_DB: the_tip_top_db + + volumes: + - tiptop_postgres_dev_data:/var/lib/postgresql/data + + healthcheck: + test: ["CMD-SHELL", "pg_isready -U tiptop -d the_tip_top_db"] + interval: 10s + timeout: 5s + retries: 10 + + networks: + - tiptop-dev + + backend: + image: ${REGISTRY}/the-tip-top/backend:${IMAGE_TAG} + restart: unless-stopped + + depends_on: + postgres: + condition: service_healthy + + environment: + PORT: 5000 + DATABASE_URL: postgresql://tiptop:tiptop_dev_password@postgres:5432/the_tip_top_db + JWT_SECRET: dev_secret_change_me + APP_URL: http://192.168.1.23:5001 + MAIL_HOST: smtp.gmail.com + MAIL_PORT: 587 + MAIL_USER: "" + MAIL_PASS: "" + MAIL_FROM: "The Tip Top " + + command: > + sh -c " + npx prisma migrate deploy && + npm run init:db && + npm start + " + + ports: + - "5001:5000" + + networks: + - tiptop-dev + + frontend: + image: ${REGISTRY}/the-tip-top/frontend:${IMAGE_TAG} + restart: unless-stopped + + depends_on: + - backend + + ports: + - "5173:80" + + networks: + - tiptop-dev + +volumes: + tiptop_postgres_dev_data: + name: the-tip-top_tiptop_postgres_dev_data + +networks: + tiptop-dev: + name: tiptop-dev