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.
Merge change request 01M70WES5ZZDJ6RP226WB11BBZ: Let people rename and remove their own passkeys
keenan · 26m ago
4b8c9e1d
| 1 | {{define "run"}} |
| 2 | {{template "header" .}} |
| 3 | {{template "repohead" (nav .Page "runs")}} |
| 4 | <div class="page-head"> |
| 5 | <div class="page-head-main"> |
| 6 | <h1>Run · {{.Run.JobTitle}}</h1> |
| 7 | <p class="page-sub"> |
| 8 | <span class="status {{.Run.Status}}">{{runstatus .Run.Status}}</span> |
| 9 | {{if .Run.TriggerTitle}}· {{.Run.TriggerTitle}}{{end}} |
| 10 | {{if ne .Run.JobTitle .Run.WorkflowTitle}}· {{.Run.WorkflowTitle}}{{end}} |
| 11 | · {{if .Run.Tag}}tag {{.Run.Tag}}{{else}}{{.Run.Branch}}{{end}} |
| 12 | at <a class="sha" href="/{{.Name}}/commit/{{.Run.SHA}}">{{short .Run.SHA}}</a> |
| 13 | · attempt {{.Run.Attempts}} |
| 14 | </p> |
| 15 | {{if .Run.JobDescription}}<p class="page-sub">{{.Run.JobDescription}}</p>{{end}} |
| 16 | {{if and .Run.WorkflowDescription (ne .Run.WorkflowDescription .Run.JobDescription)}}<p class="page-sub">{{.Run.WorkflowDescription}}</p>{{end}} |
| 17 | </div> |
| 18 | {{if or .CanCancel .CanRerun}} |
| 19 | <div class="page-head-actions"> |
| 20 | {{if .CanCancel}}<form class="inline" method="post" action="/{{.Name}}/runs/{{.Run.ID}}/cancel"> |
| 21 | <input type="hidden" name="csrf" value="{{.CSRF}}"> |
| 22 | <button type="submit" class="warn">{{icon "circle-x"}}{{if eq .Run.Status "running"}}Stop running run{{else}}Cancel queued run{{end}}</button> |
| 23 | </form>{{end}} |
| 24 | {{if .CanRerun}}<form class="inline" method="post" action="/{{.Name}}/runs/{{.Run.ID}}/rerun"> |
| 25 | <input type="hidden" name="csrf" value="{{.CSRF}}"> |
| 26 | <button type="submit" class="secondary">{{icon "rotate-ccw"}}Rerun</button> |
| 27 | </form>{{end}} |
| 28 | </div> |
| 29 | {{end}} |
| 30 | </div> |
| 31 | |
| 32 | <div class="run-summary"> |
| 33 | <div class="card"> |
| 34 | <span class="run-summary-label">{{icon "history"}}Duration</span> |
| 35 | {{if .Run.Started.IsZero}} |
| 36 | <strong>{{duration .Wait}}</strong> |
| 37 | <span class="status-note">{{if eq .Run.Status "queued"}}waiting for a runner{{else}}queued{{end}}</span> |
| 38 | {{else}} |
| 39 | <strong>{{duration .Duration}}</strong> |
| 40 | <span class="status-note">{{if .Run.Finished.IsZero}}running now{{else}}finished {{since .Run.Finished.Unix}}{{end}}</span> |
| 41 | {{end}} |
| 42 | </div> |
| 43 | <div class="card"> |
| 44 | <span class="run-summary-label">{{icon "history"}}Queue wait</span> |
| 45 | <strong>{{duration .Wait}}</strong> |
| 46 | <span class="status-note">{{if .Run.Started.IsZero}}so far{{else}}before the first runner leased it{{end}}</span> |
| 47 | </div> |
| 48 | <div class="card"> |
| 49 | <span class="run-summary-label">{{icon "server"}}Environment</span> |
| 50 | {{if .Run.OS}}<strong>{{.Run.OS}}/{{.Run.Arch}}</strong>{{else}}<strong class="muted">not reported</strong>{{end}} |
| 51 | <span class="status-note">{{if .Run.Image}}<code>{{if .Run.ImageFile}}{{.Run.ImageFile}}{{else}}{{.Run.Image}}{{end}}</code>{{if .Run.Runtime}} via {{.Run.Runtime}}{{end}}{{else}}no image recorded{{end}}</span> |
| 52 | {{if .Run.Services}}<span class="status-note">services: {{range $i, $s := .Run.Services}}{{if $i}}, {{end}}{{$s.ID}} · <code>{{$s.Image}}</code>{{end}}</span>{{end}} |
| 53 | </div> |
| 54 | <div class="card"> |
| 55 | <span class="run-summary-label">{{icon "git-commit-horizontal"}}Commit</span> |
| 56 | <strong><a class="sha" href="/{{.Name}}/commit/{{.Run.SHA}}">{{short .Run.SHA}}</a></strong> |
| 57 | <span class="status-note">{{if .Run.Tag}}tag {{.Run.Tag}}{{else}}branch {{.Run.Branch}}{{end}}{{if eq .Run.Status "failed"}} · exit {{.Run.ExitCode}}{{end}}</span> |
| 58 | </div> |
| 59 | <div class="card"> |
| 60 | <span class="run-summary-label">{{icon "file-code"}}Workflow</span> |
| 61 | <strong><a href="/{{.Name}}/blob/{{.Run.SHA}}/{{pathurl .Run.Workflow}}">{{.Run.WorkflowTitle}}</a></strong> |
| 62 | <span class="status-note"><code>{{.Run.Workflow}}</code></span> |
| 63 | </div> |
| 64 | </div> |
| 65 | |
| 66 | {{if eq .Run.Status "canceled"}} |
| 67 | <p class="muted">{{if .Run.CancelRequested}}Stopped while running{{else}}Canceled while queued{{end}}{{if .Run.CancelActor}} by <strong>{{.Run.CancelActor}}</strong>{{end}}.</p> |
| 68 | {{else if eq .Run.Status "error"}} |
| 69 | <p class="muted">This job never started, so nothing about {{short .Run.SHA}} was tested: |
| 70 | {{if .Run.FailureMessage}}the runner said <code>{{.Run.FailureMessage}}</code>.{{else}}the runner did not record why.{{end}} |
| 71 | Re-run it once the machine can build; the commit is not what failed.</p> |
| 72 | {{else if and (eq .Run.Status "running") .Run.CancelRequested}} |
| 73 | <p class="muted">Stopping{{if .Run.CancelActor}} at the request of <strong>{{.Run.CancelActor}}</strong>{{end}} at the runner's next heartbeat.</p> |
| 74 | {{end}} |
| 75 | {{if .Run.Bot}}<p class="muted">acted as <strong>{{.Run.Bot}}</strong> with a credential for this run</p>{{end}} |
| 76 | {{if .Run.OS}}<p class="muted">ran on {{.Run.OS}}/{{.Run.Arch}}{{if .Run.Image}} · in {{if .Run.ImageFile}}image-file <code>{{.Run.ImageFile}}</code> ({{short .Run.ImageSHA}}){{else}}<code>{{.Run.Image}}</code>{{end}} via {{.Run.Runtime}}{{end}}{{if .Run.Network}} · {{if eq .Run.Network "none"}}no network{{else}}network {{.Run.Network}}{{end}}{{end}}</p>{{end}} |
| 77 | {{if .Attestation}}<p class="muted">reported by <strong>{{.Signer}}</strong> · the instance accepted this result from that account's runner connection, and logged it</p>{{end}} |
| 78 | {{if .Counts}}<p class="muted">counts as a check for this repository</p>{{else if .CountsWhy}}<p class="muted">does not count as a check: {{.CountsWhy}}</p>{{end}} |
| 79 | |
| 80 | <h2 class="with-more"><span>{{icon "terminal"}}Logs</span>{{if .HasLog}} <a class="more" href="/{{.Name}}/runs/{{.Run.ID}}/log?attempt={{.LogAttempt}}&download=1">{{icon "file"}}Download full log</a>{{end}}</h2> |
| 81 | {{if .HasLog}} |
| 82 | {{if gt (len .Logs) 1}}<div class="run-logbar"> |
| 83 | {{range .Logs}}<a class="chip" href="/{{$.Name}}/runs/{{$.Run.ID}}/log?attempt={{.Attempt}}">{{icon "file"}}attempt {{.Attempt}}</a> {{end}} |
| 84 | </div>{{end}} |
| 85 | <div class="card run-log-card"> |
| 86 | {{if .Live}} |
| 87 | <details class="run-log run-log-live" open> |
| 88 | <summary> |
| 89 | {{icon "terminal"}}<span class="run-log-title">Job output</span> |
| 90 | <span class="run-log-meta">attempt {{.LogAttempt}} · <span class="run-log-state">live</span></span> |
| 91 | </summary> |
| 92 | <pre class="run-log-text" data-log-stream |
| 93 | data-log-url="/{{.Name}}/runs/{{.Run.ID}}/log?attempt={{.LogAttempt}}" |
| 94 | data-log-final="0"></pre> |
| 95 | </details> |
| 96 | {{end}} |
| 97 | {{range .Steps}} |
| 98 | <details class="run-log{{if .LogURL}} run-step-log{{end}}"{{if .LogURL}} hx-get="{{.LogURL}}" hx-trigger="toggle once" hx-target="find pre" hx-swap="textContent"{{end}}> |
| 99 | <summary> |
| 100 | <span class="run-step-num">{{.Number}}</span> |
| 101 | <span class="run-step-name">{{.Name}}</span> |
| 102 | <span class="status {{.Status}}">{{.Label}}</span> |
| 103 | <span class="run-step-meta">{{if .Duration}}{{duration .Duration}}{{else}}—{{end}}</span> |
| 104 | </summary> |
| 105 | {{if .LogURL}}<pre class="run-log-text"></pre>{{else}}<p class="run-log-empty">{{if eq .Status "running"}}This step is running; its output is in the job output above.{{else if eq .Status "pending"}}Waiting for this step.{{else if eq .Status "queued"}}Waiting for a runner.{{else if eq .Status "not run"}}Not run.{{else}}No output was captured for this step.{{end}}</p>{{end}} |
| 106 | </details> |
| 107 | {{end}} |
| 108 | </div> |
| 109 | {{else}} |
| 110 | <div class="empty-state"><p>No log was archived for this run.</p></div> |
| 111 | {{end}} |
| 112 | |
| 113 | <h2>{{icon "hard-drive"}}Artifacts</h2> |
| 114 | {{if .Artifacts}} |
| 115 | <div class="panel"> |
| 116 | <table> |
| 117 | <tr><th>File</th><th>Size</th><th>SHA-256</th><th></th></tr> |
| 118 | {{range .Artifacts}} |
| 119 | <tr> |
| 120 | <td><a href="/{{$.Name}}/runs/{{$.Run.ID}}/artifacts/{{.Name}}">{{.Name}}</a></td> |
| 121 | <td class="muted">{{bytes .Size}}</td> |
| 122 | <td class="muted"><code>{{short .OID}}</code></td> |
| 123 | <td><a href="/{{$.Name}}/runs/{{$.Run.ID}}/artifacts/{{.Name}}">download</a></td> |
| 124 | </tr> |
| 125 | {{end}} |
| 126 | </table> |
| 127 | </div> |
| 128 | <p class="muted">Built from {{short .Run.SHA}} by this run. The bytes live once in the |
| 129 | instance's content-addressed store, and are swept only when nothing names them.</p> |
| 130 | {{else}} |
| 131 | <div class="empty-state"><p>No artifacts published by this run.</p></div> |
| 132 | {{end}} |
| 133 | {{template "footer" .}} |
| 134 | {{end}} |
| 135 |