diff --git a/Jenkinsfile.cd b/Jenkinsfile.cd index ee5eeba..5a0532c 100644 --- a/Jenkinsfile.cd +++ b/Jenkinsfile.cd @@ -117,7 +117,7 @@ pipeline { DEPLOY ========================= */ - stage('Deploy frontend & backend') { + stage('Deploy (docker compose)') { when { branch 'main' } @@ -137,54 +137,12 @@ pipeline { sh ''' set -e - : "${BACKEND_PORT:?Missing BACKEND_PORT}" - : "${BACKEND_HEALTH_URL:?Missing BACKEND_HEALTH_URL}" - : "${FRONTEND_PORT:?Missing FRONTEND_PORT}" - : "${FRONTEND_HEALTH_URL:?Missing FRONTEND_HEALTH_URL}" - echo "Deploying backend ${BUILD_NUMBER}" - docker tag cafeteria-backend:latest cafeteria-backend:previous || true - docker rm -f cafeteria-backend 2>/dev/null || true + echo "BACKEND_TAG=${BUILD_NUMBER}" > .env + echo "FRONTEND_TAG=${BUILD_NUMBER}" >> .env - docker run -d \ - --name cafeteria-backend \ - -p "$BACKEND_PORT":"$BACKEND_PORT" \ - cafeteria-backend:latest - - sleep 5 - - if ! curl -fs "$BACKEND_HEALTH_URL"; then - echo "Backend failed, rolling back" - docker rm -f cafeteria-backend - docker run -d \ - --name cafeteria-backend \ - -p "$BACKEND_PORT":"$BACKEND_PORT" \ - cafeteria-backend:previous - exit 1 - fi - - echo "Deploying frontend ${BUILD_NUMBER}" - - docker tag cafeteria-frontend:latest cafeteria-frontend:previous || true - docker rm -f cafeteria-frontend 2>/dev/null || true - - docker run -d \ - --name cafeteria-frontend \ - -p "$FRONTEND_PORT":80 \ - cafeteria-frontend:latest - - sleep 3 - - if ! curl -fs "$FRONTEND_HEALTH_URL"; then - echo "Frontend failed, rolling back" - docker rm -f cafeteria-frontend - docker run -d \ - --name cafeteria-frontend \ - -p "$FRONTEND_PORT":80 \ - cafeteria-frontend:previous - exit 1 - fi + docker compose up -d ''' } } diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..9d20851 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,39 @@ +version: "3.9" + +services: + backend: + build: + context: ./backend + image: cafeteria-backend:${BACKEND_TAG} + container_name: cafeteria-backend + ports: + - "8000:8000" + environment: + - JENKINS_BASE_URL: ${JENKINS_BASE_URL} + - JENKINS_JOB_NAME: ${JENKINS_JOB_NAME} + - JENKINS_USER: ${JENKINS_USER} + - JENKINS_TOKEN: ${JENKINS_TOKEN} + restart: unless-stopped + healthcheck: + test: + [ + "CMD", + "python", + "-c", + "import urllib.request; urllib.request.urlopen('http://localhost:8000/health').read()" + ] + interval: 10s + timeout: 3s + retries: 5 + + frontend: + build: + context: ./frontend + image: cafeteria-frontend:${fRONTEND_TAG} + container_name: cafeteria-frontend + ports: + - "80:80" + depends_on: + backend: + condition: service_healthy + restart: unless-stopped