forked from lix-project/hydra
add log diff to compare logs to previous builds
This commit is contained in:
parent
0bf03727f0
commit
998665aa0f
2
deps.nix
2
deps.nix
|
@ -20,6 +20,8 @@ with pkgs;
|
|||
perlPackages.DBDSQLite
|
||||
perlPackages.EmailSender
|
||||
perlPackages.TextTable
|
||||
perlPackages.TextDiff
|
||||
perlPackages.FileSlurp
|
||||
perlPackages.NetTwitterLite
|
||||
perlPackages.PadWalker
|
||||
perlPackages.DataDump
|
||||
|
|
|
@ -10,6 +10,8 @@ use Hydra::Controller::Project;
|
|||
use JSON::Any;
|
||||
use DateTime;
|
||||
use Digest::SHA qw(sha256_hex);
|
||||
use Text::Diff;
|
||||
use File::Slurp;
|
||||
|
||||
# !!! Rewrite this to use View::JSON.
|
||||
|
||||
|
@ -213,7 +215,7 @@ sub scmdiff : Chained('api') PathPart('scmdiff') Args(0) {
|
|||
if($type eq "hg") {
|
||||
my $clonePath = scmPath . "/" . sha256_hex($uri);
|
||||
die if ! -d $clonePath;
|
||||
$diff .= `(cd $clonePath ; hg log -r $rev1:$rev2)`;
|
||||
$diff .= `(cd $clonePath ; hg log -r $rev1 -r $rev2 -b $branch)`;
|
||||
$diff .= `(cd $clonePath ; hg diff -r $rev1:$rev2)`;
|
||||
} elsif ($type eq "git") {
|
||||
my $clonePath = scmPath . "/" . sha256_hex($uri.$branch);
|
||||
|
@ -226,4 +228,37 @@ sub scmdiff : Chained('api') PathPart('scmdiff') Args(0) {
|
|||
$c->forward('Hydra::View::Plain');
|
||||
}
|
||||
|
||||
sub readNormalizedLog {
|
||||
my ($file) = @_;
|
||||
my $res = read_file($file);
|
||||
|
||||
$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->resultInfo->logfile && -f $build2->resultInfo->logfile) {
|
||||
my $logtext1 = readNormalizedLog($build1->resultInfo->logfile);
|
||||
my $logtext2 = readNormalizedLog($build2->resultInfo->logfile);
|
||||
$diff = diff \$logtext1, \$logtext2;
|
||||
} else {
|
||||
$c->response->status(404);
|
||||
}
|
||||
$c->stash->{'plain'} = { data => (scalar $diff) || " " };
|
||||
$c->forward('Hydra::View::Plain');
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
|
@ -151,6 +151,7 @@ sub robots_txt : Path('robots.txt') {
|
|||
, uri_for('Root', 'status', [])
|
||||
, uri_for('Root', 'all', [])
|
||||
, uri_for('API', 'scmdiff', [])
|
||||
, uri_for('API', 'logdiff', [],"*", "*")
|
||||
, uri_for('Project', 'all', ["*"])
|
||||
, channelUris('Root', ["*"])
|
||||
, channelUris('Project', ["*", "*"])
|
||||
|
|
|
@ -184,15 +184,19 @@
|
|||
[% INCLUDE renderBuildSteps type="Failed" %]
|
||||
[% END %]
|
||||
|
||||
[% IF build.resultInfo.buildstatus != 0 && prevSuccessfulBuild %]
|
||||
<h2>Changes</h2>
|
||||
Changes compared to last successful build:<br/>
|
||||
<br/>
|
||||
<table>
|
||||
<thead>
|
||||
<th>Last successful build <tt>[% INCLUDE renderDateTime timestamp = prevSuccessfulBuild.timestamp %]</tt></th>
|
||||
[% IF prevSuccessfulBuild && firstBrokenBuild && firstBrokenBuild.id != build.id %]<th>First broken build <tt>[% INCLUDE renderDateTime timestamp = firstBrokenBuild.timestamp %]</tt></th>[% END %]
|
||||
<th>This build <tt>[% INCLUDE renderDateTime timestamp = build.timestamp %]</tt></th>
|
||||
[% IF prevSuccessfulBuild && firstBrokenBuild && firstBrokenBuild.id != build.id %]
|
||||
<th>First broken build <tt>[% INCLUDE renderDateTime timestamp = firstBrokenBuild.timestamp %]</tt><br/>
|
||||
<tt>[ <a href="[% c.uri_for(c.controller('API').action_for('logdiff') prevSuccessfulBuild.id firstBrokenBuild.id ) %]">log diff</a> ]</tt>
|
||||
</th>
|
||||
[% END %]
|
||||
<th>This build <tt>[% INCLUDE renderDateTime timestamp = build.timestamp %]</tt> <br/>
|
||||
<tt>[ <a href="[% c.uri_for(c.controller('API').action_for('logdiff') prevSuccessfulBuild.id build.id) %]">log diff</a> ]</tt>
|
||||
</th>
|
||||
</thead>
|
||||
<tr>
|
||||
<td valign="center">[% INCLUDE renderBuildStatusIcon build=prevSuccessfulBuild size=32 %] [% INCLUDE renderFullBuildLink build=prevSuccessfulBuild %]</td>
|
||||
|
@ -205,7 +209,6 @@
|
|||
<td>[% INCLUDE renderInputDiff build1=prevSuccessfulBuild , build2=build %]</td>
|
||||
</tr>
|
||||
</table>
|
||||
[% END %]
|
||||
|
||||
[% IF build.resultInfo.errormsg && build.resultInfo.buildstatus != 5 %]
|
||||
|
||||
|
|
Loading…
Reference in a new issue