forked from lix-project/hydra
Remove obsolete Builds columns and provide accurate "Running builds"
This removes the "busy", "locker" and "logfile" columns, which are no longer used by the queue runner. The "Running builds" page now only shows builds that have an active build step.
This commit is contained in:
parent
9fb91460e3
commit
4d1816b152
|
@ -110,11 +110,10 @@ bool State::doBuildStep(std::shared_ptr<StoreAPI> store, Step::ptr step,
|
||||||
else {
|
else {
|
||||||
|
|
||||||
/* Create a build step record indicating that we started
|
/* Create a build step record indicating that we started
|
||||||
building. Also, mark the selected build as busy. */
|
building. */
|
||||||
{
|
{
|
||||||
pqxx::work txn(*conn);
|
pqxx::work txn(*conn);
|
||||||
stepNr = createBuildStep(txn, result.startTime, build, step, machine->sshName, bssBusy);
|
stepNr = createBuildStep(txn, result.startTime, build, step, machine->sshName, bssBusy);
|
||||||
txn.parameterized("update Builds set busy = 1 where id = $1")(build->id).exec();
|
|
||||||
txn.commit();
|
txn.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,7 +340,7 @@ bool State::doBuildStep(std::shared_ptr<StoreAPI> store, Step::ptr step,
|
||||||
if (build2->finishedInDB) continue;
|
if (build2->finishedInDB) continue;
|
||||||
printMsg(lvlError, format("marking build %1% as failed") % build2->id);
|
printMsg(lvlError, format("marking build %1% as failed") % build2->id);
|
||||||
txn.parameterized
|
txn.parameterized
|
||||||
("update Builds set finished = 1, busy = 0, buildStatus = $2, startTime = $3, stopTime = $4, isCachedBuild = $5 where id = $1 and finished = 0")
|
("update Builds set finished = 1, buildStatus = $2, startTime = $3, stopTime = $4, isCachedBuild = $5 where id = $1 and finished = 0")
|
||||||
(build2->id)
|
(build2->id)
|
||||||
((int) (build2->drvPath != step->drvPath && buildStatus == bsFailed ? bsDepFailed : buildStatus))
|
((int) (build2->drvPath != step->drvPath && buildStatus == bsFailed ? bsDepFailed : buildStatus))
|
||||||
(result.startTime)
|
(result.startTime)
|
||||||
|
|
|
@ -159,7 +159,6 @@ void State::clearBusy(Connection & conn, time_t stopTime)
|
||||||
("update BuildSteps set busy = 0, status = $1, stopTime = $2 where busy = 1")
|
("update BuildSteps set busy = 0, status = $1, stopTime = $2 where busy = 1")
|
||||||
((int) bssAborted)
|
((int) bssAborted)
|
||||||
(stopTime, stopTime != 0).exec();
|
(stopTime, stopTime != 0).exec();
|
||||||
txn.exec("update Builds set busy = 0 where finished = 0 and busy = 1");
|
|
||||||
txn.commit();
|
txn.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,7 +308,7 @@ void State::markSucceededBuild(pqxx::work & txn, Build::ptr build,
|
||||||
if (txn.parameterized("select 1 from Builds where id = $1 and finished = 0")(build->id).exec().empty()) return;
|
if (txn.parameterized("select 1 from Builds where id = $1 and finished = 0")(build->id).exec().empty()) return;
|
||||||
|
|
||||||
txn.parameterized
|
txn.parameterized
|
||||||
("update Builds set finished = 1, busy = 0, buildStatus = $2, startTime = $3, stopTime = $4, size = $5, closureSize = $6, releaseName = $7, isCachedBuild = $8 where id = $1")
|
("update Builds set finished = 1, buildStatus = $2, startTime = $3, stopTime = $4, size = $5, closureSize = $6, releaseName = $7, isCachedBuild = $8 where id = $1")
|
||||||
(build->id)
|
(build->id)
|
||||||
((int) (res.failed ? bsFailedWithOutput : bsSuccess))
|
((int) (res.failed ? bsFailedWithOutput : bsSuccess))
|
||||||
(startTime)
|
(startTime)
|
||||||
|
|
|
@ -125,7 +125,7 @@ bool State::getQueuedBuilds(Connection & conn, std::shared_ptr<StoreAPI> store,
|
||||||
if (!build->finishedInDB) {
|
if (!build->finishedInDB) {
|
||||||
pqxx::work txn(conn);
|
pqxx::work txn(conn);
|
||||||
txn.parameterized
|
txn.parameterized
|
||||||
("update Builds set finished = 1, busy = 0, buildStatus = $2, startTime = $3, stopTime = $3, errorMsg = $4 where id = $1 and finished = 0")
|
("update Builds set finished = 1, buildStatus = $2, startTime = $3, stopTime = $3, errorMsg = $4 where id = $1 and finished = 0")
|
||||||
(build->id)
|
(build->id)
|
||||||
((int) bsAborted)
|
((int) bsAborted)
|
||||||
(time(0))
|
(time(0))
|
||||||
|
@ -201,7 +201,7 @@ bool State::getQueuedBuilds(Connection & conn, std::shared_ptr<StoreAPI> store,
|
||||||
|
|
||||||
createBuildStep(txn, 0, build, r, "", bssCachedFailure, "", propagatedFrom);
|
createBuildStep(txn, 0, build, r, "", bssCachedFailure, "", propagatedFrom);
|
||||||
txn.parameterized
|
txn.parameterized
|
||||||
("update Builds set finished = 1, busy = 0, buildStatus = $2, startTime = $3, stopTime = $3, isCachedBuild = 1 where id = $1 and finished = 0")
|
("update Builds set finished = 1, buildStatus = $2, startTime = $3, stopTime = $3, isCachedBuild = 1 where id = $1 and finished = 0")
|
||||||
(build->id)
|
(build->id)
|
||||||
((int) (step == r ? bsFailed : bsDepFailed))
|
((int) (step == r ? bsFailed : bsDepFailed))
|
||||||
(time(0)).exec();
|
(time(0)).exec();
|
||||||
|
|
|
@ -38,7 +38,6 @@ sub buildToHash {
|
||||||
if($build->finished) {
|
if($build->finished) {
|
||||||
$result->{'buildstatus'} = $build->get_column("buildstatus");
|
$result->{'buildstatus'} = $build->get_column("buildstatus");
|
||||||
} else {
|
} else {
|
||||||
$result->{'busy'} = $build->get_column("busy");
|
|
||||||
$result->{'priority'} = $build->get_column("priority");
|
$result->{'priority'} = $build->get_column("priority");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +113,7 @@ sub queue : Chained('api') PathPart('queue') Args(0) {
|
||||||
my $nr = $c->request->params->{nr};
|
my $nr = $c->request->params->{nr};
|
||||||
error($c, "Parameter not defined!") if !defined $nr;
|
error($c, "Parameter not defined!") if !defined $nr;
|
||||||
|
|
||||||
my @builds = $c->model('DB::Builds')->search({finished => 0}, {rows => $nr, order_by => ["busy DESC", "priority DESC", "id"]});
|
my @builds = $c->model('DB::Builds')->search({finished => 0}, {rows => $nr, order_by => ["priority DESC", "id"]});
|
||||||
|
|
||||||
my @list;
|
my @list;
|
||||||
push @list, buildToHash($_) foreach @builds;
|
push @list, buildToHash($_) foreach @builds;
|
||||||
|
@ -136,16 +135,6 @@ sub nrqueue : Chained('api') PathPart('nrqueue') Args(0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sub nrrunning : Chained('api') PathPart('nrrunning') Args(0) {
|
|
||||||
my ($self, $c) = @_;
|
|
||||||
my $nrRunningBuilds = $c->model('DB::Builds')->search({finished => 0, busy => 1 })->count();
|
|
||||||
$c->stash->{'plain'} = {
|
|
||||||
data => "$nrRunningBuilds"
|
|
||||||
};
|
|
||||||
$c->forward('Hydra::View::Plain');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sub nrbuilds : Chained('api') PathPart('nrbuilds') Args(0) {
|
sub nrbuilds : Chained('api') PathPart('nrbuilds') Args(0) {
|
||||||
my ($self, $c) = @_;
|
my ($self, $c) = @_;
|
||||||
my $nr = $c->request->params->{nr};
|
my $nr = $c->request->params->{nr};
|
||||||
|
@ -212,44 +201,6 @@ sub scmdiff : Chained('api') PathPart('scmdiff') Args(0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sub readNormalizedLog {
|
|
||||||
my ($file) = @_;
|
|
||||||
my $pipe = (-f "$file.bz2" ? "cat $file.bz2 | bzip2 -d" : "cat $file");
|
|
||||||
my $res = `$pipe`;
|
|
||||||
|
|
||||||
$res =~ s/\/nix\/store\/[a-z0-9]*-/\/nix\/store\/...-/g;
|
|
||||||
$res =~ s/nix-build-[a-z0-9]*-/nix-build-...-/g;
|
|
||||||
$res =~ s/[0-9]{2}:[0-9]{2}:[0-9]{2}/00:00:00/g;
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sub logdiff : Chained('api') PathPart('logdiff') Args(2) {
|
|
||||||
my ($self, $c, $buildid1, $buildid2) = @_;
|
|
||||||
|
|
||||||
my $diff = "";
|
|
||||||
|
|
||||||
my $build1 = getBuild($c, $buildid1);
|
|
||||||
notFound($c, "Build with ID $buildid1 doesn't exist.")
|
|
||||||
if !defined $build1;
|
|
||||||
my $build2 = getBuild($c, $buildid2);
|
|
||||||
notFound($c, "Build with ID $buildid2 doesn't exist.")
|
|
||||||
if !defined $build2;
|
|
||||||
|
|
||||||
if (-f $build1->logfile && -f $build2->logfile) {
|
|
||||||
my $logtext1 = readNormalizedLog($build1->logfile);
|
|
||||||
my $logtext2 = readNormalizedLog($build2->logfile);
|
|
||||||
$diff = diff \$logtext1, \$logtext2;
|
|
||||||
} else {
|
|
||||||
$c->response->status(404);
|
|
||||||
}
|
|
||||||
|
|
||||||
$c->response->content_type('text/x-diff');
|
|
||||||
$c->stash->{'plain'} = { data => (scalar $diff) || " " };
|
|
||||||
$c->forward('Hydra::View::Plain');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sub triggerJobset {
|
sub triggerJobset {
|
||||||
my ($self, $c, $jobset) = @_;
|
my ($self, $c, $jobset) = @_;
|
||||||
print STDERR "triggering jobset ", $jobset->project->name . ":" . $jobset->name, "\n";
|
print STDERR "triggering jobset ", $jobset->project->name . ":" . $jobset->name, "\n";
|
||||||
|
|
|
@ -167,7 +167,7 @@ sub showLog {
|
||||||
my $url = $c->request->uri->as_string;
|
my $url = $c->request->uri->as_string;
|
||||||
$url =~ s/tail-reload/tail/g;
|
$url =~ s/tail-reload/tail/g;
|
||||||
$c->stash->{url} = $url;
|
$c->stash->{url} = $url;
|
||||||
$c->stash->{reload} = !$c->stash->{build}->finished && $c->stash->{build}->busy;
|
$c->stash->{reload} = !$c->stash->{build}->finished;
|
||||||
$c->stash->{title} = "";
|
$c->stash->{title} = "";
|
||||||
$c->stash->{contents} = (scalar logContents($logPath, 50)) || " ";
|
$c->stash->{contents} = (scalar logContents($logPath, 50)) || " ";
|
||||||
$c->stash->{template} = 'plain-reload.tt';
|
$c->stash->{template} = 'plain-reload.tt';
|
||||||
|
|
|
@ -44,7 +44,9 @@ sub begin :Private {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scalar(@args) == 0 || $args[0] ne "static") {
|
if (scalar(@args) == 0 || $args[0] ne "static") {
|
||||||
$c->stash->{nrRunningBuilds} = $c->model('DB::Builds')->search({ finished => 0, busy => 1 }, {})->count();
|
$c->stash->{nrRunningBuilds} = $c->model('DB::Builds')->search(
|
||||||
|
{ finished => 0, 'buildsteps.busy' => 1 },
|
||||||
|
{ join => 'buildsteps', select => ["id"], distinct => 1 })->count();
|
||||||
$c->stash->{nrQueuedBuilds} = $c->model('DB::Builds')->search({ finished => 0 })->count();
|
$c->stash->{nrQueuedBuilds} = $c->model('DB::Builds')->search({ finished => 0 })->count();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +91,11 @@ sub queue_GET {
|
||||||
$c->stash->{flashMsg} //= $c->flash->{buildMsg};
|
$c->stash->{flashMsg} //= $c->flash->{buildMsg};
|
||||||
$self->status_ok(
|
$self->status_ok(
|
||||||
$c,
|
$c,
|
||||||
entity => [$c->model('DB::Builds')->search({finished => 0}, { order_by => ["globalpriority desc", "id"]})]
|
entity => [$c->model('DB::Builds')->search(
|
||||||
|
{ finished => 0 },
|
||||||
|
{ order_by => ["globalpriority desc", "id"],
|
||||||
|
, columns => [@buildListColumns]
|
||||||
|
})]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,7 +106,12 @@ sub status_GET {
|
||||||
my ($self, $c) = @_;
|
my ($self, $c) = @_;
|
||||||
$self->status_ok(
|
$self->status_ok(
|
||||||
$c,
|
$c,
|
||||||
entity => [$c->model('DB::Builds')->search({finished => 0, busy => 1}, { order_by => ["priority DESC", "id"]})]
|
entity => [$c->model('DB::Builds')->search(
|
||||||
|
{ finished => 0, "buildsteps.busy" => 1 },
|
||||||
|
{ order_by => ["globalpriority DESC", "id"],
|
||||||
|
join => "buildsteps",
|
||||||
|
columns => [@buildListColumns]
|
||||||
|
})]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,7 +137,7 @@ sub machines :Local Args(0) {
|
||||||
|
|
||||||
$c->stash->{machines} = $machines;
|
$c->stash->{machines} = $machines;
|
||||||
$c->stash->{steps} = [ $c->model('DB::BuildSteps')->search(
|
$c->stash->{steps} = [ $c->model('DB::BuildSteps')->search(
|
||||||
{ finished => 0, 'me.busy' => 1, 'build.busy' => 1, },
|
{ finished => 0, 'me.busy' => 1, },
|
||||||
{ join => [ 'build' ]
|
{ join => [ 'build' ]
|
||||||
, order_by => [ 'machine', 'stepnr' ]
|
, order_by => [ 'machine', 'stepnr' ]
|
||||||
} ) ];
|
} ) ];
|
||||||
|
|
|
@ -450,8 +450,6 @@ sub checkBuild {
|
||||||
, nixexprpath => $jobset->nixexprpath
|
, nixexprpath => $jobset->nixexprpath
|
||||||
, priority => $buildInfo->{schedulingPriority}
|
, priority => $buildInfo->{schedulingPriority}
|
||||||
, finished => 0
|
, finished => 0
|
||||||
, busy => 0
|
|
||||||
, locker => ""
|
|
||||||
, iscurrent => 1
|
, iscurrent => 1
|
||||||
, ischannel => $buildInfo->{isChannel}
|
, ischannel => $buildInfo->{isChannel}
|
||||||
});
|
});
|
||||||
|
|
|
@ -29,7 +29,7 @@ our @EXPORT = qw(
|
||||||
|
|
||||||
|
|
||||||
# Columns from the Builds table needed to render build lists.
|
# Columns from the Builds table needed to render build lists.
|
||||||
Readonly our @buildListColumns => ('id', 'finished', 'timestamp', 'stoptime', 'project', 'jobset', 'job', 'nixname', 'system', 'priority', 'busy', 'buildstatus', 'releasename');
|
Readonly our @buildListColumns => ('id', 'finished', 'timestamp', 'stoptime', 'project', 'jobset', 'job', 'nixname', 'system', 'buildstatus', 'releasename');
|
||||||
|
|
||||||
|
|
||||||
sub getBuild {
|
sub getBuild {
|
||||||
|
|
|
@ -455,8 +455,6 @@ sub restartBuilds($$) {
|
||||||
txn_do($db, sub {
|
txn_do($db, sub {
|
||||||
$nrRestarted = $builds->update(
|
$nrRestarted = $builds->update(
|
||||||
{ finished => 0
|
{ finished => 0
|
||||||
, busy => 0
|
|
||||||
, locker => ""
|
|
||||||
, iscachedbuild => 0
|
, iscachedbuild => 0
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -120,7 +120,7 @@ __PACKAGE__->table("Builds");
|
||||||
|
|
||||||
data_type: 'integer'
|
data_type: 'integer'
|
||||||
default_value: 0
|
default_value: 0
|
||||||
is_nullable: 1
|
is_nullable: 0
|
||||||
|
|
||||||
=head2 iscurrent
|
=head2 iscurrent
|
||||||
|
|
||||||
|
@ -150,22 +150,6 @@ __PACKAGE__->table("Builds");
|
||||||
default_value: 0
|
default_value: 0
|
||||||
is_nullable: 0
|
is_nullable: 0
|
||||||
|
|
||||||
=head2 busy
|
|
||||||
|
|
||||||
data_type: 'integer'
|
|
||||||
default_value: 0
|
|
||||||
is_nullable: 0
|
|
||||||
|
|
||||||
=head2 locker
|
|
||||||
|
|
||||||
data_type: 'text'
|
|
||||||
is_nullable: 1
|
|
||||||
|
|
||||||
=head2 logfile
|
|
||||||
|
|
||||||
data_type: 'text'
|
|
||||||
is_nullable: 1
|
|
||||||
|
|
||||||
=head2 starttime
|
=head2 starttime
|
||||||
|
|
||||||
data_type: 'integer'
|
data_type: 'integer'
|
||||||
|
@ -246,7 +230,7 @@ __PACKAGE__->add_columns(
|
||||||
"timeout",
|
"timeout",
|
||||||
{ data_type => "integer", default_value => 36000, is_nullable => 1 },
|
{ data_type => "integer", default_value => 36000, is_nullable => 1 },
|
||||||
"ischannel",
|
"ischannel",
|
||||||
{ data_type => "integer", default_value => 0, is_nullable => 1 },
|
{ data_type => "integer", default_value => 0, is_nullable => 0 },
|
||||||
"iscurrent",
|
"iscurrent",
|
||||||
{ data_type => "integer", default_value => 0, is_nullable => 1 },
|
{ data_type => "integer", default_value => 0, is_nullable => 1 },
|
||||||
"nixexprinput",
|
"nixexprinput",
|
||||||
|
@ -257,12 +241,6 @@ __PACKAGE__->add_columns(
|
||||||
{ data_type => "integer", default_value => 0, is_nullable => 0 },
|
{ data_type => "integer", default_value => 0, is_nullable => 0 },
|
||||||
"globalpriority",
|
"globalpriority",
|
||||||
{ data_type => "integer", default_value => 0, is_nullable => 0 },
|
{ data_type => "integer", default_value => 0, is_nullable => 0 },
|
||||||
"busy",
|
|
||||||
{ data_type => "integer", default_value => 0, is_nullable => 0 },
|
|
||||||
"locker",
|
|
||||||
{ data_type => "text", is_nullable => 1 },
|
|
||||||
"logfile",
|
|
||||||
{ data_type => "text", is_nullable => 1 },
|
|
||||||
"starttime",
|
"starttime",
|
||||||
{ data_type => "integer", is_nullable => 1 },
|
{ data_type => "integer", is_nullable => 1 },
|
||||||
"stoptime",
|
"stoptime",
|
||||||
|
@ -566,8 +544,8 @@ __PACKAGE__->many_to_many(
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
# Created by DBIx::Class::Schema::Loader v0.07043 @ 2015-09-10 17:34:23
|
# Created by DBIx::Class::Schema::Loader v0.07043 @ 2015-10-27 13:54:16
|
||||||
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:JRelp13Cyfi+QVxC92xuqQ
|
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:iN9vwO5i3dURKOTgaPTHxw
|
||||||
|
|
||||||
__PACKAGE__->has_many(
|
__PACKAGE__->has_many(
|
||||||
"dependents",
|
"dependents",
|
||||||
|
@ -647,7 +625,6 @@ my %hint = (
|
||||||
'nixname',
|
'nixname',
|
||||||
'system',
|
'system',
|
||||||
'priority',
|
'priority',
|
||||||
'busy',
|
|
||||||
'buildstatus',
|
'buildstatus',
|
||||||
'releasename'
|
'releasename'
|
||||||
],
|
],
|
||||||
|
|
|
@ -4,7 +4,12 @@
|
||||||
[% USE HTML %]
|
[% USE HTML %]
|
||||||
[% USE Date %]
|
[% USE Date %]
|
||||||
|
|
||||||
[% isAggregate = constituents.size > 0 %]
|
[%
|
||||||
|
isAggregate = constituents.size > 0;
|
||||||
|
steps = build.buildsteps;
|
||||||
|
busy = 0;
|
||||||
|
FOR step IN steps; IF step.busy; busy = 1; END; END;
|
||||||
|
%]
|
||||||
|
|
||||||
[% BLOCK renderOutputs %]
|
[% BLOCK renderOutputs %]
|
||||||
[% start=1; FOREACH output IN outputs %]
|
[% start=1; FOREACH output IN outputs %]
|
||||||
|
@ -18,7 +23,7 @@
|
||||||
<tr><th>Nr</th><th>What</th><th>Duration</th><th>Machine</th><th>Status</th></tr>
|
<tr><th>Nr</th><th>What</th><th>Duration</th><th>Machine</th><th>Status</th></tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
[% FOREACH step IN build.buildsteps.reverse %]
|
[% FOREACH step IN steps.reverse %]
|
||||||
[% IF ( type == "All" ) || ( type == "Failed" && step.status != 0 ) || ( type == "Running" && step.busy == 1 ) %]
|
[% IF ( type == "All" ) || ( type == "Failed" && step.status != 0 ) || ( type == "Running" && step.busy == 1 ) %]
|
||||||
[% has_log = seen.${step.drvpath} ? 0 : buildStepLogExists(step);
|
[% has_log = seen.${step.drvpath} ? 0 : buildStepLogExists(step);
|
||||||
seen.${step.drvpath} = 1;
|
seen.${step.drvpath} = 1;
|
||||||
|
@ -114,7 +119,7 @@
|
||||||
[% IF isAggregate %]<li><a href="#tabs-constituents" data-toggle="tab">Constituents</a></li>[% END %]
|
[% IF isAggregate %]<li><a href="#tabs-constituents" data-toggle="tab">Constituents</a></li>[% END %]
|
||||||
<li><a href="#tabs-details" data-toggle="tab">Details</a></li>
|
<li><a href="#tabs-details" data-toggle="tab">Details</a></li>
|
||||||
<li><a href="#tabs-buildinputs" data-toggle="tab">Inputs</a></li>
|
<li><a href="#tabs-buildinputs" data-toggle="tab">Inputs</a></li>
|
||||||
[% IF build.buildsteps %]<li><a href="#tabs-buildsteps" data-toggle="tab">Build steps</a></li>[% END %]
|
[% IF steps %]<li><a href="#tabs-buildsteps" data-toggle="tab">Build steps</a></li>[% END %]
|
||||||
[% IF build.dependents %]<li><a href="#tabs-usedby" data-toggle="tab">Used by</a></li>[% END%]
|
[% IF build.dependents %]<li><a href="#tabs-usedby" data-toggle="tab">Used by</a></li>[% END%]
|
||||||
[% IF drvAvailable %]<li><a href="#tabs-build-deps" data-toggle="tab">Build dependencies</a></li>[% END %]
|
[% IF drvAvailable %]<li><a href="#tabs-build-deps" data-toggle="tab">Build dependencies</a></li>[% END %]
|
||||||
[% IF available %]<li><a href="#tabs-runtime-deps" data-toggle="tab">Runtime dependencies</a></li>[% END %]
|
[% IF available %]<li><a href="#tabs-runtime-deps" data-toggle="tab">Runtime dependencies</a></li>[% END %]
|
||||||
|
@ -138,7 +143,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<th>Status:</th>
|
<th>Status:</th>
|
||||||
<td>
|
<td>
|
||||||
[% INCLUDE renderStatus build=build icon=0 %]
|
[% INCLUDE renderStatus build=build icon=0 busy=busy %]
|
||||||
[% IF isAggregate;
|
[% IF isAggregate;
|
||||||
nrConstituents = 0;
|
nrConstituents = 0;
|
||||||
nrFinished = 0;
|
nrFinished = 0;
|
||||||
|
@ -229,14 +234,14 @@
|
||||||
|
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
||||||
[% IF build.busy %]
|
[% IF busy %]
|
||||||
<h3>Running build steps</h3>
|
<h3>Running build steps</h3>
|
||||||
[% INCLUDE renderBuildSteps type="Running" %]
|
[% INCLUDE renderBuildSteps type="Running" %]
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
||||||
[% IF build.finished %]
|
[% IF build.finished %]
|
||||||
|
|
||||||
[% IF build.buildsteps && build.buildstatus != 0 && build.buildstatus != 6 %]
|
[% IF steps && build.buildstatus != 0 && build.buildstatus != 6 %]
|
||||||
<h3>Failed build steps</h3>
|
<h3>Failed build steps</h3>
|
||||||
[% INCLUDE renderBuildSteps type="Failed" %]
|
[% INCLUDE renderBuildSteps type="Failed" %]
|
||||||
[% END %]
|
[% END %]
|
||||||
|
@ -423,7 +428,7 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[% IF build.buildsteps %]
|
[% IF steps %]
|
||||||
<div id="tabs-buildsteps" class="tab-pane">
|
<div id="tabs-buildsteps" class="tab-pane">
|
||||||
[% INCLUDE renderBuildSteps type="All" %]
|
[% INCLUDE renderBuildSteps type="All" %]
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -98,11 +98,11 @@ BLOCK renderBuildListBody;
|
||||||
<tr>
|
<tr>
|
||||||
[% IF !hideResultInfo %]
|
[% IF !hideResultInfo %]
|
||||||
<td>
|
<td>
|
||||||
[% INCLUDE renderBuildStatusIcon size=16 busy=(showSchedulingInfo ? 1 : 0) buildstatus=build.buildstatus %]
|
[% INCLUDE renderBuildStatusIcon size=16 buildstatus=build.buildstatus %]
|
||||||
</td>
|
</td>
|
||||||
[% END %]
|
[% END %]
|
||||||
[% IF showSchedulingInfo %]
|
[% IF showSchedulingInfo %]
|
||||||
<td>[% IF build.busy %]<span class="label label-success">Started</span>[% ELSE %]<span class="label">Queued</span>[% END %]</td>
|
<td>[% IF busy %]<span class="label label-success">Started</span>[% ELSE %]<span class="label">Queued</span>[% END %]</td>
|
||||||
[% END %]
|
[% END %]
|
||||||
<td><a class="row-link" href="[% link %]">[% build.id %]</a></td>
|
<td><a class="row-link" href="[% link %]">[% build.id %]</a></td>
|
||||||
[% IF !hideJobName %]
|
[% IF !hideJobName %]
|
||||||
|
@ -189,7 +189,6 @@ BLOCK renderBuildLink; INCLUDE renderBuildIdLink id=build.id; END;
|
||||||
|
|
||||||
BLOCK renderBuildStatusIcon;
|
BLOCK renderBuildStatusIcon;
|
||||||
finished = build != undef ? build.finished : 1;
|
finished = build != undef ? build.finished : 1;
|
||||||
busy = busy != undef ? busy : build.busy;
|
|
||||||
buildstatus = buildstatus != undef ? buildstatus : build.buildstatus;
|
buildstatus = buildstatus != undef ? buildstatus : build.buildstatus;
|
||||||
IF finished;
|
IF finished;
|
||||||
IF buildstatus == 0 %]
|
IF buildstatus == 0 %]
|
||||||
|
@ -211,10 +210,8 @@ BLOCK renderBuildStatusIcon;
|
||||||
[% ELSE %]
|
[% ELSE %]
|
||||||
<img src="[% c.uri_for("/static/images/error_${size}.png") %]" alt="Failed" class="build-status" />
|
<img src="[% c.uri_for("/static/images/error_${size}.png") %]" alt="Failed" class="build-status" />
|
||||||
[% END;
|
[% END;
|
||||||
ELSIF busy %]
|
ELSE %]
|
||||||
<img src="[% c.uri_for("/static/images/help_${size}.png") %]" alt="Busy" class="build-status" />
|
<img src="[% c.uri_for("/static/images/help_${size}.png") %]" alt="Queued" class="build-status" />
|
||||||
[% ELSE %]
|
|
||||||
<img src="[% c.uri_for("/static/images/help_${size}.png") %]" alt="Scheduled" class="build-status" />
|
|
||||||
[% END;
|
[% END;
|
||||||
END;
|
END;
|
||||||
|
|
||||||
|
@ -243,9 +240,8 @@ BLOCK renderStatus;
|
||||||
<span class="error">Aborted</span>
|
<span class="error">Aborted</span>
|
||||||
(Hydra failure; see <a href="#nix-error">below</a>)
|
(Hydra failure; see <a href="#nix-error">below</a>)
|
||||||
[% END;
|
[% END;
|
||||||
ELSIF build.busy %]
|
ELSIF busy %]
|
||||||
<strong>Build in progress</strong>
|
<strong>Build in progress</strong>[%-
|
||||||
since [% INCLUDE renderDateTime timestamp = build.starttime;
|
|
||||||
ELSE %]
|
ELSE %]
|
||||||
<strong>Scheduled to be built</strong>
|
<strong>Scheduled to be built</strong>
|
||||||
[% END;
|
[% END;
|
||||||
|
|
|
@ -91,7 +91,7 @@ c.uri_for(c.controller('JobsetEval').action_for('view'),
|
||||||
[% INCLUDE renderBuildListHeader unsortable=1 %]
|
[% INCLUDE renderBuildListHeader unsortable=1 %]
|
||||||
[% size = builds.size; max = full ? size : 250; %]
|
[% size = builds.size; max = full ? size : 250; %]
|
||||||
[% INCLUDE renderBuildListBody builds=builds.slice(0, (size > max ? max : size) - 1)
|
[% INCLUDE renderBuildListBody builds=builds.slice(0, (size > max ? max : size) - 1)
|
||||||
hideProjectName=1 hideJobsetName=1 %]
|
hideProjectName=1 hideJobsetName=1 busy=0 %]
|
||||||
[% IF size > max; params = c.req.params; params.full = 1 %]
|
[% IF size > max; params = c.req.params; params.full = 1 %]
|
||||||
<tr><td class="centered" colspan="6"><a href="[% c.uri_for(c.controller('JobsetEval').action_for('view'), [eval.id], params) %]"><em>([% size - max %] more builds omitted)</em></a></td></tr>
|
<tr><td class="centered" colspan="6"><a href="[% c.uri_for(c.controller('JobsetEval').action_for('view'), [eval.id], params) %]"><em>([% size - max %] more builds omitted)</em></a></td></tr>
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
[% ELSE %]
|
[% ELSE %]
|
||||||
|
|
||||||
[% INCLUDE renderBuildList builds=resource showSchedulingInfo=1 hideResultInfo=1 %]
|
[% INCLUDE renderBuildList builds=resource showSchedulingInfo=1 hideResultInfo=1 busy=1 %]
|
||||||
|
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
||||||
|
|
|
@ -173,12 +173,6 @@ create table Builds (
|
||||||
-- the front of the queue via the web interface.
|
-- the front of the queue via the web interface.
|
||||||
globalPriority integer not null default 0,
|
globalPriority integer not null default 0,
|
||||||
|
|
||||||
-- FIXME: remove (obsolete with the new queue runner)
|
|
||||||
busy integer not null default 0, -- true means someone is building this job now
|
|
||||||
locker text, -- !!! hostname/pid of the process building this job?
|
|
||||||
|
|
||||||
logfile text, -- if busy, the path of the logfile
|
|
||||||
|
|
||||||
-- FIXME: remove startTime?
|
-- FIXME: remove startTime?
|
||||||
startTime integer, -- if busy/finished, time we started
|
startTime integer, -- if busy/finished, time we started
|
||||||
stopTime integer, -- if finished, time we finished
|
stopTime integer, -- if finished, time we finished
|
||||||
|
@ -641,7 +635,6 @@ create index IndexBuildStepsOnPropagatedFrom on BuildSteps(propagatedFrom) where
|
||||||
create index IndexBuildStepsOnStopTime on BuildSteps(stopTime desc) where startTime is not null and stopTime is not null;
|
create index IndexBuildStepsOnStopTime on BuildSteps(stopTime desc) where startTime is not null and stopTime is not null;
|
||||||
create index IndexBuildStepOutputsOnPath on BuildStepOutputs(path);
|
create index IndexBuildStepOutputsOnPath on BuildStepOutputs(path);
|
||||||
create index IndexBuildsOnFinished on Builds(finished) where finished = 0;
|
create index IndexBuildsOnFinished on Builds(finished) where finished = 0;
|
||||||
create index IndexBuildsOnFinishedBusy on Builds(finished, busy) where finished = 0;
|
|
||||||
create index IndexBuildsOnIsCurrent on Builds(isCurrent) where isCurrent = 1;
|
create index IndexBuildsOnIsCurrent on Builds(isCurrent) where isCurrent = 1;
|
||||||
create index IndexBuildsOnJobsetIsCurrent on Builds(project, jobset, isCurrent) where isCurrent = 1;
|
create index IndexBuildsOnJobsetIsCurrent on Builds(project, jobset, isCurrent) where isCurrent = 1;
|
||||||
create index IndexBuildsOnJobIsCurrent on Builds(project, jobset, job, isCurrent) where isCurrent = 1;
|
create index IndexBuildsOnJobIsCurrent on Builds(project, jobset, job, isCurrent) where isCurrent = 1;
|
||||||
|
|
3
src/sql/upgrade-43.sql
Normal file
3
src/sql/upgrade-43.sql
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
alter table Builds drop column busy, drop column locker, drop column logfile;
|
||||||
|
|
||||||
|
drop index IndexBuildsOnFinishedBusy;
|
Loading…
Reference in a new issue