runner: image: repository: code.forgejo.org/forgejo/runner tag: "6" # pin exact release before apply name: golang-runner # Custom image: docker:27-cli + Node.js + Go + build tools # - Node.js for GitHub Actions (actions/checkout@v4, etc.) # - Docker CLI for container builds # - Go toolchain # - Build essentials labels: "golang:docker://forgejo.riotpiao.com/rock/forgejo-runner-golang:latest" forgejoUrl: http://forgejo-gitea-http.cicd.svc.cluster.local:3000 # tokenSecret: name of the K8s Secret that holds the runner registration token # created automatically by the helmfile presync hook (see helmfile.yaml.gotmpl) tokenSecret: runner-token resources: requests: cpu: 100m memory: 256Mi limits: cpu: "2" memory: 4Gi dind: image: repository: docker tag: "27-dind" # pin exact release before apply resources: requests: cpu: 100m memory: 256Mi limits: cpu: "2" memory: 4Gi persistence: reg: storageClass: longhorn # Unified StorageClass (3 replicas) size: 20Gi # .runner registration file + action tool cache + actcache artifacts dind: storageClass: longhorn # Unified StorageClass (3 replicas) size: 30Gi # docker layer cache — keeps rebuilds fast across restarts tolerations: - key: node-role.kubernetes.io/control-plane operator: Exists effect: NoSchedule # Pin to az-b (talos-cp-2) — more Longhorn storage than az-a (worker-1 over-provisioned). # RWO PVCs will recreate on talos-cp-2 when nodeSelector changes. nodeSelector: topology.kubernetes.io/zone: az-b # GC CronJob — prunes Docker images/volumes/build-cache and actcache across # ALL forgejo-runner pods. Only enable in default values (golang instance); # disable in per-runner overrides so it renders once. gc: enabled: true schedule: "*/30 * * * *" # every 30 minutes image: alpine/k8s:1.31.0 pruneAge: "30m" # Docker artifacts unused longer than this get pruned pruneAgeHours: 0.5 # Same as pruneAge but numeric for date arithmetic in shell actcacheMaxAgeDays: 1 # actcache files older than N days (aggressive for heavy Rust cargo builds)