Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
d574e27
refactor: add dynamic Postman tests and improve CI pipeline for micro…
Yash-3104 Apr 25, 2026
74aa9e9
fix: correct YAML indentation in CI pipeline
Yash-3104 Apr 25, 2026
1dd0b1b
fix: check login with a wait for Eureka registration first, then Newman
Yash-3104 Apr 25, 2026
e2ca59d
fix: correct YAML indentation in CI pipeline
Yash-3104 Apr 25, 2026
0c54db8
fix: correct YAML indentation in CI pipeline
Yash-3104 Apr 25, 2026
308050a
fix: correct YAML indentation in CI pipeline
Yash-3104 Apr 25, 2026
2f9f9d4
fix: correct YAML indentation in CI pipeline
Yash-3104 Apr 25, 2026
49b0103
fix: correct YAML indentation in CI pipeline
Yash-3104 Apr 25, 2026
6c18731
fix: correct YAML indentation in CI pipeline
Yash-3104 Apr 25, 2026
a3d43ee
fix: correct YAML indentation in CI pipeline
Yash-3104 Apr 25, 2026
9f9b62e
fix: correct YAML indentation in CI pipeline
Yash-3104 Apr 25, 2026
2890a7d
fix: stable CI pipeline with proper docker-compose startup
Yash-3104 Apr 25, 2026
40dd642
removed docker-application.properties
Yash-3104 Apr 25, 2026
214d956
fix: gateway readiness + routing stability in CI
Yash-3104 Apr 25, 2026
9f82194
fix: stable CI with real gateway readiness check
Yash-3104 Apr 25, 2026
323abe6
fix: pre-request should run only once
Yash-3104 Apr 25, 2026
9c46bca
fix: shell syntax for env
Yash-3104 Apr 25, 2026
8c32c38
fix: shell syntax for env
Yash-3104 Apr 25, 2026
c3339ae
fix:docker hub login and push images in CI
Yash-3104 Apr 25, 2026
d18c1db
fix:docker hub login and push images in CI
Yash-3104 Apr 25, 2026
595d236
fix:docker hub login and push images in CI
Yash-3104 Apr 25, 2026
7f4ee0f
fix:docker hub login and push images in CI
Yash-3104 Apr 25, 2026
d001ba1
fix:docker hub login and push images in CI
Yash-3104 Apr 25, 2026
8338b68
fix:docker hub login and push images in CI
Yash-3104 Apr 25, 2026
c9fae21
fix:docker hub login and push images in CI
Yash-3104 Apr 25, 2026
2e6eca0
fix:docker hub login and push images in CI
Yash-3104 Apr 25, 2026
30c2bd4
fix:docker hub login and push images in CI
Yash-3104 Apr 25, 2026
7e5c722
fix: docker tagging + stable CI
Yash-3104 Apr 25, 2026
b2b3f97
fix: docker tagging + stable CI
Yash-3104 Apr 25, 2026
0629eac
fix: docker tagging + stable CI
Yash-3104 Apr 25, 2026
b49174c
fix: docker tagging + stable CI
Yash-3104 Apr 25, 2026
a13cefd
fix: docker tagging + stable CI
Yash-3104 Apr 25, 2026
93e4e3e
fix: docker push order + cleanup
Yash-3104 Apr 26, 2026
5ee4766
fix: docker push order + cleanup
Yash-3104 Apr 26, 2026
f87d700
testing docker images push on feature branch
Yash-3104 Apr 26, 2026
76f2cec
remove condition branch push for images
Yash-3104 Apr 26, 2026
6ba7ff6
remove condition branch push for images
Yash-3104 Apr 26, 2026
c17ca0f
fix: remove incorrect docker tagging
Yash-3104 Apr 26, 2026
e885cef
make CI faster
Yash-3104 Apr 26, 2026
3a93ce5
make CI faster by parallelizing the service builds and keep the Postm…
Yash-3104 Apr 26, 2026
5df4cd7
make CI faster by parallelizing the service builds and keep the Postm…
Yash-3104 Apr 26, 2026
a53633a
fix: restrict docker push to main
Yash-3104 Apr 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
241 changes: 139 additions & 102 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,109 +10,146 @@ on:
- main

