diff --git a/.github/workflows/ci-dev.yml b/.github/workflows/ci-dev.yml index 1dd7177..a8a5487 100644 --- a/.github/workflows/ci-dev.yml +++ b/.github/workflows/ci-dev.yml @@ -30,7 +30,6 @@ jobs: cd ../result-service && npm ci cd ../../archive/frontendOld && npm ci - - name: Run linting run: | cd backend/api-gateway && npm run lint || echo "No lint" @@ -86,22 +85,41 @@ jobs: if: always() run: docker compose -f container/compose/docker-compose.dev.yml down -v - docker-build: - name: Build All Docker Images + docker-push: + name: Build & Push Docker Images runs-on: ubuntu-latest - needs: lint-and-test - + needs: integration-test + steps: - name: Checkout code uses: actions/checkout@v4 - - name: Create .env files for build + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build & Push API Gateway run: | - cp container/env/gateway.env.example backend/api-gateway/.env - cp container/env/auth.env.example backend/auth-service/.env - cp container/env/quiz.env.example backend/quiz-service/.env - cp container/env/result.env.example backend/result-service/.env - cp archive/frontendOld/.env.example archive/frontendOld/.env + docker build -f container/dockerfiles/dev/gateway.dev.Dockerfile \ + -t mintri269/qms-gateway:dev backend/api-gateway + docker push mintri269/qms-gateway:dev + + - name: Build & Push Auth Service + run: | + docker build -f container/dockerfiles/dev/auth.dev.Dockerfile \ + -t mintri269/qms-auth:dev backend/auth-service + docker push mintri269/qms-auth:dev + + - name: Build & Push Quiz Service + run: | + docker build -f container/dockerfiles/dev/quiz.dev.Dockerfile \ + -t mintri269/qms-quiz:dev backend/quiz-service + docker push mintri269/qms-quiz:dev - - name: Build all images - run: docker compose -f container/compose/docker-compose.dev.yml build + - name: Build & Push Result Service + run: | + docker build -f container/dockerfiles/dev/result.dev.Dockerfile \ + -t mintri269/qms-result:dev backend/result-service + docker push mintri269/qms-result:dev diff --git a/container/compose/docker-compose.image.yml b/container/compose/docker-compose.image.yml new file mode 100644 index 0000000..74cef20 --- /dev/null +++ b/container/compose/docker-compose.image.yml @@ -0,0 +1,113 @@ +version: "3.9" + +services: + # --------------------------------------------------- + # 🚪 API Gateway + # --------------------------------------------------- + gateway: + image: mintri269/qms-gateway:dev + container_name: gateway_image + ports: + - "8000:8000" # public gateway + env_file: + - ../../backend/api-gateway/.env + depends_on: + - auth-service + - quiz-service + - result-service + networks: + - quiz-net + + # --------------------------------------------------- + # 🔐 Auth Service + # --------------------------------------------------- + auth-service: + image: mintri269/qms-auth:dev + container_name: auth_service_image + expose: + - "5000" + env_file: + - ../../backend/auth-service/.env + depends_on: + mysql-db: + condition: service_healthy + networks: + - quiz-net + + # --------------------------------------------------- + # 🧠 Quiz Service + # --------------------------------------------------- + quiz-service: + image: mintri269/qms-quiz:dev + container_name: quiz_service_image + expose: + - "5001" + env_file: + - ../../backend/quiz-service/.env + depends_on: + mysql-db: + condition: service_healthy + networks: + - quiz-net + + # --------------------------------------------------- + # 📊 Result Service + # --------------------------------------------------- + result-service: + image: mintri269/qms-result:dev + container_name: result_service_image + expose: + - "5002" + env_file: + - ../../backend/result-service/.env + depends_on: + mysql-db: + condition: service_healthy + networks: + - quiz-net + + # --------------------------------------------------- + # 🛢️ MySQL — Shared runtime + # --------------------------------------------------- + mysql-db: + image: mysql:8.0 + container_name: mysql_image + environment: + MYSQL_ROOT_PASSWORD: root + ports: + - "3306:3306" + volumes: + - mysql_data:/var/lib/mysql + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot"] + interval: 5s + timeout: 3s + retries: 10 + start_period: 30s + networks: + - quiz-net + + # --------------------------------------------------- + # ⚡ Redis — Cache / Queue / Session + # --------------------------------------------------- + redis: + image: redis:7-alpine + container_name: redis_image + ports: + - "6379:6379" + command: ["redis-server", "--appendonly", "yes"] + volumes: + - redis_data:/data + networks: + - quiz-net + +# --------------------------------------------------- +# 🌐 Networks & Volumes +# --------------------------------------------------- +networks: + quiz-net: + name: quiz-net + +volumes: + mysql_data: + redis_data: diff --git a/container/scripts/setup.dev.sh b/container/scripts/setup.dev.sh index 5006639..5c0af33 100755 --- a/container/scripts/setup.dev.sh +++ b/container/scripts/setup.dev.sh @@ -2,6 +2,10 @@ echo "🚀 Setting up Quiz Application..." +if [ ! -f archive/frontendOld/.env ]; then + cp archive/frontendOld/.env.example archive/frontendOld/.env + echo "✅ Created archive/frontendOld/.env" +fi # Copy .env files if not exist if [ ! -f backend/api-gateway/.env ]; then cp container/env/gateway.env.example backend/api-gateway/.env