Luigit
repositories / bugabinga.net

bugabinga.net

personal infrastructure for bugabinga!

owned by admin

services/luci/internal/web/assets/run.tmpl

Raw
{{define "execution-config"}}
{{ $child := . }}{{with .Config}}<details class="execution-config" data-child="{{$child.RunID}}-{{$child.ChildID}}-config">
<summary>Execution configuration</summary>
<div class="config-panel">
<p><b>Image</b><code>{{.Image}}</code></p>
<p><b>Matrix</b><code>{{.Matrix}}</code></p>
<p><b>Trigger</b>{{.Trigger}}</p>
<p><b>Commands</b></p>
<pre>{{range .Commands}}{{.}}
{{end}}</pre>
<div class="codebox">
<div class="code-head"><span>Job source · .ci/{{.SourceFile}}</span><button data-copy="{{.Source}}" data-copy-kind="KDL">Copy job KDL</button></div>
<pre>{{kdl .Source}}</pre>
</div>
</div>
</details>{{end}}
{{end}}
{{define "child-failure"}}
<section class="execution failure">
<div class="eyebrow">Affected execution</div>
<div class="execution-head"><h2><span class="state failed">FAILED</span> {{.Job}}</h2>{{if ne .DurationSeconds "—"}}<button class="scalar timing" data-raw="{{.DurationSeconds}}" data-kind="duration in seconds" aria-label="Copy duration {{.DurationSeconds}} seconds">{{.Timing}}</button>{{else}}<span class="timing">{{.Timing}}</span>{{end}}</div>
{{if .Matrix}}<p class="variant">{{.Matrix}}</p>{{end}}
{{if .Wait}}<p><button class="scalar muted" data-raw="{{.WaitSeconds}}" data-kind="queue wait in seconds" aria-label="Copy queue wait {{.WaitSeconds}} seconds">{{.Wait}}</button></p>{{end}}
{{if .Detail}}<p class="callout"><b>Child failure detail</b>{{.Detail}}</p>{{end}}
{{template "execution-config" .}}
<div class="evidence"><div class="eyebrow">Actual evidence · child {{.ChildID}}</div>{{if .LogError}}<p class="muted">{{.LogError}}</p>{{else}}<pre>{{if .Truncated}}[earlier output truncated]
{{end}}{{.LogHTML}}</pre><p><a href="{{.RawURL}}">Complete raw log</a></p>{{end}}</div>
{{if .Steps}}<details class="steps" data-child="{{.RunID}}-{{.ChildID}}-steps" open><summary>step timing</summary><table><tr><th>Step</th><th>Command</th><th class="seconds">Time</th></tr>{{range .Steps}}<tr{{if .Failed}} class="failed"{{end}}><td>{{.N}}/{{.Total}}</td><td>{{.Command}}</td><td class="seconds">{{if .Done}}<button class="scalar" data-raw="{{.Seconds}}" data-kind="step duration in seconds" aria-label="Copy step duration {{.Seconds}} seconds">{{.Seconds}}s</button>{{else}}<span class="undone">running…</span>{{end}}</td></tr>{{end}}</table></details>{{end}}
{{ $command := commandText "luci" "log" (runToken .) .ChildID }}<details class="cli"><summary>Continue in CLI</summary><div class="command-panel"><p>Nushell command · read-only · local Luci data access required.</p><pre aria-label="Nushell command preview">{{commandHTML "luci" "log" (runToken .) .ChildID}}</pre><button data-copy="{{$command}}" data-copy-kind="Nushell command">Copy Nushell command</button><p class="muted">Full run ID + stable child selector. Copying never executes it.</p></div></details>
</section>
{{end}}
{{define "child-compact"}}
<details class="execution compact" data-child="{{.RunID}}-{{.ChildID}}">
<summary><span class="state {{.Status}}">{{if eq .Status "success"}}PASSED{{else}}{{upper .Status}}{{end}}</span><span>{{.Job}}</span>{{if .Matrix}}<span class="variant">{{.Matrix}}</span>{{end}}<span class="timing">{{.Timing}}</span></summary>
<div class="compact-body">
{{if ne .DurationSeconds "—"}}<p><button class="scalar timing" data-raw="{{.DurationSeconds}}" data-kind="duration in seconds" aria-label="Copy duration {{.DurationSeconds}} seconds">{{.Timing}}</button></p>{{end}}
{{if .Wait}}<p><button class="scalar muted" data-raw="{{.WaitSeconds}}" data-kind="queue wait in seconds" aria-label="Copy queue wait {{.WaitSeconds}} seconds">{{.Wait}}</button></p>{{end}}
{{if .Detail}}<p class="callout"><b>Detail</b>{{.Detail}}</p>{{end}}
{{template "execution-config" .}}
{{if .Steps}}<details class="steps"><summary>step timing</summary><table><tr><th>Step</th><th>Command</th><th class="seconds">Time</th></tr>{{range .Steps}}<tr{{if .Failed}} class="failed"{{end}}><td>{{.N}}/{{.Total}}</td><td>{{.Command}}</td><td class="seconds">{{if .Done}}{{.Seconds}}s{{else}}<span class="undone">running…</span>{{end}}</td></tr>{{end}}</table></details>{{end}}
{{if .LogError}}<p class="muted">{{.LogError}}</p>{{else}}<p><a href="{{.RawURL}}">Complete raw log</a></p><details class="log"><summary>Log tail</summary><pre>{{if .Truncated}}[earlier output truncated]
{{end}}{{.LogHTML}}</pre></details>{{end}}
{{ $command := commandText "luci" "log" (runToken .) .ChildID }}<details class="cli"><summary>Continue in CLI</summary><div class="command-panel"><p>Nushell command · read-only.</p><pre>{{commandHTML "luci" "log" (runToken .) .ChildID}}</pre><button data-copy="{{$command}}" data-copy-kind="Nushell command">Copy Nushell command</button><p class="muted">Local Luci data access required · no execution.</p></div></details>
</div>
</details>
{{end}}
{{define "body"}}
{{range .Warnings}}<p class="warning"><b>State warning</b><br>{{.}}</p>{{end}}
{{if .Known}}
{{ $run := runToken .Parent }}{{ $display := runDisplay .Parent }}
<nav class="crumb" aria-label="Breadcrumb"><a href="/">Runs</a><span>/</span><a href="/repos/{{.Parent.Repo}}">{{.Parent.Repo}}</a><span>/</span><button class="scalar" data-raw="{{$run}}" data-kind="full run ID" aria-label="Copy full run ID {{$run}}">{{$display}}</button></nav>
<section class="run-head {{.Parent.Status}}">
<div class="eyebrow">Run summary</div>
<h1>{{if eq .Parent.Status "failed"}}<span class="failed">Run failed.</span>{{else if eq .Parent.Status "success"}}<span class="success">Run passed.</span>{{else}}<span class="{{.Parent.Status}}">{{upper .Parent.Status}}.</span>{{end}}</h1>
{{if .Outcomes}}<p class="outcomes">{{range .Outcomes}}<span class="{{.Status}}">{{.Count}} {{if eq .Status "success"}}passed{{else}}{{.Status}}{{end}}.</span> {{end}}</p>{{end}}
<p class="run-title">{{.Parent.Repo}} <span>/ {{.Parent.Job}}</span></p>
{{if .Parent.Subject}}<p class="subject">{{.Parent.Subject}}</p>{{end}}
<div class="run-meta"><button class="scalar" data-raw="{{$run}}" data-kind="full run ID" aria-label="Copy full run ID {{$run}}">{{$display}}</button>{{if ne .Parent.FullRev "—"}}<span>·</span><button class="scalar sha" data-raw="{{.Parent.FullRev}}" data-kind="full Git revision" aria-label="Copy full Git revision {{.Parent.FullRev}}">{{.Parent.Rev}}</button>{{end}}{{if ne .Parent.Finished "—"}}<span>·</span><button class="scalar" data-raw="{{.Parent.Finished}}" data-kind="finished timestamp · RFC 3339" aria-label="Copy finished timestamp {{.Parent.Finished}}">finished {{.Parent.FinishedHuman}}</button>{{end}}</div>
{{if .Parent.Detail}}<p class="callout"><b>Parent failure detail</b>{{.Parent.Detail}}</p>{{end}}
</section>
<div class="run-layout"><div class="run-primary">
{{if .HasOutput}}<section class="output"><div class="eyebrow">Result output · {{.Output.Job}}{{if .Output.Matrix}} · {{.Output.Matrix}}{{end}}</div><pre>{{if .Output.Truncated}}[earlier output truncated]
{{end}}{{.Output.LogHTML}}</pre><p><a href="{{.Output.RawURL}}">Complete raw log</a></p></section>{{end}}
{{range .Failed}}{{template "child-failure" .}}{{end}}
{{if .Other}}<section class="execution-list"><div class="eyebrow">In progress / skipped</div>{{range .Other}}{{template "child-compact" .}}{{end}}</section>{{end}}
{{if .Passed}}<section class="execution-list passed"><div class="eyebrow">Passed · {{len .Passed}} executions</div>{{range .Passed}}{{template "child-compact" .}}{{end}}</section>{{end}}
{{if .Config.Files}}<details class="kdl" data-child="kdl-config"><summary>All configuration at this revision</summary>{{if .Config.Error}}<p class="warning"><b>Configuration invalid</b><br>{{.Config.Error}}</p>{{end}}{{range .Config.Files}}<section class="codebox"><div class="code-head"><span>{{.Name}} @ {{$.Parent.Rev}}</span><button data-copy="{{.Body}}" data-copy-kind="KDL">Copy KDL</button></div><pre>{{kdl .Body}}</pre></section>{{end}}</details>{{end}}
</div><aside>
<h2>Run context</h2>
<div class="facts"><div><b>Started</b>{{if ne .Parent.Started "—"}}<button class="scalar" data-raw="{{.Parent.Started}}" data-kind="started timestamp · RFC 3339" aria-label="Copy started timestamp {{.Parent.Started}}">{{.Parent.StartedHuman}}</button>{{else}}<span>—</span>{{end}}</div><div><b>Duration</b>{{if ne .Parent.DurationSeconds "—"}}<button class="scalar" data-raw="{{.Parent.DurationSeconds}}" data-kind="duration in seconds" aria-label="Copy duration {{.Parent.DurationSeconds}} seconds">{{.Parent.Timing}}</button>{{else}}<span>—</span>{{end}}</div><div><b>Ref</b>{{if ne .Parent.FullRef "—"}}<button class="scalar" data-raw="{{.Parent.FullRef}}" data-kind="full Git ref" aria-label="Copy full Git ref {{.Parent.FullRef}}">{{.Parent.Ref}}</button>{{else}}<span>—</span>{{end}}</div><div><b>Trigger</b><span>{{.Parent.Trigger}}</span></div>{{if ne .Parent.Finished "—"}}<div><b>Finished</b><button class="scalar" data-raw="{{.Parent.Finished}}" data-kind="finished timestamp · RFC 3339" aria-label="Copy finished timestamp {{.Parent.Finished}}">{{.Parent.FinishedHuman}}</button></div>{{end}}</div>
<p class="hint">Dotted values reveal canonical values on hover/focus. Activate to copy.</p>
{{if .Artifacts}}<section><h2>Artifacts</h2><ul>{{range .Artifacts}}<li><a href="/runs/{{$run}}/artifacts/{{.Name}}">{{.Name}}</a> · {{.Size}} bytes</li>{{end}}</ul></section>{{end}}
{{ $show := commandText "luci" "show" $run }}<details class="cli"><summary>Inspect in CLI</summary><div class="command-panel"><p>Nushell command · read-only · local Luci data access required.</p><pre>{{commandHTML "luci" "show" $run}}</pre><button data-copy="{{$show}}" data-copy-kind="Nushell command">Copy Nushell command</button><p class="muted">Remote SSH accepts a restricted <code>ci</code> command set. See <code>ci docs</code> on that endpoint.</p></div></details>
{{ $repoCommand := commandText "luci" "repo" .Parent.Repo }}<details class="cli"><summary>Inspect repository in CLI</summary><div class="command-panel"><p>Nushell command · read-only · local Luci data access required.</p><pre>{{commandHTML "luci" "repo" .Parent.Repo}}</pre><button data-copy="{{$repoCommand}}" data-copy-kind="Nushell command">Copy Nushell command</button><p class="muted">Copying never executes it.</p></div></details>
<a class="repo-link" href="/repos/{{.Parent.Repo}}">Repository history ↗</a>
</aside></div>
{{else}}<h1>Unknown run</h1><p class="muted">Unknown run.</p>{{end}}
<script>document.querySelectorAll('details[data-child]').forEach(d=>{const k='luci-'+d.dataset.child;const v=sessionStorage.getItem(k);if(v!==null)d.open=v==='1';d.addEventListener('toggle',()=>sessionStorage.setItem(k,d.open))})</script>
{{end}}