diff --git a/docs/operations/RUNNER_DEPLOYMENT.md b/docs/operations/RUNNER_DEPLOYMENT.md new file mode 100644 index 0000000..5b18e27 --- /dev/null +++ b/docs/operations/RUNNER_DEPLOYMENT.md @@ -0,0 +1,116 @@ +# Forgejo Runner Deployment Guide + +## Status +❌ **No runners currently deployed** — Workflow will not trigger without them. + +## Issue +The CI/CD workflow is ready in `.gitea/workflows/build.yaml`, but **requires Forgejo runners** to execute. + +## Solution: Deploy Runners via Helm + +### 1. Check if Helm chart is available + +```bash +helm repo add code.forgejo.org https://forgejo.io/helm-charts +helm repo update +helm search repo forgejo-runner +``` + +### 2. Deploy Rust Runner (for memory service) + +```bash +cd /Users/rockliang/workplace/homelab/k8s/infra/forgejo-runner + +# Deploy golang runner (base) +helm install forgejo-runner code.forgejo.org/forgejo-runner \ + --namespace cicd \ + --create-namespace \ + -f values.yaml + +# Deploy rust runner (overlay) +helm install forgejo-runner-rust code.forgejo.org/forgejo-runner \ + --namespace cicd \ + -f values.yaml \ + -f values-rust.yaml +``` + +### 3. Verify Runners are Running + +```bash +kubectl get pod -n cicd -l app.kubernetes.io/name=runner +# Should show: +# NAME READY STATUS RESTARTS +# forgejo-runner-golang-xyz 1/1 Running 0 +# forgejo-runner-rust-abc 1/1 Running 0 +``` + +### 4. Check Runner Registration in Forgejo + +```bash +# Visit Forgejo web UI: https://forgejo.riotpiao.com +# Admin → Runners → Should show "rust" and "golang" runners +``` + +### 5. Trigger CI/CD + +Once runners are ready: +1. **Create PR**: Push to feature branch → CI job runs (test only) +2. **Merge to main**: Merge PR → Both test and build jobs run +3. **Check image**: Docker image pushed to `forgejo.riotpiao.com/rock/poimen-memory:latest` + +## Workflow Execution Timeline + +``` +Push to feature branch + ↓ +CI job runs (test + check) + ├─ cargo test -p mem-ingest --lib + ├─ cargo check -p mem-ingest + └─ ✅ or ❌ Pass/Fail (no build) + +Merge to main + ↓ +Test job runs again + ├─ cargo test -p mem-ingest --lib + ├─ cargo check -p mem-ingest + ↓ (if pass) +Build job runs (ONLY on main) + ├─ docker build + ├─ docker login + ├─ docker push + └─ image: forgejo.riotpiao.com/rock/poimen-memory:latest ✅ +``` + +## Troubleshooting + +### Workflow doesn't start +- Check runners are running: `kubectl get pod -n cicd` +- Check runner registration in Forgejo UI +- Check runner labels match workflow `runs-on: rust` + +### Test fails but build still runs +- Check workflow condition: `if: github.event_name == 'push' && github.ref == 'refs/heads/main'` +- Build requires `needs: test` — should wait for test job + +### Docker push fails +- Verify `REGISTRY_PAT` secret exists in Forgejo +- Check credentials: `echo ${{ secrets.REGISTRY_PAT }} | docker login -u rock --password-stdin forgejo.riotpiao.com` + +### Image not in registry +- Check build logs: Forgejo UI → Repo → Actions +- Verify registry URL in workflow: `forgejo.riotpiao.com` +- Check docker is available on runner: `docker --version` + +## Files + +- `.gitea/workflows/build.yaml` — CI/CD workflow (test on PR, build on main) +- `homelab/k8s/infra/forgejo-runner/values.yaml` — Base runner config +- `homelab/k8s/infra/forgejo-runner/values-rust.yaml` — Rust runner overlay +- `Dockerfile` — Multi-stage Rust build + +## Next Steps + +1. **Deploy runners** (follow section 2 above) +2. **Create a test PR** to verify CI triggers +3. **Merge to main** to verify build + push works +4. **Check registry** for new image tags