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.
Let a job declare the network it needs
d79580247b8f33f7ffdf2f05847733cad12c187a · Keenan Nemetz · 6d ago · parent 4ac42680
Let a job declare the network it needs A runner's --container-network decided the network for every job it took, so a machine that could reach the network gave it to builds that never asked, and a job that did need one could be handed to a machine that had none. The docs said "add bridge only when a job needs it", which no workflow could express. A job now says `network: none` or `network: bridge`. The request is pinned with the run, and the lease only hands a bridge job to a runner that advertises the capability, so a job waits for a capable machine instead of failing on one that never could. The runner applies the job's request to its container, which means a bridge runner can still withhold the network from a job that asked for none. A job that declares nothing keeps the runner's own setting, which is what every workflow meant before this field existed. The local run applies the same rule and refuses a bridge job when it was started without one, so `vole workflow run` either matches CI or says what to change on the command line. The workflows page, the run page, and the runner's log line now say what a job asked for and what it ran with. verify.yaml and release.yaml are deliberately not in this change: the instance validates a pushed workflow with the binary it is running, so they can declare the field once that binary knows it. Closes #159.
server/web/templates/workflows.html +2−1
| @@ -41,7 +41,8 @@ | |||
| 41 | 41 | {{if .Description}}<div class="muted">{{.Description}}</div>{{end}} | |
| 42 | 42 | </td> | |
| 43 | 43 | <td class="muted">{{if .Labels}}{{join .Labels ", "}}{{else}}any runner{{end}}</td> | |
| 44 | <td>{{if .Image}}<code>{{.Image}}</code>{{else}}<span class="muted">none</span>{{end}}</td> | ||
| 44 | <td>{{if .Image}}<code>{{.Image}}</code>{{else}}<span class="muted">none</span>{{end}} | ||
| 45 | {{if .Network}}<div class="muted">{{if eq .Network "none"}}no network{{else}}network {{.Network}}{{end}}</div>{{end}}</td> | ||
| 45 | 46 | <td class="muted">{{.Steps}}</td> | |
| 46 | 47 | <td class="muted">{{.Artifacts}} artifact(s){{if .Pages}} · site{{end}}</td> | |
| 47 | 48 | <td> | |