Skip to content

Commit d5e4fda

Browse files
Merge main into feature/testing-and-ci-pipeline
Resolve conflicts by removing old server configuration and maintaining microservices architecture: - Remove legacy server service configuration - Keep microservices setup (auth-service, document-service, genai-service) - Maintain testing and CI pipeline functionality
2 parents 5600870 + 1658da4 commit d5e4fda

File tree

145 files changed

+3333
-858
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

145 files changed

+3333
-858
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
name: Build StudyMate Images
2+
3+
on:
4+
push:
5+
branches: [main]
6+
workflow_dispatch:
7+
8+
jobs:
9+
build-images:
10+
runs-on: ubuntu-latest
11+
permissions:
12+
contents: read
13+
packages: write
14+
15+
env:
16+
COMMIT_SHA: ${{ github.sha }}
17+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
18+
GITHUB_ACTOR: ${{ github.actor }}
19+
20+
steps:
21+
- name: Checkout code
22+
uses: actions/checkout@v4
23+
24+
- name: Login to GitHub Container Registry
25+
uses: docker/login-action@v3
26+
with:
27+
registry: ghcr.io
28+
username: ${{ github.actor }}
29+
password: ${{ secrets.GITHUB_TOKEN }}
30+
31+
# Build client for EC2 deployment (studymate-tum.xyz)
32+
- name: Build and push client for EC2
33+
run: |
34+
docker build --platform linux/amd64 --build-arg VITE_API_BASE_URL=https://studymate-tum.xyz -t ghcr.io/aet-devops25/team-3/client:ec2-${COMMIT_SHA} ./client
35+
docker push ghcr.io/aet-devops25/team-3/client:ec2-${COMMIT_SHA}
36+
docker tag ghcr.io/aet-devops25/team-3/client:ec2-${COMMIT_SHA} ghcr.io/aet-devops25/team-3/client:ec2-latest
37+
docker push ghcr.io/aet-devops25/team-3/client:ec2-latest
38+
39+
# Build client for Kubernetes deployment (studymate.student.k8s.aet.cit.tum.de)
40+
- name: Build and push client for Kubernetes
41+
run: |
42+
docker build --platform linux/amd64 --build-arg VITE_API_BASE_URL=https://studymate.student.k8s.aet.cit.tum.de -t ghcr.io/aet-devops25/team-3/client:k8s-${COMMIT_SHA} ./client
43+
docker push ghcr.io/aet-devops25/team-3/client:k8s-${COMMIT_SHA}
44+
docker tag ghcr.io/aet-devops25/team-3/client:k8s-${COMMIT_SHA} ghcr.io/aet-devops25/team-3/client:k8s-latest
45+
docker push ghcr.io/aet-devops25/team-3/client:k8s-latest
46+
47+
# Build other microservices
48+
- name: Build and push auth-service
49+
run: |
50+
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/auth-service:${COMMIT_SHA} ./server/auth-service
51+
docker push ghcr.io/aet-devops25/team-3/auth-service:${COMMIT_SHA}
52+
docker tag ghcr.io/aet-devops25/team-3/auth-service:${COMMIT_SHA} ghcr.io/aet-devops25/team-3/auth-service:latest
53+
docker push ghcr.io/aet-devops25/team-3/auth-service:latest
54+
55+
- name: Build and push document-service
56+
run: |
57+
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/document-service:${COMMIT_SHA} ./server/document-service
58+
docker push ghcr.io/aet-devops25/team-3/document-service:${COMMIT_SHA}
59+
docker tag ghcr.io/aet-devops25/team-3/document-service:${COMMIT_SHA} ghcr.io/aet-devops25/team-3/document-service:latest
60+
docker push ghcr.io/aet-devops25/team-3/document-service:latest
61+
62+
- name: Build and push genai-service
63+
run: |
64+
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/genai-service:${COMMIT_SHA} ./server/genai-service
65+
docker push ghcr.io/aet-devops25/team-3/genai-service:${COMMIT_SHA}
66+
docker tag ghcr.io/aet-devops25/team-3/genai-service:${COMMIT_SHA} ghcr.io/aet-devops25/team-3/genai-service:latest
67+
docker push ghcr.io/aet-devops25/team-3/genai-service:latest
68+
69+
- name: Build and push eureka-server
70+
run: |
71+
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/eureka-server:${COMMIT_SHA} ./server/eureka-server
72+
docker push ghcr.io/aet-devops25/team-3/eureka-server:${COMMIT_SHA}
73+
docker tag ghcr.io/aet-devops25/team-3/eureka-server:${COMMIT_SHA} ghcr.io/aet-devops25/team-3/eureka-server:latest
74+
docker push ghcr.io/aet-devops25/team-3/eureka-server:latest
75+
76+
- name: Build and push genai
77+
run: |
78+
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/genai:${COMMIT_SHA} ./genAi
79+
docker push ghcr.io/aet-devops25/team-3/genai:${COMMIT_SHA}
80+
docker tag ghcr.io/aet-devops25/team-3/genai:${COMMIT_SHA} ghcr.io/aet-devops25/team-3/genai:latest
81+
docker push ghcr.io/aet-devops25/team-3/genai:latest

