Post

Gitea Actions Runner

Gitea Actions Runner

Gitea Actions Runner

Purpose

Self-hosted act_runner executing Gitea Actions CI/CD jobs for repos hosted at gitea.prod.iot-proxmox.net — including this doc site’s own build pipeline.

Deployment

ItemValue
Imagegitea/act_runner:latest
Namespacedefault
Replicas1 (strategy: Recreate)
Termination grace period10800s (3 hours) — long enough for an in-flight CI job to finish before the pod is force-killed
Storage2 PVCs

reloader.stakater.com/auto: "true" is set on the Deployment.

Docker-in-Docker

CI jobs frequently need to build/push Docker images, so the runner pod includes a docker:28.2.2-dind init container (restartPolicy: Always, i.e. a native sidecar) running privileged: true. It shares an emptyDir volume at /var/run with the runner container so the runner talks to the sidecar’s Docker daemon over the standard socket. A startupProbe/livenessProbe wait for /var/run/docker.sock to exist before the runner is considered ready.

Storage

PVCSizeStorage ClassMountPurpose
gitea-runner-data1Gilonghorn/data (runner)Runner registration file + config — replicated so registration survives node loss
gitea-runner-docker-data20Gilocal-path/var/lib/docker (dind)Docker image/layer cache — disposable, kept node-local to avoid paying Longhorn’s replication cost for a cache

Configuration

GITEA_INSTANCE_URL points at https://gitea.prod.iot-proxmox.net; the runner registration token is injected from a Secret (GITEA_RUNNER_REGISTRATION_TOKEN).

Resources

ContainerCPU (req/limit)Memory (req/limit)
docker (dind init container)250m / 2512Mi / 4Gi
runner100m / 1256Mi / 1Gi
This post is licensed under CC BY 4.0 by the author.