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/server.go +2
| @@ -104,6 +104,7 @@ func New(cfg *config.Config, binPath string, log *slog.Logger) (*Server, error) | |||
| 104 | 104 | Identity: inst.Identity, | |
| 105 | 105 | Repos: inst.Repos, | |
| 106 | 106 | Instance: inst, | |
| 107 | Logs: inst.Logs, | ||
| 107 | 108 | LFS: inst.LFS, | |
| 108 | 109 | LFSWarnBytes: cfg.LFSWarnBytes, | |
| 109 | 110 | Log: log, | |
| @@ -155,6 +156,7 @@ func New(cfg *config.Config, binPath string, log *slog.Logger) (*Server, error) | |||
| 155 | 156 | LFS: inst.LFS, Locks: inst.Locks, PageViews: inst.PageViews, | |
| 156 | 157 | Proxy: proxy, SSH: ssh, Web: wp, Log: log, | |
| 157 | 158 | } | |
| 159 | wp.Logs = inst.Logs | ||
| 158 | 160 | wp.AllowCI = s.allowContributorCI | |
| 159 | 161 | wp.EnsureCandidate = s.ensureCandidateForWeb | |
| 160 | 162 | wp.RenameRepo = inst.RenameRepo | |