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/status.go +1−11
| @@ -35,7 +35,6 @@ type statusStorageView struct { | |||
| 35 | 35 | ||
| 36 | 36 | type statusLFSView struct { | |
| 37 | 37 | Total statusObjectCount | |
| 38 | Logs statusObjectCount | ||
| 39 | 38 | Artifacts statusObjectCount | |
| 40 | 39 | Other statusObjectCount | |
| 41 | 40 | Err string | |
| @@ -197,15 +196,9 @@ func (w *Web) lfsUsage() statusLFSView { | |||
| 197 | 196 | v.Disabled = true | |
| 198 | 197 | return v | |
| 199 | 198 | } | |
| 200 | logs, artifacts := map[string]bool{}, map[string]bool{} | ||
| 199 | artifacts := map[string]bool{} | ||
| 201 | 200 | var problems []string | |
| 202 | 201 | if w.Runs != nil { | |
| 203 | logOIDs, err := w.Runs.LogOIDs() | ||
| 204 | if err != nil { | ||
| 205 | problems = append(problems, "run logs: "+err.Error()) | ||
| 206 | } else { | ||
| 207 | logs = objectSet(logOIDs) | ||
| 208 | } | ||
| 209 | 202 | artifactOIDs, err := w.Runs.ArtifactOIDs() | |
| 210 | 203 | if err != nil { | |
| 211 | 204 | problems = append(problems, "run artifacts: "+err.Error()) | |
| @@ -217,9 +210,6 @@ func (w *Web) lfsUsage() statusLFSView { | |||
| 217 | 210 | v.Total.Objects++ | |
| 218 | 211 | v.Total.Bytes += size | |
| 219 | 212 | switch { | |
| 220 | case logs[oid]: | ||
| 221 | v.Logs.Objects++ | ||
| 222 | v.Logs.Bytes += size | ||
| 223 | 213 | case artifacts[oid]: | |
| 224 | 214 | v.Artifacts.Objects++ | |
| 225 | 215 | v.Artifacts.Bytes += size | |