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.
Stream run logs over the runner's SSH channel
5ece70a50ebda392626b92bdf29d28bc9b444954 · Keenan Nemetz · 10d ago · parent fdf2340f
Stream run logs over the runner's SSH channel The runner wrote the log to a temp file and uploaded it as one LFS object when the job ended, so a running job had no log to read and a log was stored like a shared artifact even though it belongs to one attempt. The runner sends 128 KiB chunks over the same runner channel that holds the lease. The server appends them to data/logs/<repo>/<run>/<attempt>.log and records the size while the run is still running. The finish record carries the final size; the server checks the file length, syncs it, and stores the result. A partial or failed stream leaves no log on the record. Logs are no longer LFS objects: they are not shared, not content-addressed, and the web serves the file directly, with range and step slices. GC no longer treats them as LFS roots.
server/web/templates/request_runs.html +1−2
| @@ -15,7 +15,7 @@ | |||
| 15 | 15 | <div class="panel"> | |
| 16 | 16 | <table> | |
| 17 | 17 | <thead> | |
| 18 | <tr><th>Status</th><th>Job</th><th>Attempts</th><th>Duration</th><th>Age</th><th></th></tr> | ||
| 18 | <tr><th>Status</th><th>Job</th><th>Attempts</th><th>Duration</th><th>Age</th></tr> | ||
| 19 | 19 | </thead> | |
| 20 | 20 | <tbody> | |
| 21 | 21 | {{range .Runs}} | |
| @@ -25,7 +25,6 @@ | |||
| 25 | 25 | <td class="muted">{{.Attempts}}</td> | |
| 26 | 26 | <td class="nowrap">{{if not .Started.IsZero}}{{duration .Duration}}{{else}}<span class="muted">—</span>{{end}}</td> | |
| 27 | 27 | <td class="muted nowrap">{{since .Created.Unix}}</td> | |
| 28 | <td>{{if or .LogOID .Log}}<a href="/r/{{$.Name}}/runs/{{.ID}}/log">log</a>{{end}}</td> | ||
| 29 | 28 | </tr> | |
| 30 | 29 | {{end}} | |
| 31 | 30 | </tbody> | |