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.git.homelab.example — 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-data-zfs1Gilocal-zfs/data (runner)Runner registration file + config
docker-data (emptyDir)——/var/lib/docker (dind)Docker image/layer cache — disposable, rebuilt after a pod restart

Configuration

GITEA_INSTANCE_URL points at https://gitea.git.homelab.example; 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.