Commit Graph
10 Commits
Author SHA1 Message Date
Admin Bot 1a122b0046 feat(webhook): Forgejo package webhook \u2192 ArgoCD image promotion (#54)
CI / CI (pull_request) Successful in 2m11s
Replaces ArgoCD Image Updater with a webhook-driven approach.

When Forgejo fires X-Gitea-Event: package (action: created, type: container):
1. Extract image owner+name+version from payload
2. Look up in static promotion table (10 images \u2192 ArgoCD apps)
3. Fetch digest from Forgejo registry v2 API (Basic auth, REGISTRY_PAT)
4. Read-modify-write ArgoCD Application CR via k8s API (in-cluster SA token)
   - kustomize: JSON Patch /spec/sources[N]/kustomize/images
   - helm:      JSON Patch /spec/source/helm/parameters (runner.image.*)
5. Send Gotify notification with promotion result

Key design:
- Raw http.Client only \u2014 no client-go dependency
- context.Context propagated through all outbound calls
- Retry up to 3x on 409 Conflict (concurrent poimen-toolkit promotions)
- Request ID per invocation for log correlation
- Promotion table covers: api-gw, portfolio, poimen (3 sources), poimen-toolkit (2 images), forgejo-runner-{golang,node,rust}

RBAC: ClusterRole image-promoter (get+patch applications.argoproj.io) bound to api-gateway SA
NetworkPolicy: egress to cicd:3000 (registry) + default:443 (k8s API)
Deployment: REGISTRY_PAT from forgejo-registry-pat secret
13 tests in promoter_test.go, all pass

Closes #54
2026-09-28 10:41:53 +08:00
rockandAdmin Bot 0bde5dd8fe fix(netpol): allow api-gateway egress to notifications:80 (Gotify) (#48)
CI / CI (push) Successful in 3m7s
NetworkPolicy was blocking api-gateway → gotify.notifications.svc.cluster.local:80.
Adds egress rule to `notifications` namespace on port 80.

Required for `X-Service: notification` + `X-Resource: send-message` to deliver push notifications through the gateway.

---------

Co-authored-by: Admin Bot <[email protected]>
Reviewed-on: #48
2026-09-27 14:13:36 +00:00
7de71180b3 feat: add Tekton Pipelines for integration testing (#25)
CI / CI (push) Successful in 3m13s
Implement Kubernetes-native CI/CD with Tekton Pipelines for pre-merge integration testing.

## What This Does

Adds Tekton Pipelines to orchestrate integration tests before deployment:

1. **Tekton Task** (task-integration-test.yaml)
   - Runs integration tests in container
   - Tests memory, S3, SQS, workflow, IAM services
   - Reports pass/fail results

2. **Tekton Pipeline** (pipeline-integration-test.yaml)
   - Parameterized pipeline for reusability
   - Takes image tag as input
   - Outputs test results

3. **ArgoCD Application** (k8s/argocd-apps/tekton.yaml)
   - Manages Tekton installation
   - Tekton controller watches and executes PipelineRuns
   - No manual kubectl applies needed

4. **Updated CI** (.gitea/workflows/ci.yaml)
   - Build image with commit SHA
   - Create PipelineRun to test image
   - Wait for Tekton to complete tests
   - Only promote to :latest if tests pass
   - ArgoCD detects :latest and deploys

## Architecture

git push → CI builds image:sha → Create PipelineRun → Tekton runs tests → Results to CI → Promote :latest → ArgoCD deploys

## Code Quality

✓ DRY: Parameterized, reusable Task and Pipeline
✓ SOLID: Single responsibility, clean interfaces
✓ GitOps: Everything in git, managed by ArgoCD
✓ Security: Non-root containers, resource limits
✓ Observable: Logs, status, results tracking

## Files Changed

- k8s/tekton/task-integration-test.yaml - Task definition
- k8s/tekton/pipeline-integration-test.yaml - Pipeline definition
- k8s/tekton/kustomization.yaml - Kustomize for management
- k8s/tekton/base/tekton-release.yaml - Release reference
- k8s/tekton/README.md - Documentation
- k8s/argocd-apps/tekton.yaml - ArgoCD Application
- .gitea/workflows/ci.yaml - Updated CI workflow

## Review Checklist

- [ ] Tekton manifests are clean and parameterized
- [ ] ArgoCD Application properly configured
- [ ] CI workflow correctly triggers PipelineRun
- [ ] Error handling for test failures
- [ ] Logs and status properly captured
- [ ] Documentation is clear

## Testing

After merge:
1. ArgoCD syncs and installs Tekton Pipelines
2. Next git push triggers CI
3. CI creates PipelineRun
4. Tekton runs integration tests
5. Results show in CI workflow

---------

Co-authored-by: poimen <[email protected]>
Reviewed-on: #25
Co-authored-by: poimen <[email protected]>
2026-09-13 22:50:12 +00:00
Admin Bot c2fa3445bd fix(s3): correct MinIO service port and allow egress
MinIO ClusterIP service listens on port 80 (targetPort 9000).
Config had port 9000 which caused 30s timeout then 502 — gateway
connected to service port 9000 which doesn't exist on the ClusterIP.

Changes:
- configmap.yaml: S3 upstream :9000 → :80
- gateway-config-secret.enc.yaml: same
- network-policy.yaml: add port 80 egress to storage namespace

Verified: S3 adapter now reaches MinIO (403 AccessDenied = auth issue,
not connectivity).
2026-09-08 09:58:36 -07:00
Admin Bot a55e4c7b43 fix: use pod ports (9000/9443) for authentik egress, not service ports
CI / Vet, test, build (push) Successful in 4m3s
CI / Build and push image (push) Successful in 1m31s
2026-09-04 19:09:43 -07:00
Admin Bot d998d7e63c fix: add egress rules for iam, sqs, temporal, poimen, storage namespaces
CI / Build and push image (push) Canceled after 0s
CI / Vet, test, build (push) Canceled after 2m47s
2026-09-04 19:06:50 -07:00
Admin Bot 8ba4e0facc fix: allow portfolio namespace to reach api-gateway for LLM chat
CI / Vet, test, build (push) Successful in 3m52s
CI / Build and push image (push) Successful in 1m17s
2026-09-01 11:15:23 -07:00
Admin Bot de34a6c8cc fix(network): allow poimen namespace to access api-gateway
CI / Vet, test, build (push) Canceled after 2m38s
CI / Build and push image (push) Canceled after 0s
Enable Poimen orchestrator and worker pods to reach the LLM API gateway
in the api namespace.

The api-gateway NetworkPolicy was only allowing traffic from:
- ingress-nginx (external ingress)
- monitoring (Prometheus scraping)

Added new ingress rule to allow:
- poimen namespace (orchestrator-job and worker pods)
- Port 8080 (api-gateway service port)

This fixes the DNS resolution error where orchestrator pods couldn't
reach http://api-gateway.api:8080/health from within the cluster.

Managed via ArgoCD in homelab/k8s/argocd/apps/55-api-gateway.yaml
which syncs from this repo's k8s/ directory.
2026-08-31 14:59:29 -07:00
Story Crater Bot 500eb74577 fix: match namespaces by kubernetes.io/metadata.name in netpol egress
kube-system and llm-serving carry only the automatic label, so DNS and
upstream egress matched nothing and every dispatch failed with 502.
2026-08-20 00:04:17 -07:00
Story Crater BotandClaude Opus 5 058f11cf2b chore: initial commit of Go API gateway
CI / Test (push) Canceled after 0s
CI / Vet (push) Canceled after 0s
CI / Build (push) Canceled after 0s
CI / Security (govulncheck) (push) Canceled after 0s
Baseline for the Kong replacement on api.riotpiao.com. Brings the working
tree under version control for the first time: gateway source, the task
board that drives the agent runs, test fixtures, and K8s manifests.

Anchor the gateway ignore rule to the repo root. Unanchored, "gateway"
also matched the cmd/gateway/ source directory, so the program entrypoint
was excluded from every commit.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-08-19 20:54:34 -07:00