circus/crates/server/templates/build.html
NotAShelf 4597869213
fc-server: add 'reproduce build' section to build template
Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I2c9f6951e9b6014a32140216367693de6a6a6964
2026-02-08 22:23:26 +03:00

117 lines
3.6 KiB
HTML

{% extends "base.html" %}
{% block title %}Build {{ build.job_name }} - FC CI{% endblock %}
{% block breadcrumbs %}
<nav class="breadcrumbs">
<a href="/">Home</a> <span class="sep">/</span>
<a href="/project/{{ project_id }}">{{ project_name }}</a> <span class="sep">/</span>
<a href="/jobset/{{ jobset_id }}">{{ jobset_name }}</a> <span class="sep">/</span>
<a href="/evaluation/{{ eval_id }}">{{ eval_commit_short }}</a> <span class="sep">/</span>
<span class="current">{{ build.job_name }}</span>
</nav>
{% endblock %}
{% block content %}
<h1>Build: {{ build.job_name }}</h1>
<dl class="detail-grid">
<dt>Status</dt>
<dd><span class="badge badge-{{ build.status_class }}">{{ build.status_text }}</span></dd>
<dt>System</dt>
<dd>{{ build.system }}</dd>
<dt>Derivation</dt>
<dd><code>{{ build.drv_path }}</code></dd>
<dt>Created</dt>
<dd>{{ build.created_at }}</dd>
{% if !build.started_at.is_empty() %}
<dt>Started</dt>
<dd>{{ build.started_at }}</dd>
{% endif %}
{% if !build.completed_at.is_empty() %}
<dt>Completed</dt>
<dd>{{ build.completed_at }}</dd>
{% endif %}
{% if !build.duration.is_empty() %}
<dt>Duration</dt>
<dd>{{ build.duration }}</dd>
{% endif %}
<dt>Priority</dt>
<dd>{{ build.priority }}</dd>
<dt>Signed</dt>
<dd>{% if build.signed %}Yes{% else %}No{% endif %}</dd>
{% if build.is_aggregate %}
<dt>Aggregate</dt>
<dd>Yes</dd>
{% endif %}
</dl>
{% if !build.output_path.is_empty() %}
<p><strong>Output:</strong> <code>{{ build.output_path }}</code></p>
{% endif %}
{% if !build.error_message.is_empty() %}
<p><strong>Error:</strong> {{ build.error_message }}</p>
{% endif %}
{% if !build.log_url.is_empty() %}
<p><a href="{{ build.log_url }}">View log</a></p>
{% endif %}
<h2>Reproduce This Build</h2>
<div class="card">
<div class="card-body">
<p>To reproduce this build locally, run one of the following commands:</p>
<div class="code-block">
<strong>Using Nix (flakes):</strong>
<pre><code>nix build {{ build.drv_path }}^*</code></pre>
</div>
<div class="code-block">
<strong>Using legacy nix-build:</strong>
<pre><code>nix-build {{ build.drv_path }}</code></pre>
</div>
<p class="text-muted">Note: You may need to add this server as a substituter to avoid rebuilding dependencies.</p>
</div>
</div>
<h2>Build Steps</h2>
{% if steps.is_empty() %}
<div class="empty">No steps recorded.</div>
{% else %}
<div class="table-wrap">
<table>
<thead>
<tr><th>#</th><th>Command</th><th>Exit</th><th>Started</th><th>Completed</th></tr>
</thead>
<tbody>
{% for s in steps %}
<tr>
<td>{{ s.step_number }}</td>
<td><code>{{ s.command }}</code></td>
<td>{% match s.exit_code %}{% when Some with (0) %}<span class="step-success">0</span>{% when Some with (code) %}<span class="step-failure">{{ code }}</span>{% when None %}-{% endmatch %}</td>
<td>{{ s.started_at.format("%H:%M:%S") }}</td>
<td>{% match s.completed_at %}{% when Some with (t) %}{{ t.format("%H:%M:%S") }}{% when None %}-{% endmatch %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
<h2>Build Products</h2>
{% if products.is_empty() %}
<div class="empty">No products recorded.</div>
{% else %}
<div class="table-wrap">
<table>
<thead>
<tr><th>Name</th><th>Path</th><th>Size</th></tr>
</thead>
<tbody>
{% for p in products %}
<tr>
<td>{{ p.name }}</td>
<td><code>{{ p.path }}</code></td>
<td>{% match p.file_size %}{% when Some with (sz) %}{{ sz }} bytes{% when None %}-{% endmatch %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
{% endblock %}