diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 0000000..2362e1c --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,52 @@ +name: Docker Build & Push Services + +on: + push: + branches: [ "master"] + +jobs: + build-and-push-services: + runs-on: ubuntu-latest + strategy: + matrix: + service: + - name: auth-service + image_suffix: microforge-auth-service + version: v1.0.0 + - name: frontend-service + image_suffix: microforge-frontend-service + version: v1.1.0 + - name: login-service + image_suffix: microforge-login-service + version: v1.1.0 + - name: metadata-service + image_suffix: microforge-metadata-service + version: v1.0.0 + - name: notification-service + image_suffix: microforge-notification-service + version: v1.0.0 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + target: ${{ matrix.service.name }} + push: true + tags: | + ${{ secrets.DOCKER_USERNAME }}/${{ matrix.service.image_suffix }}:${{ matrix.service.version }} + ${{ secrets.DOCKER_USERNAME }}/${{ matrix.service.image_suffix }}:latest + ${{ secrets.DOCKER_USERNAME }}/${{ matrix.service.image_suffix }}:${{github.sha}} diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml deleted file mode 100644 index efc65f8..0000000 --- a/.github/workflows/docker.yaml +++ /dev/null @@ -1,26 +0,0 @@ -name: Build, Test and Push Docker Image -on: - push: - branches: - - master - -jobs: - docker-build: - runs-on: ubuntu-latest - defaults: - run: - shell: bash - working-directory: ./src - strategy: - matrix: - service: - - name: login-service - image: manojmdocker14/microforge-login-service - - name: auth-service - image: manojmdocker14/microforge-auth-service - - name: frontend-service - image: manojmdocker14/microforge-frontend-service - - name: metadata-service - image: manojmdocker14/microforge-metadata-service - - name: notification-service - image: manojmdocker14/microforge-notification-service \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..96b05c3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,117 @@ +# Dockerfile for MicroForge + +# ============================================================================== +# Auth Service +# ============================================================================== +FROM golang:1.25.1-bookworm AS auth-service-builder + +WORKDIR /usr/src/app + +COPY ./src/auth-service/go.mod ./src/auth-service/go.sum ./ +RUN go mod download + +COPY ./src/auth-service/ ./ + +RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -ldflags "-s -w" -o /auth-service main.go + +FROM gcr.io/distroless/static-debian12:nonroot AS auth-service +WORKDIR /usr/src/app + +COPY --from=auth-service-builder /auth-service ./ + +EXPOSE 8082 + +ENTRYPOINT [ "./auth-service" ] + +# ============================================================================== +# Frontend Service +# ============================================================================== +FROM docker.io/library/node:22-slim AS frontend-service-builder + +WORKDIR /app + +COPY ./src/frontend-service/package.json ./src/frontend-service/package-lock.json ./ +RUN npm ci + +COPY ./src/frontend-service/src/ ./src/ +COPY ./src/frontend-service/public/ ./public/ + +RUN npm run build + +FROM nginx:alpine AS frontend-service +COPY --from=frontend-service-builder /app/build /usr/share/nginx/html +COPY ./src/frontend-service/nginx.conf /etc/nginx/conf.d/default.conf +COPY ./src/frontend-service/config.template.json /usr/share/nginx/html/config.template.json +COPY ./src/frontend-service/frontendEntrypoint.sh /frontendEntrypoint.sh +RUN chmod +x /frontendEntrypoint.sh + +EXPOSE 80 +ENTRYPOINT [ "/frontendEntrypoint.sh" ] + +# ============================================================================== +# Login Service +# ============================================================================== +FROM eclipse-temurin:21.0.5_11-jdk-jammy AS login-service-builder + +WORKDIR /app + +COPY ./src/login-service/mvnw ./ +COPY ./src/login-service/.mvn/ ./.mvn/ +COPY ./src/login-service/pom.xml ./ + +RUN chmod +x mvnw && ./mvnw dependency:go-offline + +COPY ./src/login-service/src ./src/ + +RUN ./mvnw clean package -DskipTests + +FROM gcr.io/distroless/java21-debian12:latest AS login-service + +WORKDIR /app + +COPY --from=login-service-builder /app/target/login-service-1.0.0.jar login-service.jar + +EXPOSE 8081 + +ENTRYPOINT [ "java" , "-jar", "login-service.jar" ] + +# ============================================================================== +# Metadata Service +# ============================================================================== +FROM docker.io/library/python:3.12-alpine3.22 AS metadata-service-builder + +RUN apk update && \ + apk add gcc g++ linux-headers + +WORKDIR /app + +COPY ./src/metadata-service/requirements.txt requirements.txt + +RUN python -m venv /opt/venv && \ + /opt/venv/bin/pip install -r requirements.txt + +FROM docker.io/library/python:3.12-alpine3.22 AS metadata-service + +COPY --from=metadata-service-builder /opt/venv /opt/venv + +WORKDIR /app + +COPY ./src/metadata-service/ . + +CMD ["/opt/venv/bin/gunicorn", "app:app", "--workers", "4", "--bind", "0.0.0.0:8084"] + +# ============================================================================== +# Notification Service +# ============================================================================== +FROM node:18-alpine AS notification-service-builder +WORKDIR /app +COPY ./src/notification-service/package.json ./src/notification-service/package-lock.json ./ +RUN npm ci + +FROM gcr.io/distroless/nodejs18-debian11:nonroot AS notification-service +WORKDIR /app + +COPY --from=notification-service-builder /app/node_modules ./node_modules +COPY ./src/notification-service/ . + +CMD [ "app.js" ]