monitored while the build is in progress.
CLJQCY2XHIDNNMFBJ5PK3GQEN6RFALEFKXBJRWZPEIKR4PR5ZQ5AC WHAFVCEIHCWHKY2UVRGRQORERUAK6SZJI7ZENA367ZX4EXDIQMDQC L2E6EVE2RVFVDCUNRJ4CZYSQNS2DZUA5DTBETHBDUQUV2KQQRAOQC J5UVLXOK6EDIL5I7VKWH4V2QDS4DPD7FHRK6XBWSXFRQS4JKXFZQC PHX2HIVGHHKCAX6VNN2WXD4LRGSA74KQMJCCTMHK7HS6JPELVECAC M552HLIAP52D42AVXVC5SGROAYN2TBCEUZOXESWEMBBUX7G3U6TAC X27GNHDV5KPZ5GSH6DCAJMNCEMZLCP7M43JWF2X3O5QWXMOX273AC 7YBYT2LQML2PKEO6UO4444AGSASS664UCDXW2YO3ALB7THQHCEBQC N22GPKYTOLZLBGTGDATQDVZ4R5APZEAOIA7L32X4UXBH4XNI7MWAC , where => "finished != 0 and timestamp = (select max(timestamp) from Builds where project == me.project and attrName == me.attrName)"
, where => "finished != 0 and timestamp = (select max(timestamp) from Builds where project == me.project and attrName == me.attrName and finished != 0)"
}sub nixlog :Local {my ( $self, $c, $id, $stepnr ) = @_;my $build = getBuild($c, $id);return error($c, "Build with ID $id doesn't exist.") if !defined $build;my $step = $build->buildsteps->find({stepnr => $stepnr});return error($c, "Build $id doesn't have a build step $stepnr.") if !defined $step;$c->stash->{template} = 'log.tt';$c->stash->{id} = $id;$c->stash->{step} = $step;# !!! should be done in the view (as a TT plugin).$c->stash->{logtext} = loadLog($step->logfile);
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 13:41:38# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:dKMSSomUN+gJX57Z5e295w
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 18:02:00# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:MtL3cwH9upjNmhaZkGszRA
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 13:41:38# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ZOxJeT+ltgyc/zuDl9aEDQ
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 18:02:00# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:vvyGq3BeKyyK7K6uDxJHyQ
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 13:41:38# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:rZPTilX/PAiIoxffxc0nJw
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 18:02:00# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:et00AvSBi5LZUoIrIUOKFQ
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 13:41:38# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:2Vfqs9RUhbDrje18yZb3AA
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 18:02:00# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:8zXrs7iT2h3xp6C/2q37uQ
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 13:41:38# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:1GZeB3YVr064AZrGargmFg
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 18:02:00# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:c8feWTpKijITXXSdJICuFg
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 13:41:38# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:rN7v2+MnC8TkrEHUzt2Gqg
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 18:02:00# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Z65HteUghCT7sXfXpsHYXg
package HydraFrontend::Schema::Buildsteps;use strict;use warnings;use base 'DBIx::Class';__PACKAGE__->load_components("Core");__PACKAGE__->table("BuildSteps");__PACKAGE__->add_columns("id",{ data_type => "integer", is_nullable => 0, size => undef },"stepnr",{ data_type => "integer", is_nullable => 0, size => undef },"type",{ data_type => "integer", is_nullable => 0, size => undef },"drvpath",{ data_type => "text", is_nullable => 0, size => undef },"outpath",{ data_type => "text", is_nullable => 0, size => undef },"logfile",{ data_type => "text", is_nullable => 0, size => undef },"busy",{ data_type => "integer", is_nullable => 0, size => undef },"status",{ data_type => "integer", is_nullable => 0, size => undef },"errormsg",{ data_type => "text", is_nullable => 0, size => undef },"starttime",{ data_type => "integer", is_nullable => 0, size => undef },"stoptime",{ data_type => "integer", is_nullable => 0, size => undef },);__PACKAGE__->set_primary_key("id", "stepnr");__PACKAGE__->belongs_to("id", "HydraFrontend::Schema::Builds", { id => "id" });# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 18:02:00# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:GmvM5Rhj4MY7eNQpqTz7bw# You can replace this text with custom content, and it will be preserved on regeneration1;
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 13:41:38# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:bvEulSFMDlAMs39sIyHgZQ
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 18:02:00# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:mng7GAPMDxsznKupYdhwQw
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 13:41:38# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:54xK3D1D0Jm5oKgRelXN7Q
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 18:02:00# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:vEXBbzKUTBQmGmL8uh9mIA
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 13:41:38# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:JHirlq7Jc8dQOy+Op/VflA
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 18:02:00# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:hMYI8zT3UB/k9IbddK1X4g
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 13:41:38# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:7Ag5ZfYVgfw3MJZkNUmBYw
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 18:02:00# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:1DTnCjRw929OuAfeJ5gsXA
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 13:41:38# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:1AgCf4sf5h2RU24Slo0sTA
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-11 18:02:00# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:gS2Lp7T6IZ160iYQbEhd+g
<h2>Build steps</h2><table class="tablesorter"><thead><tr><th>Nr</th><th>What</th><th>Status</th></tr></thead><tbody>[% FOREACH step IN build.buildsteps -%]<tr><td>[% step.stepnr %]</td><td>Build of <tt>[% step.outpath %]</tt></td><td>[% IF step.busy == 1 %]<strong>Building</strong>[% ELSIF step.status == 0 %]Succeeded[% ELSE %]<strong class="error-msg">Failed: [% step.errormsg %]</strong>[% END %](<a href="[% c.uri_for('/nixlog' build.id step.stepnr) %]">log</a>)</td></tr>[% END %]</tbody></table>[% END %]
my $res = system("nix-store --realise $drvPath");
# Run Nix to perform the build, and monitor the stderr output# to get notifications about specific build steps, the# associated log files, etc.my $cmd = "nix-store --keep-going --no-build-output " ."--log-type flat --print-build-trace --realise $drvPath 2>&1";my $buildStepNr = 1;open OUT, "$cmd |" or die;while (<OUT>) {unless (/^@\s+/) {print STDERR "$_";next;}print STDERR "GOT $_";if (/^@\s+build-started\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$/) {$db->txn_do(sub {$db->resultset('Buildsteps')->create({ id => $build->id, stepnr => $buildStepNr++, type => 0 # = build, drvpath => $1, outpath => $2, logfile => $4, busy => 1});});}if (/^@\s+build-succeeded\s+(\S+)\s+(\S+)$/) {$db->txn_do(sub {my $drvPath = $1;(my $step) = $db->resultset('Buildsteps')->search({id => $build->id, type => 0, drvpath => $drvPath}, {});die unless $step;$step->busy(0);$step->status(0);$step->update;});}if (/^@\s+build-failed\s+(\S+)\s+(\S+)\s+(\S+)\s+(.*)$/) {$db->txn_do(sub {my $drvPath = $1;(my $step) = $db->resultset('Buildsteps')->search({id => $build->id, type => 0, drvpath => $drvPath}, {});die unless $step;$step->busy(0);$step->status(1);$step->errormsg($4);$step->update;});}}close OUT;my $res = $?;
type integer not null, -- 0 = build, 1 = substitutiondrvPath text,outPath text,logfile text,busy integer not null,status integer,errorMsg text,startTime integer, -- in Unix time, 0 = used cached build resultstopTime integer,primary key (id, stepnr),foreign key (id) references Builds(id) on delete cascade -- ignored by sqlite);