# 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 ```