* Specifically log, for a build, whether the top-level derivation failed, or some dependency failed, or Nix itself barfed. In the latter case log the error output from Nix.
373 lines
10 KiB
Plaintext
373 lines
10 KiB
Plaintext
[% WRAPPER layout.tt title="Hydra Overview" %]
|
|
[% PROCESS common.tt %]
|
|
[% USE HTML %]
|
|
[% USE date %]
|
|
[% USE mibs=format("%.2f") %]
|
|
|
|
<h1>
|
|
Job <tt>[% build.project.name %]:[% build.attrname %]</tt> build [% id %]
|
|
[% IF !build.finished %]
|
|
[% IF build.schedulingInfo.busy %]
|
|
(currently building)
|
|
[% ELSE %]
|
|
(scheduled)
|
|
[% END %]
|
|
[% END %]
|
|
</h1>
|
|
|
|
|
|
<h2>Information</h2>
|
|
|
|
<table>
|
|
<tr>
|
|
<th>Build ID:</th>
|
|
<td>[% build.id %]</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Time added:</th>
|
|
<td>[% date.format(build.timestamp, '%Y-%m-%d %H:%M:%S') %]</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Status:</th>
|
|
<td>
|
|
[% IF build.finished %]
|
|
[% IF build.resultInfo.buildstatus == 0 %]
|
|
<img src="/static/images/success.gif" />
|
|
<strong>Success</strong>
|
|
[% ELSIF build.resultInfo.buildstatus == 1 %]
|
|
<img src="/static/images/failure.gif" />
|
|
<span class="error">Build returned a non-zero exit code</span>
|
|
[% ELSIF build.resultInfo.buildstatus == 2 %]
|
|
<img src="/static/images/failure.gif" />
|
|
<span class="error">A dependency of the build failed</span>
|
|
[% ELSE %]
|
|
<img src="/static/images/failure.gif" />
|
|
<span class="error">Build failed</span>
|
|
(see <a href="#nix-error">below</a>)
|
|
[% END %]
|
|
[% ELSIF build.schedulingInfo.busy %]
|
|
<strong>Build in progress</strong>
|
|
[% ELSE %]
|
|
<strong>Scheduled to be built</strong>
|
|
[% END %]
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Project:</th>
|
|
<td><a href="[% c.uri_for('/project' build.project.name) %]"><tt>[% build.project.name %]</tt></a></td>
|
|
</tr>
|
|
<tr>
|
|
<th>Jobset:</th>
|
|
<td><tt>[% build.jobset.name %]</tt></td>
|
|
</tr>
|
|
<tr>
|
|
<th>Job name:</th>
|
|
<td><a href="[% c.uri_for('/job' build.project.name build.attrname) %]"><tt>[% build.attrname %]</tt></a></td>
|
|
</tr>
|
|
<tr>
|
|
<th>Nix name:</th>
|
|
<td><tt>[% build.nixname %]</tt></td>
|
|
</tr>
|
|
<tr>
|
|
<th>Description:</th>
|
|
<td>[% build.description %]</td>
|
|
</tr>
|
|
<tr>
|
|
<th>System:</th>
|
|
<td><tt>[% build.system %]</tt></td>
|
|
</tr>
|
|
<tr>
|
|
<th>Derivation store path:</th>
|
|
<td><tt>[% build.drvpath %]</tt></td>
|
|
</tr>
|
|
<tr>
|
|
<th>Output store path:</th>
|
|
<td><tt>[% build.outpath %]</tt></td>
|
|
</tr>
|
|
[% IF build.finished %]
|
|
<tr>
|
|
<th>Build started:</th>
|
|
<td>[% IF build.resultInfo.starttime %][% date.format(build.resultInfo.starttime, '%Y-%m-%d %H:%M:%S') %][% ELSE %]<em>(cached build)</em>[% END %]</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Build finished:</th>
|
|
<td>[% IF build.resultInfo.stoptime %][% date.format(build.resultInfo.stoptime, '%Y-%m-%d %H:%M:%S') %][% ELSE %]<em>(cached build)</em>[% END %]</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Duration (seconds):</th>
|
|
<td>
|
|
[% IF build.resultInfo.iscachedbuild %]
|
|
<em>(cached build)</em>
|
|
[% ELSE %]
|
|
[% build.resultInfo.stoptime - build.resultInfo.starttime %]
|
|
[% END %]
|
|
</td>
|
|
</tr>
|
|
[% IF build.resultInfo.logfile %]
|
|
<tr>
|
|
<th>Logfile:</th>
|
|
<td>
|
|
<a href="[% c.uri_for('/log' build.id) %]"><strong>Available</strong></a>
|
|
</td>
|
|
</tr>
|
|
[% END %]
|
|
[% ELSE %]
|
|
<tr>
|
|
<th>Priority:</th>
|
|
<td>[% build.schedulingInfo.priority %]</td>
|
|
</tr>
|
|
[% IF build.schedulingInfo.busy %]
|
|
<tr>
|
|
<th>Logfile:</th>
|
|
<td><tt>[% build.schedulingInfo.logfile %]</tt></td>
|
|
</tr>
|
|
[% END %]
|
|
[% END %]
|
|
</table>
|
|
|
|
|
|
<h2>Build inputs</h2>
|
|
|
|
<table class="tablesorter">
|
|
<thead>
|
|
<tr><th>Name</th><th>Type</th><th>What</th><th>Store path</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
[% FOREACH input IN build.inputs -%]
|
|
<tr>
|
|
<td><tt>[% input.name %]</tt></td>
|
|
<td><tt>[% type = input.type; inputTypes.$type %]</tt></td>
|
|
<td>
|
|
[% IF input.type == "build" %]
|
|
<a href="[% c.uri_for('/build' input.dependency.id) %]">Job <tt>[% input.dependency.project.name %]:[% input.dependency.attrname %]</tt> build [% input.dependency.id %]</a>
|
|
[% ELSIF input.type == "string" %]
|
|
<tt>"[% input.value %]"</tt>
|
|
[% ELSE %]
|
|
<tt>[% input.uri %]</tt>
|
|
[% END %]
|
|
</td>
|
|
<td><tt>[% input.path %]</tt></td>
|
|
</tr>
|
|
[% END -%]
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
[% IF build.buildsteps %]
|
|
|
|
<h2 id="buildsteps">Build steps</h2>
|
|
|
|
<table class="tablesorter">
|
|
<thead>
|
|
<tr><th>Nr</th><th>What</th><th>Duration</th><th>Status</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
[% FOREACH step IN build.buildsteps -%]
|
|
<tr>
|
|
<td>[% step.stepnr %]</td>
|
|
<td>
|
|
[% IF step.type == 0 %]
|
|
Build of <tt>[% step.outpath %]</tt>
|
|
[% ELSE %]
|
|
Substitution of <tt>[% step.outpath %]</tt>
|
|
[% END %]
|
|
</td>
|
|
<td>
|
|
[% IF step.busy == 0 %]
|
|
[% step.stoptime - step.starttime %]s
|
|
[% ELSE %]
|
|
[% IF build.finished %]
|
|
[% build.resultInfo.stoptime - step.starttime %]s
|
|
[% ELSE %]
|
|
[% curTime - step.starttime %]s
|
|
[% END %]
|
|
[% END %]
|
|
</td>
|
|
<td>
|
|
[% IF step.busy == 1 %]
|
|
[% IF build.finished %]
|
|
<span class="error">Aborted</span>
|
|
[% ELSE %]
|
|
<strong>Building</strong>
|
|
[% END %]
|
|
[% ELSIF step.status == 0 %]
|
|
Succeeded
|
|
[% ELSE %]
|
|
<span class="error">Failed: [% HTML.escape(step.errormsg) %]</span>
|
|
[% END %]
|
|
[% IF step.logfile %]
|
|
(<a href="[% c.uri_for('/nixlog' build.id step.stepnr) %]">log</a>)
|
|
[% END %]
|
|
</td>
|
|
</tr>
|
|
[% END %]
|
|
</tbody>
|
|
</table>
|
|
|
|
[% END %]
|
|
|
|
|
|
[% IF build.finished %]
|
|
|
|
|
|
[% IF build.resultInfo.errormsg %]
|
|
|
|
<h2 id="nix-error">Nix error output</h2>
|
|
|
|
<pre class="buildlog">
|
|
[% HTML.escape(build.resultInfo.errormsg) -%]
|
|
</pre>
|
|
|
|
[% END %]
|
|
|
|
|
|
[% IF build.buildproducts %]
|
|
|
|
|
|
<h2>Build products</h2>
|
|
|
|
<ul class="productList">
|
|
|
|
[% FOREACH product IN build.buildproducts -%]
|
|
<li class="product">
|
|
[% SWITCH product.type %]
|
|
|
|
[% CASE "nix-build" %]
|
|
<a href="[% c.uri_for('/closure' build.id product.productnr) %]">
|
|
<img src="/static/images/nix-build.png" alt="Source" />
|
|
Nix build of path <tt>[% product.path %]</tt>
|
|
</a>
|
|
[<a class="productDetailsToggle" href="javascript:">help</a>]
|
|
<div class="help productDetails">
|
|
<p>If you have Nix installed on your machine, this build and all
|
|
its dependencies can be unpacked into your local Nix store by
|
|
doing:</p>
|
|
|
|
<pre>$ gunzip < [% HTML.escape(build.nixname) %].closure.gz | nix-store --import</pre>
|
|
|
|
or to download and unpack in one command:
|
|
|
|
<pre>$ curl [% c.uri_for('/closure' build.id product.productnr) %] | gunzip | nix-store --import</pre>
|
|
|
|
<p>The package can then be found in the path <tt>[%
|
|
product.path %]</tt>. If you get the error message “imported
|
|
archive lacks a signature”, you should make sure that you have
|
|
sufficient access rights to the Nix store, e.g., run the
|
|
command as <tt>root</tt>.</p>
|
|
</div>
|
|
|
|
[% CASE "file" %]
|
|
<a href="[% c.uri_for('/download' build.id product.productnr product.name) %]">
|
|
[% SWITCH product.subtype %]
|
|
[% CASE "source-dist" %]
|
|
<img src="/static/images/source-dist.png" alt="Source" /> Source distribution <tt>[% product.name %]</tt>
|
|
[% CASE "rpm" %]
|
|
<img src="/static/images/rpm.png" alt="RPM" /> RPM package <tt>[% product.name %]</tt>
|
|
[% CASE DEFAULT %]
|
|
File <tt>[% product.name %]</tt> of type <tt>[% product.subtype %]</tt>
|
|
[% END %]
|
|
</a>
|
|
[<a class="productDetailsToggle" href="javascript:">details</a>]
|
|
<div class="productDetails">
|
|
<table>
|
|
<tr>
|
|
<th>URL:</th>
|
|
<td>
|
|
<a href="[% c.uri_for('/download' build.id product.productnr product.name) %]">
|
|
<tt>[% c.uri_for('/download' build.id product.productnr product.name) %]</tt>
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
<tr><th>File size:</th><td>[% product.filesize %] bytes ([% mibs(product.filesize / (1024 * 1024)) %] MiB)</td></tr>
|
|
<tr><th>SHA-1 hash:</th><td>[% product.sha1hash %]</td></tr>
|
|
<tr><th>SHA-256 hash:</th><td>[% product.sha256hash %]</td></tr>
|
|
<tr><th>Full path:</th><td><tt>[% product.path %]</tt></td></tr>
|
|
</table>
|
|
</div>
|
|
|
|
[% CASE "report" %]
|
|
|
|
<a href="[% c.uri_for('/download' build.id product.productnr product.name) %]">
|
|
<img src="/static/images/report.png" alt="Report" />
|
|
[% SWITCH product.subtype %]
|
|
[% CASE "coverage" %]
|
|
Code coverage analysis report
|
|
[% CASE DEFAULT %]
|
|
Report of type <tt>[% product.subtype %]</tt>
|
|
[% END %]
|
|
</a>
|
|
|
|
[% CASE "doc" %]
|
|
|
|
<a href="[% c.uri_for('/download' build.id product.productnr product.name) %]">
|
|
<img src="/static/images/document.png" alt="Document" />
|
|
[% SWITCH product.subtype %]
|
|
[% CASE "readme" %]
|
|
“README” file
|
|
[% CASE DEFAULT %]
|
|
Documentation of type <tt>[% product.subtype %]</tt>
|
|
[% END %]
|
|
</a>
|
|
|
|
[% CASE DEFAULT %]
|
|
Something of type <tt>[% product.type %]</tt>
|
|
|
|
[% END %]
|
|
</li>
|
|
[% END -%]
|
|
|
|
</ul>
|
|
|
|
<script>
|
|
$(document).ready(function() {
|
|
$('.productDetailsToggle').toggle(
|
|
function () { $(".productDetails", $(this).parents(".product")).fadeIn(); },
|
|
function () { $(".productDetails", $(this).parents(".product")).hide(); }
|
|
);
|
|
});
|
|
</script>
|
|
|
|
[% END %]
|
|
|
|
|
|
[% IF build.dependents %]
|
|
|
|
<h2>Used by</h2>
|
|
|
|
<p>The following builds have used this build as an input:</p>
|
|
|
|
<table class="tablesorter">
|
|
<thead>
|
|
<tr><th>Build</th><th>Input name</th><th>System</th><th>Timestamp</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
[% FOREACH input IN build.dependents -%]
|
|
<tr>
|
|
<td><a href="[% c.uri_for('/build' input.build.id) %]">Job <tt>[% input.build.project.name %]:[% input.build.attrname %]</tt> build [% input.build.id %]</a></td>
|
|
<td><tt>[% input.name %]</tt></td>
|
|
<td><tt>[% input.build.system %]</tt></td>
|
|
<td>[% date.format(input.build.timestamp, '%Y-%m-%d %H:%M:%S') %]</td>
|
|
</tr>
|
|
[% END -%]
|
|
</tbody>
|
|
</table>
|
|
|
|
[% END %]
|
|
|
|
|
|
[% ELSIF build.schedulingInfo.busy %]
|
|
|
|
|
|
<h2>Log</h2>
|
|
|
|
<pre class="buildlog">
|
|
[% HTML.escape(logtext) -%]
|
|
</pre>
|
|
|
|
|
|
[% END %]
|
|
|
|
|
|
[% END %]
|
|
|