Spaces:
Sleeping
Sleeping
feat: add Dockerfile, GitHub Actions CI and Kubernetes manifests
Browse files- .github/workflows/ci.yml +57 -0
- DocerkFile +22 -0
- kubernetes/configmap.yaml +11 -0
- kubernetes/deployment.yaml +44 -0
- kubernetes/ingress.yaml +18 -0
- kubernetes/secret.yaml +7 -0
- kubernetes/services.yaml +13 -0
.github/workflows/ci.yml
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: CI Pipeline
|
| 2 |
+
|
| 3 |
+
on:
|
| 4 |
+
push:
|
| 5 |
+
branches: [main, develop]
|
| 6 |
+
pull_request:
|
| 7 |
+
branches: [main]
|
| 8 |
+
|
| 9 |
+
jobs:
|
| 10 |
+
lint-and-test:
|
| 11 |
+
runs-on: ubuntu-latest
|
| 12 |
+
|
| 13 |
+
steps:
|
| 14 |
+
- name: Checkout code
|
| 15 |
+
uses: actions/checkout@v4
|
| 16 |
+
|
| 17 |
+
- name: Set up Python
|
| 18 |
+
uses: actions/setup-python@v5
|
| 19 |
+
with:
|
| 20 |
+
python-version: "3.11"
|
| 21 |
+
|
| 22 |
+
- name: Install dependencies
|
| 23 |
+
run: |
|
| 24 |
+
python -m pip install --upgrade pip
|
| 25 |
+
pip install -r requirements.txt
|
| 26 |
+
|
| 27 |
+
- name: Run Ruff linter
|
| 28 |
+
run: |
|
| 29 |
+
ruff check app/
|
| 30 |
+
|
| 31 |
+
- name: Run Bandit security check
|
| 32 |
+
run: |
|
| 33 |
+
bandit -r app/ -f text -q
|
| 34 |
+
|
| 35 |
+
- name: Run tests
|
| 36 |
+
env:
|
| 37 |
+
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
|
| 38 |
+
LLM_MODEL: meta-llama/llama-3.3-70b-instruct
|
| 39 |
+
REPO_CLONE_DIR: /tmp/repositories
|
| 40 |
+
MAX_REPO_SIZE_MB: 500
|
| 41 |
+
APP_ENV: test
|
| 42 |
+
APP_PORT: 8000
|
| 43 |
+
LOG_LEVEL: info
|
| 44 |
+
run: |
|
| 45 |
+
pytest tests/ -v --tb=short
|
| 46 |
+
|
| 47 |
+
docker-build:
|
| 48 |
+
runs-on: ubuntu-latest
|
| 49 |
+
needs: lint-and-test
|
| 50 |
+
|
| 51 |
+
steps:
|
| 52 |
+
- name: Checkout code
|
| 53 |
+
uses: actions/checkout@v4
|
| 54 |
+
|
| 55 |
+
- name: Build Docker image
|
| 56 |
+
run: |
|
| 57 |
+
docker build -t ai-code-review-agent:latest .
|
DocerkFile
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM python:3.11-slim
|
| 2 |
+
|
| 3 |
+
WORKDIR /app
|
| 4 |
+
|
| 5 |
+
# Install git (needed for GitPython)
|
| 6 |
+
RUN apt-get update && apt-get install -y \
|
| 7 |
+
git \
|
| 8 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 9 |
+
|
| 10 |
+
# Install dependencies
|
| 11 |
+
COPY requirements.txt .
|
| 12 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
| 13 |
+
|
| 14 |
+
# Copy app code
|
| 15 |
+
COPY . .
|
| 16 |
+
|
| 17 |
+
# Expose ports
|
| 18 |
+
EXPOSE 8000
|
| 19 |
+
EXPOSE 7860
|
| 20 |
+
|
| 21 |
+
# Default command runs FastAPI
|
| 22 |
+
CMD ["uvicorn", "app.api.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
kubernetes/configmap.yaml
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
apiVersion: v1
|
| 2 |
+
kind: ConfigMap
|
| 3 |
+
metadata:
|
| 4 |
+
name: ai-agent-config
|
| 5 |
+
data:
|
| 6 |
+
llm-model: "meta-llama/llama-3.3-70b-instruct"
|
| 7 |
+
repo-clone-dir: "/tmp/repositories"
|
| 8 |
+
max-repo-size-mb: "500"
|
| 9 |
+
app-env: "production"
|
| 10 |
+
app-port: "8000"
|
| 11 |
+
log-level: "info"
|
kubernetes/deployment.yaml
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
apiVersion: apps/v1
|
| 2 |
+
kind: Deployment
|
| 3 |
+
metadata:
|
| 4 |
+
name: ai-code-review-agent
|
| 5 |
+
labels:
|
| 6 |
+
app: ai-code-review-agent
|
| 7 |
+
spec:
|
| 8 |
+
replicas: 2
|
| 9 |
+
selector:
|
| 10 |
+
matchLabels:
|
| 11 |
+
app: ai-code-review-agent
|
| 12 |
+
template:
|
| 13 |
+
metadata:
|
| 14 |
+
labels:
|
| 15 |
+
app: ai-code-review-agent
|
| 16 |
+
spec:
|
| 17 |
+
containers:
|
| 18 |
+
- name: ai-code-review-agent
|
| 19 |
+
image: ai-code-review-agent:latest
|
| 20 |
+
ports:
|
| 21 |
+
- containerPort: 8000
|
| 22 |
+
env:
|
| 23 |
+
- name: OPENROUTER_API_KEY
|
| 24 |
+
valueFrom:
|
| 25 |
+
secretKeyRef:
|
| 26 |
+
name: ai-agent-secret
|
| 27 |
+
key: openrouter-api-key
|
| 28 |
+
- name: LLM_MODEL
|
| 29 |
+
valueFrom:
|
| 30 |
+
configMapKeyRef:
|
| 31 |
+
name: ai-agent-config
|
| 32 |
+
key: llm-model
|
| 33 |
+
- name: REPO_CLONE_DIR
|
| 34 |
+
valueFrom:
|
| 35 |
+
configMapKeyRef:
|
| 36 |
+
name: ai-agent-config
|
| 37 |
+
key: repo-clone-dir
|
| 38 |
+
resources:
|
| 39 |
+
requests:
|
| 40 |
+
memory: "512Mi"
|
| 41 |
+
cpu: "250m"
|
| 42 |
+
limits:
|
| 43 |
+
memory: "1Gi"
|
| 44 |
+
cpu: "500m"
|
kubernetes/ingress.yaml
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
apiVersion: networking.k8s.io/v1
|
| 2 |
+
kind: Ingress
|
| 3 |
+
metadata:
|
| 4 |
+
name: ai-code-review-agent-ingress
|
| 5 |
+
annotations:
|
| 6 |
+
nginx.ingress.kubernetes.io/rewrite-target: /
|
| 7 |
+
spec:
|
| 8 |
+
rules:
|
| 9 |
+
- host: ai-agent.local
|
| 10 |
+
http:
|
| 11 |
+
paths:
|
| 12 |
+
- path: /
|
| 13 |
+
pathType: Prefix
|
| 14 |
+
backend:
|
| 15 |
+
service:
|
| 16 |
+
name: ai-code-review-agent-service
|
| 17 |
+
port:
|
| 18 |
+
number: 80
|
kubernetes/secret.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
apiVersion: v1
|
| 2 |
+
kind: Secret
|
| 3 |
+
metadata:
|
| 4 |
+
name: ai-agent-secret
|
| 5 |
+
type: Opaque
|
| 6 |
+
stringData:
|
| 7 |
+
openrouter-api-key: your_openrouter_key_here
|
kubernetes/services.yaml
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
apiVersion: v1
|
| 2 |
+
kind: Service
|
| 3 |
+
metadata:
|
| 4 |
+
name: ai-code-review-agent-service
|
| 5 |
+
spec:
|
| 6 |
+
selector:
|
| 7 |
+
app: ai-code-review-agent
|
| 8 |
+
ports:
|
| 9 |
+
- name: api
|
| 10 |
+
protocol: TCP
|
| 11 |
+
port: 80
|
| 12 |
+
targetPort: 8000
|
| 13 |
+
type: ClusterIP
|