forked from lix-project/hydra
* In the job status and error pages, show when the status of a job
last changed.
This commit is contained in:
parent
bbf718e64d
commit
1aec78014d
7 changed files with 53 additions and 12 deletions
|
@ -129,3 +129,13 @@
|
||||||
|
|
||||||
$ nix-env -p /nix/var/nix/profiles/per-user/eelco/hydra-deps -f deps.nix -i \* --arg pkgs 'import /home/eelco/Dev/nixpkgs {}'
|
$ nix-env -p /nix/var/nix/profiles/per-user/eelco/hydra-deps -f deps.nix -i \* --arg pkgs 'import /home/eelco/Dev/nixpkgs {}'
|
||||||
|
|
||||||
|
|
||||||
|
* select x.project, x.jobset, x.job, x.system, x.id, x.timestamp, r.buildstatus, b.id, b.timestamp
|
||||||
|
from (select project, jobset, job, system, max(id) as id from Builds where finished = 1 group by project, jobset, job, system) as a_
|
||||||
|
natural join Builds x
|
||||||
|
natural join BuildResultInfo r
|
||||||
|
left join Builds b on b.id =
|
||||||
|
(select max(id) from builds c
|
||||||
|
natural join buildresultinfo r2
|
||||||
|
where x.project = c.project and x.jobset = c.jobset and x.job = c.job and x.system = c.system
|
||||||
|
and x.id > c.id and r.buildstatus != r2.buildstatus);
|
||||||
|
|
|
@ -14,7 +14,7 @@ sub filterInactiveJobs {
|
||||||
{ join => 'job'
|
{ join => 'job'
|
||||||
, '+select' => ["job.active"]
|
, '+select' => ["job.active"]
|
||||||
, '+as' => ["active"]
|
, '+as' => ["active"]
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -26,6 +26,13 @@ sub getJobStatus {
|
||||||
$latest = filterInactiveJobs($latest)
|
$latest = filterInactiveJobs($latest)
|
||||||
unless defined $c->stash->{showInactiveJobs};
|
unless defined $c->stash->{showInactiveJobs};
|
||||||
|
|
||||||
|
$latest = $latest->search(
|
||||||
|
{},
|
||||||
|
{ '+select' => ["me.statusChangeId", "me.statusChangeTime"]
|
||||||
|
, '+as' => ["statusChangeId", "statusChangeTime"]
|
||||||
|
, order_by => "statusChangeTime DESC"
|
||||||
|
});
|
||||||
|
|
||||||
return $latest;
|
return $latest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,7 +56,7 @@ sub errors : Chained('get_builds') PathPart Args(0) {
|
||||||
[$c->stash->{allJobs}->search({errormsg => {'!=' => ''}})]
|
[$c->stash->{allJobs}->search({errormsg => {'!=' => ''}})]
|
||||||
if defined $c->stash->{allJobs};
|
if defined $c->stash->{allJobs};
|
||||||
$c->stash->{brokenBuilds} =
|
$c->stash->{brokenBuilds} =
|
||||||
[getJobStatus($self, $c)->search({buildstatus => {'!=' => 0}})];
|
[getJobStatus($self, $c)->search({'me.buildstatus' => {'!=' => 0}})];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -193,10 +193,10 @@ __PACKAGE__->belongs_to(
|
||||||
);
|
);
|
||||||
|
|
||||||
sub addSequence {
|
sub addSequence {
|
||||||
my $hydradbi = getHydraDBPath ;
|
my $hydradbi = getHydraDBPath;
|
||||||
if ($hydradbi =~ m/^dbi:Pg/) {
|
if ($hydradbi =~ m/^dbi:Pg/) {
|
||||||
__PACKAGE__->sequence('builds_id_seq');
|
__PACKAGE__->sequence('builds_id_seq');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub makeSource {
|
sub makeSource {
|
||||||
|
@ -210,8 +210,14 @@ sub makeSource {
|
||||||
|
|
||||||
sub makeQueries {
|
sub makeQueries {
|
||||||
my ($name, $constraint) = @_;
|
my ($name, $constraint) = @_;
|
||||||
makeSource('JobStatus' . $name, "select * from (select project, jobset, job, system, max(id) as id from Builds where finished = 1 $constraint group by project, jobset, job, system) as a natural join Builds");
|
my $joinWithStatusChange =
|
||||||
makeSource('LatestSucceeded' . $name, "select * from (select project, jobset, job, system, max(id) as id from Builds natural join BuildResultInfo where finished = 1 and buildStatus = 0 $constraint group by project, jobset, job, system) as a natural join Builds");
|
"natural join BuildResultInfo r " .
|
||||||
|
"left join Builds b on b.id = " .
|
||||||
|
"(select max(id) from builds c natural join buildresultinfo r2 " .
|
||||||
|
" where x.project = c.project and x.jobset = c.jobset and x.job = c.job and x.system = c.system and " .
|
||||||
|
" x.id > c.id and r.buildstatus != r2.buildstatus)";
|
||||||
|
makeSource('JobStatus' . $name, "select *, b.id statusChangeId, b.timestamp statusChangeTime from (select project, jobset, job, system, max(id) as id from Builds where finished = 1 $constraint group by project, jobset, job, system) as latest natural join Builds x $joinWithStatusChange");
|
||||||
|
makeSource('LatestSucceeded' . $name, "select * from (select project, jobset, job, system, max(id) as id from Builds natural join BuildResultInfo where finished = 1 and buildStatus = 0 $constraint group by project, jobset, job, system) as latest natural join Builds x $joinWithStatusChange");
|
||||||
}
|
}
|
||||||
|
|
||||||
addSequence;
|
addSequence;
|
||||||
|
|
|
@ -73,6 +73,9 @@
|
||||||
<th>Release Name</th>
|
<th>Release Name</th>
|
||||||
<th>System</th>
|
<th>System</th>
|
||||||
<th>Timestamp</th>
|
<th>Timestamp</th>
|
||||||
|
[% IF showStatusChange %]
|
||||||
|
<th class="headerSortUp">Last status change</th>
|
||||||
|
[% END %]
|
||||||
<th>Description</th>
|
<th>Description</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@ -105,6 +108,17 @@
|
||||||
<td>[% !showSchedulingInfo and build.get_column('releasename') ? build.get_column('releasename') : build.nixname %]</td>
|
<td>[% !showSchedulingInfo and build.get_column('releasename') ? build.get_column('releasename') : build.nixname %]</td>
|
||||||
<td><tt>[% build.system %]</tt></td>
|
<td><tt>[% build.system %]</tt></td>
|
||||||
<td>[% date.format(build.timestamp, '%Y-%m-%d %H:%M:%S') %]</td>
|
<td>[% date.format(build.timestamp, '%Y-%m-%d %H:%M:%S') %]</td>
|
||||||
|
[% IF showStatusChange %]
|
||||||
|
<td>
|
||||||
|
[% IF build.get_column('statusChangeTime') %]
|
||||||
|
<a href="[% c.uri_for('/build' build.get_column('statusChangeId')) %]">
|
||||||
|
[% date.format(build.get_column('statusChangeTime'), '%Y-%m-%d %H:%M:%S') %]
|
||||||
|
</a>
|
||||||
|
[% ELSE %]
|
||||||
|
<em>never</em>
|
||||||
|
[% END %]
|
||||||
|
</td>
|
||||||
|
[% END %]
|
||||||
<td>[% build.description %]</td>
|
<td>[% build.description %]</td>
|
||||||
</tr>
|
</tr>
|
||||||
[% END -%]
|
[% END -%]
|
||||||
|
|
|
@ -67,7 +67,7 @@ that don’t build.</p>
|
||||||
|
|
||||||
<h2>Broken builds</h2>
|
<h2>Broken builds</h2>
|
||||||
|
|
||||||
[% INCLUDE renderBuildList builds=brokenBuilds %]
|
[% INCLUDE renderBuildList builds=brokenBuilds showStatusChange=1 %]
|
||||||
|
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,11 @@
|
||||||
|
|
||||||
<h1>Job Status[% IF project %] of Project <tt>[% project.name %]</tt>[% END %]</h1>
|
<h1>Job Status[% IF project %] of Project <tt>[% project.name %]</tt>[% END %]</h1>
|
||||||
|
|
||||||
<p>Below are the latest builds for each job.</p>
|
<p>Below are the latest builds for each job. It is ordered by the status
|
||||||
|
change time (the timestamp of the last build that had a different
|
||||||
|
build result status). That is, it shows the jobs that most recently
|
||||||
|
changed from failed to successful or vice versa first.</p>
|
||||||
|
|
||||||
[% INCLUDE renderBuildList builds=latestBuilds %]
|
[% INCLUDE renderBuildList builds=latestBuilds showStatusChange=1 %]
|
||||||
|
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
|
@ -407,4 +407,5 @@ create table ReleaseSetJobs (
|
||||||
create index IndexBuildInputsByBuild on BuildInputs(build);
|
create index IndexBuildInputsByBuild on BuildInputs(build);
|
||||||
create index IndexBuildInputsByDependency on BuildInputs(dependency);
|
create index IndexBuildInputsByDependency on BuildInputs(dependency);
|
||||||
create index IndexBuildsByTimestamp on Builds(timestamp);
|
create index IndexBuildsByTimestamp on Builds(timestamp);
|
||||||
--create index IndexBuildsByJobAndSystem on Builds(project, jobset, job, system);
|
create index IndexBuildsByJobAndSystem on Builds(project, jobset, job, system);
|
||||||
|
create index IndexBuildResultInfo on BuildResultInfo(id); -- primary key index, not created automatically by PostgreSQL
|
||||||
|
|
Loading…
Reference in a new issue