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/lfs_scope.go +2−7
| @@ -37,16 +37,11 @@ func (s *Server) scopeLFSStore() { | |||
| 37 | 37 | for _, m := range repos { | |
| 38 | 38 | scan = append(scan, forge.GCRepo{Name: m.Name, Dir: m.Dir}) | |
| 39 | 39 | } | |
| 40 | // Run logs and artifacts are roots too, and they belong to the repository whose | ||
| 41 | // run produced them. | ||
| 40 | // Run artifacts are roots too, and they belong to the repository whose run | ||
| 41 | // produced them. | ||
| 42 | 42 | runOIDs := map[string][]string{} | |
| 43 | 43 | if _, err := os.Stat(s.Cfg.RunsDB()); err == nil { | |
| 44 | 44 | if rn, err := runs.Open(s.Cfg.RunsDB()); err == nil { | |
| 45 | if logs, err := rn.LogOIDs(); err == nil { | ||
| 46 | for repo, oids := range logs { | ||
| 47 | runOIDs[repo] = append(runOIDs[repo], oids...) | ||
| 48 | } | ||
| 49 | } | ||
| 50 | 45 | if arts, err := rn.ArtifactOIDs(); err == nil { | |
| 51 | 46 | for repo, oids := range arts { | |
| 52 | 47 | runOIDs[repo] = append(runOIDs[repo], oids...) | |