β€Ž.github/workflows/build-validation.ymlβ€Ž

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,27 +35,28 @@ jobs:
3535

3636
- name: Build auth-service (validation only)
3737
run: |
38-
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/auth-service:${COMMIT_SHA} ./microservices/auth-service
38+
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/auth-service:${COMMIT_SHA} ./server/auth-service
3939
echo "βœ… Auth Service build successful"
4040
4141
- name: Build document-service (validation only)
4242
run: |
43-
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/document-service:${COMMIT_SHA} ./microservices/document-service
43+
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/document-service:${COMMIT_SHA} ./server/document-service
4444
echo "βœ… Document Service build successful"
4545
4646
- name: Build genai-service (validation only)
4747
run: |
48-
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/genai-service:${COMMIT_SHA} ./microservices/genai-service
48+
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/genai-service:${COMMIT_SHA} ./server/genai-service
4949
echo "βœ… GenAI Service build successful"
5050
5151
- name: Build eureka-server (validation only)
5252
run: |
53-
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/eureka-server:${COMMIT_SHA} ./microservices/eureka-server
53+
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/eureka-server:${COMMIT_SHA} ./server/eureka-server
5454
echo "βœ… Eureka Server build successful"
5555
5656
- name: Build client (validation only)
5757
run: |
58-
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/client:${COMMIT_SHA} ./client
58+
# Build for validation without specific API URL
59+
docker build --platform linux/amd64 -t ghcr.io/aet-devops25/team-3/client:validation-${COMMIT_SHA} ./client
5960
echo "βœ… Client build successful"
6061
6162
- name: Build genai (validation only)
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
name: Deploy StudyMate to Kubernetes
2+
3+
on:
4+
push:
5+
branches: [main]
6+
paths:
7+
- 'client/**'
8+
- 'server/**'
9+
- 'genAi/**'
10+
- 'infra/helm/**'
11+
workflow_dispatch:
12+
inputs:
13+
environment:
14+
description: 'Deployment environment'
15+
required: true
16+
default: 'dev'
17+
type: choice
18+
options:
19+
- dev
20+
- prod
21+
domain:
22+
description: 'Domain name for deployment'
23+
required: true
24+
default: 'studymate.student.k8s.aet.cit.tum.de'
25+
26+
jobs:
27+
deploy-kubernetes:
28+
runs-on: ubuntu-latest
29+
environment: ${{ github.event.inputs.environment || 'dev' }}
30+
31+
steps:
32+
- name: Checkout code
33+
uses: actions/checkout@v4
34+
35+
- name: Setup kubeconfig
36+
run: |
37+
mkdir -p ~/.kube
38+
cat > ~/.kube/config << 'EOF'
39+
apiVersion: v1
40+
kind: Config
41+
clusters:
42+
- name: "student"
43+
cluster:
44+
server: "https://rancher.ase.cit.tum.de/k8s/clusters/c-m-nhcfjg9h"
45+
46+
users:
47+
- name: "student"
48+
user:
49+
token: "kubeconfig-u-g7fbq4tzcsm6z76:btctl45d2sfw7fvdzplvdfzr6cnwbnnmzwtxpzjq4xjbnlp5bmrvzs"
50+
51+
contexts:
52+
- name: "student"
53+
context:
54+
user: "student"
55+
cluster: "student"
56+
57+
current-context: "student"
58+
EOF
59+
chmod 600 ~/.kube/config
60+
61+
- name: Install kubectl
62+
uses: azure/setup-kubectl@v3
63+
with:
64+
version: 'v1.28.0'
65+
66+
- name: Install Helm
67+
uses: azure/setup-helm@v3
68+
with:
69+
version: '3.12.0'
70+
71+
- name: Verify Kubernetes connection
72+
run: |
73+
echo "πŸ” Testing Kubernetes connection..."
74+
kubectl cluster-info || echo "⚠️ Cluster info not available, but continuing..."
75+
kubectl get namespaces || echo "⚠️ Cannot list namespaces, but continuing..."
76+
77+
- name: Validate secrets
78+
run: |
79+
if [ -z "${{ secrets.OPEN_WEBUI_API_KEY_CHAT }}" ]; then
80+
echo "❌ OPEN_WEBUI_API_KEY_CHAT secret is not set"
81+
exit 1
82+
fi
83+
if [ -z "${{ secrets.OPEN_WEBUI_API_KEY_GEN }}" ]; then
84+
echo "❌ OPEN_WEBUI_API_KEY_GEN secret is not set"
85+
exit 1
86+
fi
87+
echo "βœ… All required secrets are present"
88+
89+
- name: Generate JWT Secret
90+
id: jwt-secret
91+
run: |
92+
JWT_SECRET=$(openssl rand -base64 64)
93+
echo "jwt_secret=${JWT_SECRET}" >> $GITHUB_OUTPUT
94+
95+
- name: Deploy with Helm
96+
env:
97+
OPEN_WEBUI_API_KEY_CHAT: ${{ secrets.OPEN_WEBUI_API_KEY_CHAT }}
98+
OPEN_WEBUI_API_KEY_GEN: ${{ secrets.OPEN_WEBUI_API_KEY_GEN }}
99+
LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }}
100+
DOMAIN: ${{ github.event.inputs.domain || 'studymate.student.k8s.aet.cit.tum.de' }}
101+
run: |
102+
echo "πŸš€ Deploying StudyMate to Kubernetes..."
103+
104+
# Try to upgrade first, if it fails, install
105+
if helm status studymate -n studymate > /dev/null 2>&1; then
106+
echo "πŸ“¦ Upgrading existing Helm release..."
107+
helm upgrade studymate ./infra/helm -n studymate \
108+
--set ingress.host="${DOMAIN}" \
109+
--set client.image.tag="k8s-latest" \
110+
--set-string secrets.postgres.data.password="$(openssl rand -base64 32)" \
111+
--set-string secrets.auth.data.jwtSecret="${{ steps.jwt-secret.outputs.jwt_secret }}" \
112+
--set-string secrets.genai.data.openWebUiApiKeyChat="${OPEN_WEBUI_API_KEY_CHAT}" \
113+
--set-string secrets.genai.data.openWebUiApiKeyGen="${OPEN_WEBUI_API_KEY_GEN}" \
114+
--set-string secrets.genai.data.langsmithApiKey="${LANGSMITH_API_KEY}" \
115+
--wait --timeout=10m
116+
else
117+
echo "πŸ“¦ Installing new Helm release..."
118+
kubectl create namespace studymate --dry-run=client -o yaml | kubectl apply -f -
119+
helm install studymate ./infra/helm -n studymate \
120+
--set ingress.host="${DOMAIN}" \
121+
--set client.image.tag="k8s-latest" \
122+
--set-string secrets.postgres.data.password="$(openssl rand -base64 32)" \
123+
--set-string secrets.auth.data.jwtSecret="${{ steps.jwt-secret.outputs.jwt_secret }}" \
124+
--set-string secrets.genai.data.openWebUiApiKeyChat="${OPEN_WEBUI_API_KEY_CHAT}" \
125+
--set-string secrets.genai.data.openWebUiApiKeyGen="${OPEN_WEBUI_API_KEY_GEN}" \
126+
--set-string secrets.genai.data.langsmithApiKey="${LANGSMITH_API_KEY}" \
127+
--wait --timeout=10m
128+
fi
129+
130+
- name: Verify deployment
131+
run: |
132+
echo "πŸ” Checking deployment status..."
133+
kubectl get pods -n studymate -l app.kubernetes.io/instance=studymate
134+
kubectl get services -n studymate -l app.kubernetes.io/instance=studymate
135+
kubectl get ingress -n studymate
136+
137+
echo "πŸ₯ Waiting for pods to be ready..."
138+
kubectl wait --for=condition=ready pod -l app.kubernetes.io/instance=studymate -n studymate --timeout=300s || echo "Some pods may still be starting"
139+
140+
- name: Get access information
141+
env:
142+
DOMAIN: ${{ github.event.inputs.domain || 'studymate.student.k8s.aet.cit.tum.de' }}
143+
run: |
144+
echo "🌐 StudyMate Deployment Complete!"
145+
echo "πŸ”— Application URL: https://${DOMAIN}"
146+
echo ""
147+
echo "πŸ“Š Useful commands:"
148+
echo "kubectl get pods -n studymate"
149+
echo "kubectl logs -f deployment/studymate-client -n studymate"
150+
echo "kubectl logs -f deployment/studymate-auth-service -n studymate"
151+
echo "kubectl port-forward svc/studymate-client 8080:80 -n studymate"

0 commit comments

Comments
Β (0)