ci: publish Docker images and deploy development environment

This commit is contained in:
2026-08-04 13:58:08 +00:00
parent 4b04bf48e9
commit 95aae8a63a
3 changed files with 150 additions and 13 deletions

87
Jenkinsfile vendored
View File

@@ -10,7 +10,14 @@ pipeline {
environment { environment {
CI_NETWORK = "tiptop-ci-${BUILD_NUMBER}" CI_NETWORK = "tiptop-ci-${BUILD_NUMBER}"
CI_DATABASE = "tiptop-ci-db-${BUILD_NUMBER}" CI_DATABASE = "tiptop-ci-db-${BUILD_NUMBER}"
DATABASE_URL = "postgresql://tiptop_ci:tiptop_ci_password@${CI_DATABASE}:5432/the_tip_top_ci" 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 { stages {
@@ -23,15 +30,14 @@ pipeline {
stage('Vérification du workspace') { stage('Vérification du workspace') {
steps { steps {
sh ''' sh '''
echo "Workspace Jenkins : ${WORKSPACE}"
ls -lah backend
ls -lah frontend
test -f backend/package.json test -f backend/package.json
test -f backend/package-lock.json test -f backend/package-lock.json
test -f frontend/package.json test -f frontend/package.json
test -f frontend/package-lock.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 fi
if [ "$i" -eq 30 ]; then if [ "$i" -eq 30 ]; then
echo "PostgreSQL ne répond pas."
docker logs "${CI_DATABASE}" docker logs "${CI_DATABASE}"
exit 1 exit 1
fi fi
@@ -72,6 +77,7 @@ pipeline {
--volumes-from furious-jenkins \ --volumes-from furious-jenkins \
--user "$(id -u):$(id -g)" \ --user "$(id -u):$(id -g)" \
-e HOME=/tmp \ -e HOME=/tmp \
-e NPM_CONFIG_CACHE=/tmp/.npm \
-e DATABASE_URL="${DATABASE_URL}" \ -e DATABASE_URL="${DATABASE_URL}" \
-e JWT_SECRET=jenkins_ci_secret \ -e JWT_SECRET=jenkins_ci_secret \
-e NODE_ENV=test \ -e NODE_ENV=test \
@@ -87,13 +93,14 @@ pipeline {
} }
} }
stage('Frontend - Lint and Build') { stage('Frontend - Lint et Build') {
steps { steps {
sh ''' sh '''
docker run --rm \ docker run --rm \
--volumes-from furious-jenkins \ --volumes-from furious-jenkins \
--user "$(id -u):$(id -g)" \ --user "$(id -u):$(id -g)" \
-e HOME=/tmp \ -e HOME=/tmp \
-e NPM_CONFIG_CACHE=/tmp/.npm \
-w "${WORKSPACE}/frontend" \ -w "${WORKSPACE}/frontend" \
node:22-alpine \ node:22-alpine \
sh -c " sh -c "
@@ -105,12 +112,68 @@ pipeline {
} }
} }
stage('Docker Build') { stage('Construction des images Docker') {
steps { steps {
sh ''' 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 \ docker compose \
-f docker-compose.dev.yml \ -p tiptop-dev \
build -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 { success {
echo 'Pipeline CI réussi.' echo "Pipeline CI/CD réussi. Version DEV déployée : ${IMAGE_TAG}"
} }
failure { failure {
echo 'Pipeline CI en échec. Consulte la Console Output.' echo "Pipeline CI/CD en échec. Consulte la Console Output."
} }
} }
} }

View File

@@ -10,6 +10,6 @@ RUN npx prisma generate
COPY . . COPY . .
EXPOSE 3000 EXPOSE 5000
CMD ["npm", "start"] CMD ["npm", "start"]

View File

@@ -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 <no-reply@tiptop.local>"
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