[% WRAPPER layout.tt title="Build $id of job $project.name:$jobset.name:$job.name" %]
[% PROCESS common.tt %]
[% PROCESS "product-list.tt" %]
[% USE HTML %]
[% USE Date %]
[%
isAggregate = constituents.size > 0;
busy = 0;
building = 0;
FOR step IN steps;
IF step.busy;
busy = 1;
IF step.drvpath == build.drvpath; building = 1; END;
END;
END;
%]
[% BLOCK renderOutputs %]
[% start=1; FOREACH output IN outputs %]
[% IF !start %],
[% END; start=0; output.path %]
[% END %]
[% END %]
[% BLOCK renderBuildSteps %]
[% INCLUDE renderBuildStatusIcon size=128 build=build %]
|
Build ID: |
[% build.id %] |
Status: |
[% INCLUDE renderStatus build=build icon=0 busy=busy %]
[% IF isAggregate;
nrConstituents = 0;
nrFinished = 0;
nrFailedConstituents = 0;
FOREACH b IN constituents;
nrConstituents = nrConstituents + 1;
IF b.finished; nrFinished = nrFinished + 1; END;
IF b.finished && b.buildstatus != 0; nrFailedConstituents = nrFailedConstituents + 1; END;
END;
%];
[%+ IF nrFinished == nrConstituents && nrFailedConstituents == 0 %]
all [% nrConstituents %] constituent builds succeeded
[% ELSE %]
[% nrFailedConstituents %] out of [% nrConstituents %] constituent builds failed
[% IF nrFinished < nrConstituents %]
([% nrConstituents - nrFinished %] still pending)
[% END %]
[% END %]
[% END %]
|
System: |
[% build.system %] |
[% IF build.releasename %]
Release name: |
[% HTML.escape(build.releasename) %] |
[% ELSE %]
Nix name: |
[% build.nixname %] |
[% END %]
[% IF eval %]
Part of: |
evaluation [% eval.id %]
[% IF nrEvals > 1 +%] (and [% nrEvals - 1 %] others)[% END %]
|
[% END %]
[% IF build.iscachedbuild %]
Cached from: |
[% IF cachedBuild; INCLUDE renderFullBuildLink build=cachedBuild; ELSE %]unknown[% END %] |
[% END %]
[% actualBuild = build.iscachedbuild ? cachedBuild : build %]
[% IF (!isAggregate || !build.ischannel) && build.finished; %]
[% IF actualBuild %]
Duration: |
[% INCLUDE renderDuration duration = actualBuild.stoptime - actualBuild.starttime %] |
[% END %]
Finished at: |
[% INCLUDE renderDateTime timestamp = build.stoptime; %] |
[% END %]
[% IF (!build.finished && building) || (build.finished && (!isAggregate || !build.ischannel) && buildLogExists(build)) %]
Logfile: |
[% actualLog = cachedBuildStep ? c.uri_for('/build' cachedBuild.id 'nixlog' cachedBuildStep.stepnr) : c.uri_for('/build' build.id 'log') %]
pretty
raw
tail
|
[% END %]
|
[% IF build.ischannel || (build.buildproducts && !isAggregate) %]
Build products
[% IF !available %]
Note: this build is no longer available.
[% END %]
[% INCLUDE renderProductList latestRoot=['/job' build.project.name build.jobset.name build.job.name 'latest'] %]
[% END %]
[% IF busy %]
Running build steps
[% INCLUDE renderBuildSteps type="Running" %]
[% END %]
[% IF build.finished %]
[% IF steps && build.buildstatus != 0 && build.buildstatus != 4 && build.buildstatus != 6 %]
Failed build steps
[% INCLUDE renderBuildSteps type="Failed" %]
[% END %]
[% IF otherEval %]
Changes
[% INCLUDE renderInputDiff inputs2=eval.jobsetevalinputs inputs1=otherEval.jobsetevalinputs %]
[% END %]
[% IF prevSuccessfulBuild %]
Previous builds
Last successful build [% INCLUDE renderDateTime timestamp = prevSuccessfulBuild.timestamp %] |
[% IF prevSuccessfulBuild && firstBrokenBuild && firstBrokenBuild.id != build.id %]
First broken build [% INCLUDE renderDateTime timestamp = firstBrokenBuild.timestamp %]
|
[% END %]
This build [% INCLUDE renderDateTime timestamp = build.timestamp %]
|
[% INCLUDE renderBuildStatusIcon build=prevSuccessfulBuild size=32 %] [% INCLUDE renderBuildLink build=prevSuccessfulBuild %] |
[% IF prevSuccessfulBuild && firstBrokenBuild && firstBrokenBuild.id != build.id %]
[% INCLUDE renderBuildStatusIcon build=firstBrokenBuild size=32 %] [% INCLUDE renderBuildLink build=firstBrokenBuild %] |
[% END %]
[% INCLUDE renderBuildStatusIcon build=build size=32 %] [% INCLUDE renderBuildLink build=build %] |
|
[% IF prevSuccessfulBuild && firstBrokenBuild && firstBrokenBuild.id != build.id %]
[% INCLUDE renderInputDiff inputs1=prevSuccessfulBuild.inputs inputs2=firstBrokenBuild.inputs %] |
[% END %]
[% END %]
[% END %]
[% IF isAggregate %]
This build is an aggregate of the following builds:
[% INCLUDE renderBuildList builds=constituents hideProjectName=1 hideJobsetName=1 %]
[% END %]
Queued at: |
[% INCLUDE renderDateTime timestamp = build.timestamp %] |
[% IF build.finished && !build.iscachedbuild %]
Build started: |
[% INCLUDE renderDateTime timestamp = build.starttime %] |
Build finished: |
[% INCLUDE renderDateTime timestamp = build.stoptime %] |
[% END %]
[% IF !build.finished %]
Priority: |
[% build.priority %] |
[% END %]
[% IF build.nixexprinput %]
Nix expression: |
file [% HTML.escape(build.nixexprpath) %] in input [% HTML.escape(build.nixexprinput) %] |
[% END %]
Nix name: |
[% build.nixname %] |
Short description: |
[% IF build.description %][% HTML.escape(build.description) %][% ELSE %]not given[% END %] |
License: |
[% IF build.license %][% HTML.escape(build.license) %][% ELSE %]not given[% END %] |
Homepage: |
[% IF build.homepage %] build.homepage) %]>[% HTML.escape(build.homepage) %][% ELSE %]not given[% END %] |
Maintainer(s): |
[% IF build.maintainers %][% HTML.escape(build.maintainers) %][% ELSE %]not given[% END %] |
System: |
[% build.system %] |
Derivation store path: |
[% build.drvpath %] |
Output store paths: |
[% INCLUDE renderOutputs outputs=build.buildoutputs %] |
[% chartsURL = c.uri_for('/job' build.project.name build.jobset.name build.job.name) _ "#tabs-charts" %]
[% IF build.finished && build.closuresize %]
Closure size: |
[% mibs(build.closuresize / (1024 * 1024)) %] MiB
(history) |
[% END %]
[% IF build.finished && build.closuresize %]
Output size: |
[% mibs(build.size / (1024 * 1024)) %] MiB
(history) |
[% END %]
[% IF build.finished && build.buildproducts %]
Availability: |
[% IF !available %]
Build output is no longer available
[% ELSIF build.keep %]
Build output will be kept permanently
[% ELSE %]
Build output is available, but may be garbage-collected
[% END %]
|
[% END %]
[% IF build.finished && build.buildmetrics %]
Metrics
[% END %]
[% IF build.inputs && build.inputs.size > 0 %]
[% INCLUDE renderInputs inputs=build.inputs %]
[% ELSIF eval %]
[% INCLUDE renderInputs inputs=eval.jobsetevalinputs %]
[% END %]
[% IF steps %]
[% INCLUDE renderBuildSteps type="All" %]
[% END %]
[% IF build.dependents %]
The following builds have used this build as an input:
Build | Input name | System | Timestamp |
[% FOREACH input IN build.dependents %]
[% INCLUDE renderFullBuildLink build=input.build %] |
[% input.name %] |
[% input.build.system %] |
[% INCLUDE renderDateTime timestamp = input.build.timestamp %] |
[% END %]
[% END %]
[% IF drvAvailable %]
[% INCLUDE makeLazyTab tabName="tabs-build-deps" uri=c.uri_for('/build' build.id 'build-deps') %]
[% END %]
[% IF available %]
[% INCLUDE makeLazyTab tabName="tabs-runtime-deps" uri=c.uri_for('/build' build.id 'runtime-deps') %]
[% END %]
[% url = c.uri_for('/build' build.id 'reproduce') %]
[% IF eval.flake %]
If you have Nix
installed, you can reproduce this build on your own machine by
running the following command:
# nix build [% HTML.escape(eval.flake) %]#hydraJobs.[% HTML.escape(job.name) %]
[% ELSE %]
If you have Nix
installed, you can reproduce this build on your own machine by
downloading url) %]>a script
that checks out all inputs of the build and then invokes Nix to
perform the build.
To download and execute the script from the command line, run the
following command:
# curl url) %]>[% HTML.escape(url) %] | bash
[% END %]
[% END %]