Buildbot is probably the closest fit if YAML is the main objection: Python config, explicit workers, a usable dashboard, and GitHub status/check integration. Let GitHub remain the PR/merge UI; a small GitHub App can translate Buildbot results into required checks, so the native merge button does the last step. If you want a more turnkey hosted product, Buildkite has self-hosted agents and the same status/merge model, but you give up the fully self-owned control plane. Woodpecker/Forgejo Actions are nicer operationally than Actions, but still YAML-shaped.
<Post
Fair objection. The Go options (Woodpecker, Drone) still make YAML central, so they only improve the trust/runner story. At that point a thin hosted selfci control plane may genuinely be the smallest solution: GitHub App/webhooks → queue → your existing runners → Checks API; keep the native GitHub merge button. Put project pipelines in Rust/TOML or ordinary repo scripts, not another bespoke DSL.