Add kind quickstart guide
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
# Forgebot Kind Quickstart
|
||||
|
||||
Run forgebot end-to-end in a local [kind](https://kind.sigs.k8s.io/) cluster.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Docker
|
||||
- kind v0.31+
|
||||
- kubectl
|
||||
|
||||
## Setup
|
||||
|
||||
```bash
|
||||
# Use a separate kubeconfig so your existing context is untouched
|
||||
export KUBECONFIG=/tmp/forgebot-kind.kubeconfig
|
||||
|
||||
# Create cluster
|
||||
kind create cluster --name forgebot
|
||||
|
||||
# Build and load images
|
||||
cd /path/to/forgebot
|
||||
docker build -t forgebot-api:dev -f Dockerfile.api .
|
||||
docker build -t forgebot-operator:dev -f Dockerfile.operator .
|
||||
kind load docker-image forgebot-api:dev --name forgebot
|
||||
kind load docker-image forgebot-operator:dev --name forgebot
|
||||
|
||||
# Install CRDs
|
||||
kubectl apply -f config/crd/bases/
|
||||
|
||||
# Deploy everything (postgres, RBAC, API, operator, sample CRs)
|
||||
kubectl apply -f hack/kind/manifests/
|
||||
|
||||
# Wait for pods
|
||||
kubectl -n forgebot wait --for=condition=ready pod -l app=postgres --timeout=60s
|
||||
kubectl -n forgebot wait --for=condition=ready pod -l app=forgebot-api --timeout=60s
|
||||
kubectl -n forgebot wait --for=condition=ready pod -l app=forgebot-operator --timeout=60s
|
||||
```
|
||||
|
||||
## Test
|
||||
|
||||
```bash
|
||||
# Port-forward the API (use a non-default port to avoid conflicts)
|
||||
kubectl -n forgebot port-forward svc/forgebot-api 18000:8000 &
|
||||
|
||||
# Health check
|
||||
curl -s http://localhost:18000/health
|
||||
# {"status":"ok"}
|
||||
|
||||
# Simulate a Gitea webhook (issue comment with /plan command)
|
||||
curl -s -X POST http://localhost:18000/api/v1/webhook/gitea \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"action": "created",
|
||||
"comment": {
|
||||
"id": 1,
|
||||
"body": "/plan implement auth",
|
||||
"user": {"login": "unkinben"}
|
||||
},
|
||||
"issue": {"number": 42},
|
||||
"repository": {
|
||||
"full_name": "unkin/test-repo",
|
||||
"default_branch": "main"
|
||||
}
|
||||
}'
|
||||
|
||||
# Verify the task was queued
|
||||
curl -s http://localhost:18000/api/v1/tasks | python3 -m json.tool
|
||||
|
||||
# Check that the operator created an AgentTask and a Job
|
||||
kubectl -n forgebot get agenttasks
|
||||
kubectl -n forgebot get jobs
|
||||
|
||||
# Operator logs
|
||||
kubectl -n forgebot logs -l app=forgebot-operator --tail=20
|
||||
```
|
||||
|
||||
### Expected output
|
||||
|
||||
```
|
||||
NAME COMMAND REPO PHASE AGE
|
||||
task-e611a7c7 plan unkin/test-repo Succeeded 9s
|
||||
```
|
||||
|
||||
The operator polls the API for pending tasks, creates an `AgentTask` CR, which triggers a K8s Job. The test pool uses `busybox:latest` so the Job completes immediately.
|
||||
|
||||
## Create a task via the API (agent subtask spawning)
|
||||
|
||||
```bash
|
||||
curl -s -X POST http://localhost:18000/api/v1/tasks \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"command": "implement",
|
||||
"repository": "unkin/terraform-vault",
|
||||
"ref": "main",
|
||||
"body": "Add K8s auth role for new-service",
|
||||
"author": "unkinben"
|
||||
}' | python3 -m json.tool
|
||||
```
|
||||
|
||||
## Teardown
|
||||
|
||||
```bash
|
||||
kind delete cluster --name forgebot
|
||||
rm -f /tmp/forgebot-kind.kubeconfig
|
||||
```
|
||||
Reference in New Issue
Block a user