Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

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>