jobs:
build:
build-jars:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
service:
- auth-service
- task-service
- api-gateway
- service-registry

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Cache Maven dependencies
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}

- name: Build ${{ matrix.service }}
run: mvn -f ${{ matrix.service }}/pom.xml clean package -DskipTests

- name: Upload JAR
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.service }}-jar
path: ${{ matrix.service }}/target/*.jar
if-no-files-found: error

integration:
runs-on: ubuntu-latest
needs: build-jars

- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Cache Maven dependencies
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}

- name: Build auth-service
run: cd auth-service && mvn clean install

- name: Build task-service
run: cd task-service && mvn clean install

- name: Build api-gateway
run: cd api-gateway && mvn clean install

- name: Build service-registry
run: cd service-registry && mvn clean install

- name: Build Docker images
run: |
docker build -t task-manager-auth ./auth-service
docker build -t task-manager-task ./task-service
docker build -t task-manager-gateway ./api-gateway
docker build -t task-manager-registry ./service-registry

- name: Build services (compose)
run: docker compose build

- name: Start services
run: docker compose up -d

- name: Wait for system readiness
run: |
for i in {1..40}; do
echo "Checking system readiness..."

auth_status=$(curl -s -o /dev/null -w "%{http_code}" \
-X POST http://localhost:8090/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"test"}' \
|| echo "000")

task_status=$(curl -s -o /dev/null -w "%{http_code}" \
http://localhost:8090/api/tasks/dashboard || echo "000")

echo "Auth: $auth_status | Task: $task_status"

if [[ "$auth_status" =~ ^(200|400|401)$ ]] && [[ "$task_status" =~ ^(200|403)$ ]]; then
echo "System is READY ✅"
exit 0
fi

sleep 5
done

echo "System NOT ready ❌"
docker compose logs
exit 1

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 18

- name: Install Newman
run: npm install -g newman

- name: Run Postman tests
run: newman run postman_collection.json -e postman_environment.json

- name: Stop services
run: docker compose down -v

- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

- name: Push Docker images
run: |
docker tag task-manager-auth ${{ secrets.DOCKER_USERNAME }}/task-manager-auth
docker push ${{ secrets.DOCKER_USERNAME }}/task-manager-auth

docker tag task-manager-task ${{ secrets.DOCKER_USERNAME }}/task-manager-task
docker push ${{ secrets.DOCKER_USERNAME }}/task-manager-task

docker tag task-manager-gateway ${{ secrets.DOCKER_USERNAME }}/task-manager-gateway
docker push ${{ secrets.DOCKER_USERNAME }}/task-manager-gateway

docker tag task-manager-registry ${{ secrets.DOCKER_USERNAME }}/task-manager-registry
docker push ${{ secrets.DOCKER_USERNAME }}/task-manager-registry
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Cache Maven dependencies
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}

- name: Download auth-service jar
uses: actions/download-artifact@v4
with:
name: auth-service-jar
path: auth-service/target

- name: Download task-service jar
uses: actions/download-artifact@v4
with:
name: task-service-jar
path: task-service/target

- name: Download api-gateway jar
uses: actions/download-artifact@v4
with:
name: api-gateway-jar
path: api-gateway/target

- name: Download service-registry jar
uses: actions/download-artifact@v4
with:
name: service-registry-jar
path: service-registry/target

- name: Build Docker images
run: docker compose build

- name: Start services
run: docker compose up -d

- name: Wait before readiness checks
run: sleep 40

- name: Wait for Gateway
run: |
for i in $(seq 1 50); do
status=$(curl -s -o /dev/null -w "%{http_code}" \
-X POST http://localhost:8090/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"test"}' \
|| echo "000")

echo "Gateway status: $status"

if [ "$status" = "200" ] || [ "$status" = "400" ] || [ "$status" = "401" ]; then
echo "Gateway ready"
exit 0
fi

sleep 5
done

echo "Gateway NOT ready"
docker compose logs --no-color
exit 1

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 18

- name: Install Newman
run: npm install -g newman

- name: Run Postman tests
run: |
newman run postman_collection.json \
-e postman_environment.json \
--env-var "baseUrl=http://localhost:8090"

- name: Stop services
run: docker compose down -v

- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

- name: Push images
if: github.ref == 'refs/heads/main'
run: |
docker push yash9912/task-manager-auth:latest
docker push yash9912/task-manager-task:latest
docker push yash9912/task-manager-gateway:latest
docker push yash9912/task-manager-registry:latest
12 changes: 0 additions & 12 deletions api-gateway/docker-application.properties

This file was deleted.

6 changes: 4 additions & 2 deletions api-gateway/src/main/resources/application-docker.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ server.port=8080
spring.application.name=api-gateway
eureka.client.serviceUrl.defaultZone=http://service-registry:8761/eureka
spring.cloud.gateway.routes[0].id=auth
spring.cloud.gateway.routes[0].uri=lb://auth-service
spring.cloud.gateway.routes[0].uri=lb://AUTH-SERVICE
spring.cloud.gateway.routes[0].predicates[0]=Path=/api/auth/**
spring.cloud.gateway.routes[1].id=task
spring.cloud.gateway.routes[1].uri=lb://task-service
spring.cloud.gateway.routes[1].uri=lb://TASK-SERVICE
spring.cloud.gateway.routes[1].predicates[0]=Path=/api/tasks/**
spring.cloud.gateway.discovery.locator.enabled=true
spring.cloud.loadbalancer.retry.enabled=true
35 changes: 14 additions & 21 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,32 +1,26 @@
version: "3.9"

services:

service-registry:
build: ./service-registry
container_name: service-registry
image: yash9912/task-manager-registry
ports:
- "8761:8761"
networks:
- microservices-net
environment:
- SPRING_PROFILES_ACTIVE=docker

redis:
image: redis:7
container_name: redis
ports:
- "6379:6379"
command: ["redis-server", "--bind", "0.0.0.0", "--protected-mode", "no"]
networks:
- microservices-net
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5

auth-service:
build: ./auth-service
container_name: auth-service
image: yash9912/task-manager-auth
ports:
- "8085:8081"
depends_on:
Expand All @@ -39,29 +33,29 @@ services:

task-service:
build: ./task-service
container_name: task-service
image: yash9912/task-manager-task
ports:
- "8082:8082"
depends_on:
service-registry :
condition: service_started
redis :
condition: service_healthy
restart: always
- service-registry
- redis
environment:
- SPRING_PROFILES_ACTIVE=docker
networks:
- microservices-net

api-gateway:
build: ./api-gateway
container_name: api-gateway
image: yash9912/task-manager-gateway
ports:
- "8090:8080"
depends_on:
- service-registry
- auth-service
- task-service
service-registry :
condition: service_started
auth-service :
condition: service_started
task-service :
condition: service_started
environment:
- SPRING_PROFILES_ACTIVE=docker
networks:
Expand All @@ -70,4 +64,3 @@ services:
networks:
microservices-net:
driver: bridge

18 changes: 18 additions & 0 deletions postman/collections/Task Manager E2E/create-task.request.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
$kind: http-request
name: create-task
url: "{{baseUrl}}/api/tasks"
method: POST
body:
type: json
content: "{\r

\ \"title\": \"Task {{username}}\",\r

\ \"description\": \"Generated dynamically\"\r

}"
auth:
type: bearer
credentials:
token: auth_token
order: 4503596869659604
5 changes: 5 additions & 0 deletions postman/collections/Task Manager E2E/dashboard.request.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
$kind: http-request
name: dashboard
url: ""
method: GET
order: 4503596896278070
Loading
Loading