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/workflows.go +2−1
| @@ -17,6 +17,7 @@ type workflowJobView struct { | |||
| 17 | 17 | Description string | |
| 18 | 18 | Labels []string | |
| 19 | 19 | Image string | |
| 20 | Network string | ||
| 20 | 21 | Steps int | |
| 21 | 22 | Artifacts int | |
| 22 | 23 | Pages bool | |
| @@ -82,7 +83,7 @@ func (w *Web) WorkflowsPage(rw http.ResponseWriter, r *http.Request) { | |||
| 82 | 83 | } | |
| 83 | 84 | view.Jobs = append(view.Jobs, workflowJobView{ | |
| 84 | 85 | ID: job.ID, Name: job.Name, Description: job.Description, | |
| 85 | Labels: job.Labels, Image: image, | ||
| 86 | Labels: job.Labels, Image: image, Network: job.Network, | ||
| 86 | 87 | Steps: len(job.Steps), Artifacts: len(job.Artifacts), | |
| 87 | 88 | Pages: job.Pages != nil, | |
| 88 | 89 | Last: latest[wf.Path+"\x00"+job.ID], | |