vole
Clone
Read only, no credentials:
https://rodent.software/git/vole.git
Write over SSH with a registered key:
git clone ssh://git@0.0.0.0:2222/vole.git
A free and open-source forge that lives in your Git repo.
Phase 4 slice 3: checks on the gate, and statuses on the page
35eaeccffdab9d07e13fb7b346060e535697fee7 · Keenan Nemetz · 17d ago · parent b44cbfaf
Phase 4 slice 3: checks on the gate, and statuses on the page A protected branch now requires both an approved change request and passing checks for the commit being landed. Approvals say a person read the change; checks say it works. Neither substitutes for the other. The gate asks about the *approved head*, not about the merge commit somebody may be pushing: CI ran on the head, and a merge commit is a new object nobody built. That also keeps the gate consistent with what approvals already name. Details that decide whether this is usable: - A repository with no workflows is unaffected — nothing to run means nothing to wait for — so existing repositories do not start failing pushes. - A job with no run is refused with an explanation that names the branch filter, because `on: push: branches: [main]` never produces a result for a feature branch. That is the one configuration that can deadlock a merge, and the error says so instead of leaving somebody guessing. - Failed, cancelled, still-running and missing are four different messages; a reviewer should be able to tell which. - `vole acl checks <repo> on|off` turns it off, default on. Statuses are readable: the repository page lists recent runs (job, commit, status, attempts, age) and a change request shows its head's job statuses next to the approvals, so the reviewer sees the same facts the gate uses. Tests cover the three interesting shapes: approved + green lands; approved + red is refused naming the failed job; approved + no run at all is refused with the branch-filter hint. Verified on a live instance: pushing a workflow queues and runs it, the repository page shows `build · .vole/workflows/ci.yaml · success`, and the change request shows `wilbur · current` alongside `build · success`. Phase 4 is now complete except signed run records, which are Phase 7's.
internal/sshserver/sshserver.go +3
| @@ -43,6 +43,8 @@ type Config struct { | |||
| 43 | 43 | AuditPath string | |
| 44 | 44 | // SpoolDir is where post-receive drops accepted push events. | |
| 45 | 45 | SpoolDir string | |
| 46 | // RunsDB is handed to pre-receive so required checks are enforced there. | ||
| 47 | RunsDB string | ||
| 46 | 48 | // Runs is the CI queue, served to runners over the vole-runner verb. | |
| 47 | 49 | Runs *runs.Store | |
| 48 | 50 | // Lease is how long a runner may hold a job without a heartbeat. | |
| @@ -268,6 +270,7 @@ func (s *Server) exec(ch ssh.Channel, req *ssh.Request, command, user, accountID | |||
| 268 | 270 | "VOLE_AUDIT="+s.cfg.AuditPath, | |
| 269 | 271 | "VOLE_SYSTEM_REPO="+s.cfg.Identity.Dir(), | |
| 270 | 272 | "VOLE_SPOOL="+s.cfg.SpoolDir, | |
| 273 | "VOLE_RUNS_DB="+s.cfg.RunsDB, | ||
| 271 | 274 | ) | |
| 272 | 275 | cmd.Stdin = struct{ io.Reader }{ch} | |
| 273 | 276 | cmd.Stdout = struct{ io.Writer }{ch} | |