Gitea act_runner on the VM (Docker Compose)
Runs the CI/CD runner as a container, but with a custom image that bundles the
.NET 8 SDK + Docker CLI + Node, because the ROLAC workflow does both dotnet test
and docker build/compose. The stock gitea/act_runner image has neither.
It registers with the label ubuntu:host:
ubuntu= the label name the workflow targets (runs-on: ubuntu).:host= run each step inside this runner container (which has the tools), instead of spawning a separate job container that wouldn't have dotnet/docker.
The container mounts the host Docker socket (so build/push/compose act on the
host daemon) and /opt/rolac at the same path (so compose's relative volumes
resolve), and uses host networking (so the deploy step's
curl http://localhost:8080/api/health works).
Setup
-
Get a runner registration token in Gitea: Settings → Actions → Runners → Create new runner → copy the token. (This is the registration token — different from the
REGISTRY_TOKENrepo secret used fordocker login.) -
Configure + start (on the VM, from this directory):
cd deploy/vm/runner cp .env.example .env nano .env # paste GITEA_RUNNER_REGISTRATION_TOKEN docker compose up -d --build -
Verify it shows up online in Gitea → Settings → Actions → Runners, with the
ubuntulabel.
Notes
- Registration state is stored in
./runner-data/.runner(a bind mount), so the runner does not re-register on restart. To re-register from scratch, stop the container and deleterunner-data/. docker login git.golife.lovefor the registry is done by the workflow using the repo secretsREGISTRY_USER/REGISTRY_TOKEN— you do not need to log in inside the runner manually.- Logs:
docker compose logs -f runner. - The runner can build/run containers on the host because it shares the host Docker socket. Treat this runner as privileged — only run trusted workflows on it.