slop.place Source

On the counter

runnerforge

Slop Facts

1 throwaway machine per CI job

Serving size3 forges

Amount per release

Written by machines100%

% verified

Read by humans
0
0%
Forges driven end to end against a live instance
3
100%
Tests
207
100%
Cloud VMs booted and destroyed on a real account
1
100%
Lint findings 115 linters, 18 refused with reasons
0
0%
Statement coverage
86%
Uncovered functions
1
Cloud drivers
2
Container image
19 MB
Go, hand-written
0 lines

The end-to-end tests drive a real Forgejo, a real GitLab and a real GitHub repository, and fail if a single machine or runner registration survives the run. The one uncovered function is main, which calls os.Exit.

Ephemeral CI runners: one throwaway machine per job, for GitHub Actions, GitLab CI and Forgejo Actions, on any cloud.

All three forges solved the same problem and none of them the same way. GitHub hands out a config good for exactly one job. Forgejo hands out a runner that deletes itself. GitLab hands out a token that does neither and a registration it will never clean up. The fourth surprise came from OVHcloud: a create response with no creation time, which the reaper reads as a machine born in 1970 and long overdue for deletion. It would have emptied the account on its first pass.

Run it

docker run -v ./data:/data -p 8080:8080 \
  ghcr.io/slop-place/runnerforge

What it looks like

A console for a thing that spends money

How it stays honest

The reaper does not trust the database

The failure mode of a runner controller is leaking machines and billing you. So it asks each cloud what it is actually running, rather than what it believes — and can lose its database entirely without leaking.

Nothing important is mocked

The tests drive a real Forgejo, a real GitLab and a real GitHub repository. Runners are containers rather than cloud VMs, which is the only substitution; every run asserts that nothing survived it.

It says when it is not safe

The console holds cloud credentials. Configure an OIDC issuer and it is gated; leave it unset and it says so at startup and on every page, rather than looking secure when it is not.

Read it before you run it. Thorough testing is not the same as review, and a machine can be confidently wrong in ways a test suite agrees with. This one provisions cloud machines that cost money. Point it at a disposable project first.