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 1: workflow format, validated at the push that introduces it
8fe238d48181201272a44d9ba7b8d97342afa4ca · Keenan Nemetz · 17d ago · parent 1e955bfb
Phase 4 slice 1: workflow format, validated at the push that introduces it
.vole/workflows/*.yaml is parsed in pre-receive for any push that touches it, so a
broken workflow fails the push that added it, naming the file and every problem in
it. The alternative — accepting the file and discovering months later that it
never ran — is the failure this exists to prevent.
version: 1
on: {push: {branches: [main, "release/*"]}} # globs, default: every branch
jobs: {test: {steps: [{run: go test ./..., timeout: 20m}]}}
Strict by construction:
- Unknown keys are rejected rather than ignored, so `runs-on:` or a typo'd `setps:`
cannot silently do nothing.
- Every problem is reported in one rejection, not the first one only: a person
fixes the file once instead of once per push.
- Job names, step bodies, timeouts (default 10m, cap 1h) and the directory layout
are all checked, including files that are not .yaml/.yml and nested directories.
- The validator is in internal/workflow and `vole workflow check` runs the same
code, so client and server cannot disagree about what is valid.
Validation is scoped by a diff: a push that does not touch the workflow directory
costs one `git diff` and nothing else.
Adds gopkg.in/yaml.v3 (already in the module cache). Nothing executes yet — the
queue, runner and status reporting are the next slice, and the README says so
plainly rather than implying CI runs.
Verified on a live instance: pushing a workflow with a step that runs nothing and a
9h timeout is rejected with both problems named; the corrected file pushes and
`vole workflow list` reports `ci.yaml on main,release/* test(2 steps)`.
docs/roadmap.md +10−2
| @@ -238,8 +238,16 @@ the user roster (`users/<ulid>/meta.json`: name, status, keys, former names). | |||
| 238 | 238 | ||
| 239 | 239 | ### Phase 4 — CI/CD | |
| 240 | 240 | ||
| 241 | - `.vole/workflows/*.yaml` parsed and validated at push time; invalid workflows fail loudly | ||
| 242 | on the CR rather than silently doing nothing | ||
| 241 | ✅ **Slice 1 — workflow format and validation.** `.vole/workflows/*.yaml` is parsed and | ||
| 242 | validated in `pre-receive` for any push that touches it, so an invalid file fails the | ||
| 243 | push that introduced it with every problem named: unknown keys, missing `run`, bad job | ||
| 244 | names, timeouts beyond the cap, files in subdirectories, non-YAML names. `vole workflow | ||
| 245 | check` runs the same validator locally. Workflows carry `version`, branch filters | ||
| 246 | (globs, default all) and jobs of shell steps with per-step timeouts. | ||
| 247 | |||
| 248 | Remaining: | ||
| 249 | |||
| 250 | - Queue and runner (next slice, below) | ||
| 243 | 251 | - Push-event queue persisted in SQLite, with at-least-once delivery | |
| 244 | 252 | - Runner protocol: `vole runner` registers, long-polls for work, leases a job, heartbeats; | |
| 245 | 253 | an expired lease requeues the job | |