src
Hydra
lib
programs
root
static
all.tt
build.tt
common.tt
error.tt
index.tt
job.tt
jobstatus.tt
layout.tt
log.tt
login.tt
project.tt
queue.tt
script
xsl
Makefile.PL
hydra.conf
hydra.sql
test.sql
385 lines
11 KiB
Plaintext
385 lines
11 KiB
Plaintext
[% WRAPPER layout.tt title="Build Information" %]
|
|
[% PROCESS common.tt %]
|
|
[% USE HTML %]
|
|
[% 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 class="layoutTable">
|
|
<tr>
|
|
<th>Build ID:</th>
|
|
<td>[% build.id %]</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Time added:</th>
|
|
<td>[% PROCESS renderDateTime timestamp = build.timestamp %]</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>
|
|
since [% PROCESS renderDateTime timestamp = build.schedulingInfo.starttime %]
|
|
[% 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 %][% PROCESS renderDateTime timestamp = build.resultInfo.starttime %][% ELSE %]<em>(cached build)</em>[% END %]</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Build finished:</th>
|
|
<td>[% IF build.resultInfo.stoptime %][% PROCESS renderDateTime timestamp = build.resultInfo.stoptime %][% 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.releasename %]
|
|
<tr>
|
|
<th>Release name:</th>
|
|
<td><tt>[% HTML.escape(build.resultInfo.releasename) %]</tt></td>
|
|
</tr>
|
|
[% END %]
|
|
[% 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>Value</th><th>Revision</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" || input.type == "boolean" %]
|
|
<tt>"[% input.value %]"</tt>
|
|
[% ELSE %]
|
|
<tt>[% input.uri %]</tt>
|
|
[% END %]
|
|
</td>
|
|
<td>[% IF input.revision %][% input.revision %][% 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 class="[% IF step.logfile %]clickable[% END %]"
|
|
[% IF step.logfile %] onclick="window.location = '[% c.uri_for('/nixlog' build.id step.stepnr) %]'" [% END %]>
|
|
<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 "deb" %]
|
|
<img src="/static/images/debian.png" alt="RPM" /> Debian 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 "manual" %]
|
|
Manual
|
|
[% 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>[% PROCESS renderDateTime timestamp = input.build.timestamp %]</td>
|
|
</tr>
|
|
[% END -%]
|
|
</tbody>
|
|
</table>
|
|
|
|
[% END %]
|
|
|
|
|
|
[% ELSIF build.schedulingInfo.busy %]
|
|
|
|
|
|
<h2>Log</h2>
|
|
|
|
<pre class="buildlog">
|
|
[% HTML.escape(logtext) -%]
|
|
</pre>
|
|
|
|
|
|
[% END %]
|
|
|
|
|
|
[% END %]
|
|
|