* Store info about the build inputs in the build record.

This commit is contained in:
Eelco Dolstra 2008-11-05 06:23:41 +00:00
parent a970603ad1
commit 0ea294e77e
11 changed files with 114 additions and 19 deletions

View file

@ -8,8 +8,8 @@ use base 'DBIx::Class::Schema';
__PACKAGE__->load_classes; __PACKAGE__->load_classes;
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-04 14:45:23 # Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-05 07:10:07
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:UAjA2VmMoOSjiHk0NUzLfQ # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:uu8sYu88Z2oes5zF82ugmg
# You can replace this text with custom content, and it will be preserved on regeneration # You can replace this text with custom content, and it will be preserved on regeneration

View file

@ -0,0 +1,37 @@
package HydraFrontend::Schema::Buildinputs;
use strict;
use warnings;
use base 'DBIx::Class';
__PACKAGE__->load_components("Core");
__PACKAGE__->table("buildInputs");
__PACKAGE__->add_columns(
"buildid",
{ data_type => "integer", is_nullable => 0, size => undef },
"name",
{ data_type => "text", is_nullable => 0, size => undef },
"type",
{ data_type => "text", is_nullable => 0, size => undef },
"uri",
{ data_type => "text", is_nullable => 0, size => undef },
"revision",
{ data_type => "integer", is_nullable => 0, size => undef },
"tag",
{ data_type => "text", is_nullable => 0, size => undef },
);
__PACKAGE__->set_primary_key("buildid", "name");
__PACKAGE__->belongs_to(
"buildid",
"HydraFrontend::Schema::Builds",
{ id => "buildid" },
);
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-05 07:10:07
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:m8eC8wnRqF6OLO7EQ7gEvg
# You can replace this text with custom content, and it will be preserved on regeneration
1;

View file

@ -25,8 +25,8 @@ __PACKAGE__->belongs_to(
); );
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-04 14:45:23 # Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-05 07:10:07
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:kck2qlNZVLFUnevNPSBVKw # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:aEqSRZwHoE8HMwlUb05r+w
# You can replace this text with custom content, and it will be preserved on regeneration # You can replace this text with custom content, and it will be preserved on regeneration

View file

@ -25,8 +25,8 @@ __PACKAGE__->belongs_to(
); );
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-04 14:45:23 # Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-05 07:10:07
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:CnCSHdI5+5p+L6+r/YITxQ # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ft672+6Aile/GNGUGMsGWw
# You can replace this text with custom content, and it will be preserved on regeneration # You can replace this text with custom content, and it will be preserved on regeneration

View file

@ -46,9 +46,14 @@ __PACKAGE__->has_many(
"HydraFrontend::Schema::Buildlogs", "HydraFrontend::Schema::Buildlogs",
{ "foreign.buildid" => "self.id" }, { "foreign.buildid" => "self.id" },
); );
__PACKAGE__->has_many(
"buildinputs",
"HydraFrontend::Schema::Buildinputs",
{ "foreign.buildid" => "self.id" },
);
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-04 14:45:23 # Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-05 07:10:07
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Odp6qymLlNXbsD7VOQ7PAQ # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:uogJnVTVX17swfcbZgGQYg
1; 1;

View file

@ -40,8 +40,8 @@ __PACKAGE__->belongs_to(
); );
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-04 14:45:23 # Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-05 07:10:07
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:pzKFsX3b5wTNZvo8t3WTDg # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:q2kFjFI0X2cbHCrWi3GUCg
# You can replace this text with custom content, and it will be preserved on regeneration # You can replace this text with custom content, and it will be preserved on regeneration

View file

@ -37,8 +37,8 @@ __PACKAGE__->has_many(
); );
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-04 14:45:23 # Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-05 07:10:07
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:pEIAO9lDM+lMKLCLGWRdXg # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Y3YaApHX3uowoamLrr3fAA
# You can replace this text with custom content, and it will be preserved on regeneration # You can replace this text with custom content, and it will be preserved on regeneration

View file

@ -19,8 +19,8 @@ __PACKAGE__->has_many(
); );
# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-04 14:45:23 # Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-11-05 07:10:07
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:cpO0BGfChpnpm7KBKkSUjw # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:gjIRVxp5x78v1ctQ6+ZqLg
# You can replace this text with custom content, and it will be preserved on regeneration # You can replace this text with custom content, and it will be preserved on regeneration

View file

@ -3,6 +3,7 @@
<h1>Build [% id %]</h1> <h1>Build [% id %]</h1>
<h2>Information</h2> <h2>Information</h2>
<table> <table>
@ -51,6 +52,24 @@
</table> </table>
<h2>Build inputs</h2>
<table class="tablesorter">
<thead>
<tr><th>Name</th><th>type</th><th>Uri</th></tr>
</thead>
<tbody>
[% FOREACH input IN build.buildinputs -%]
<tr>
<td>[% input.name %]</td>
<td>[% input.type %]</td>
<td>[% input.uri %]</td>
</tr>
[% END -%]
</tbody>
</table>
<h2>Build products</h2> <h2>Build products</h2>
<ul> <ul>

View file

@ -21,6 +21,19 @@ create table builds (
); );
create table buildInputs (
buildId integer not null,
-- Copied from the jobSetInputs from which the build was created.
name text not null,
type text not null,
uri text,
revision integer,
tag text,
primary key (buildId, name),
foreign key (buildId) references builds(id) on delete cascade -- ignored by sqlite
);
create table buildProducts ( create table buildProducts (
buildId integer not null, buildId integer not null,
type text not null, -- "nix-build", "file", "doc", "report", ... type text not null, -- "nix-build", "file", "doc", "report", ...
@ -45,6 +58,7 @@ create table buildLogs (
create trigger cascadeBuildDeletion create trigger cascadeBuildDeletion
before delete on builds before delete on builds
for each row begin for each row begin
delete from buildInputs where buildId = old.id;
delete from buildLogs where buildId = old.id; delete from buildLogs where buildId = old.id;
delete from buildProducts where buildId = old.id; delete from buildProducts where buildId = old.id;
end; end;

View file

@ -16,7 +16,7 @@ sub isValidPath {
sub buildJob { sub buildJob {
my ($project, $jobset, $jobName, $drvPath, $outPath) = @_; my ($project, $jobset, $jobName, $drvPath, $outPath, $usedInputs) = @_;
if (scalar($db->resultset('Builds')->search({project => $project->name, jobset => $jobset->name, attrname => $jobName, outPath => $outPath})) > 0) { if (scalar($db->resultset('Builds')->search({project => $project->name, jobset => $jobset->name, attrname => $jobName, outPath => $outPath})) > 0) {
print " already done\n"; print " already done\n";
@ -57,6 +57,17 @@ sub buildJob {
}); });
print " build ID = ", $build->id, "\n"; print " build ID = ", $build->id, "\n";
foreach my $input (keys %{$usedInputs}) {
$db->resultset('Buildinputs')->create(
{ buildid => $build->id
, name => $usedInputs->{$input}->{orig}->name
, type => $usedInputs->{$input}->{orig}->type
, uri => $usedInputs->{$input}->{orig}->uri
, revision => $usedInputs->{$input}->{orig}->revision
, tag => $usedInputs->{$input}->{orig}->tag
});
}
my $logPath = "/nix/var/log/nix/drvs/" . basename $drvPath; my $logPath = "/nix/var/log/nix/drvs/" . basename $drvPath;
if (-e $logPath) { if (-e $logPath) {
print " LOG $logPath\n"; print " LOG $logPath\n";
@ -105,7 +116,7 @@ sub fetchInput {
or die "cannot copy path $uri to the Nix store"; or die "cannot copy path $uri to the Nix store";
chomp $storePath; chomp $storePath;
print " copied to $storePath\n"; print " copied to $storePath\n";
$$inputInfo{$input->name} = {storePath => $storePath}; $$inputInfo{$input->name} = {orig => $input, storePath => $storePath};
} }
else { else {
@ -151,19 +162,28 @@ sub checkJobSet {
my $extraArgs = ""; my $extraArgs = "";
my $usedInputs = {};
# If the expression is a function, then look at its formal # If the expression is a function, then look at its formal
# arguments and see if we can supply them. # arguments and see if we can supply them.
if (defined $jobExpr->{function}->{attrspat}) { if (defined $jobExpr->{function}->{attrspat}) {
foreach my $argName (keys(%{$jobExpr->{function}->{attrspat}->{attr}})) { foreach my $argName (keys(%{$jobExpr->{function}->{attrspat}->{attr}})) {
print " needs input $argName\n"; print " needs input $argName\n";
my $storePath; my $storePath;
if (defined $inputInfo->{$argName}) { if (defined $inputInfo->{$argName}) {
# The argument name matches an input. # The argument name matches an input.
$storePath = $inputInfo->{$argName}->{storePath}; $storePath = $inputInfo->{$argName}->{storePath};
} else { $$usedInputs{$argName} = $inputInfo->{$argName};
}
else {
(my $prevBuild) = $db->resultset('Builds')->search( (my $prevBuild) = $db->resultset('Builds')->search(
{project => $project->name, jobset => $jobset->name, attrname => $argName}, {project => $project->name, jobset => $jobset->name, attrname => $argName},
{order_by => "timestamp DESC", rows => 1}); {order_by => "timestamp DESC", rows => 1});
if (defined $prevBuild) { if (defined $prevBuild) {
# The argument name matches a previously built # The argument name matches a previously built
# job in this jobset. Pick the most recent # job in this jobset. Pick the most recent
@ -178,12 +198,12 @@ sub checkJobSet {
die "missing input `$argName'"; die "missing input `$argName'";
} }
} }
$extraArgs .= " --arg $argName '{path = " . $storePath . ";}'"; $extraArgs .= " --arg $argName '{path = " . $storePath . ";}'";
} }
} }
# Instantiate the store derivation. # Instantiate the store derivation.
print "$extraArgs\n";
my $drvPath = `nix-instantiate $nixExprPath --attr $jobName $extraArgs` my $drvPath = `nix-instantiate $nixExprPath --attr $jobName $extraArgs`
or die "cannot evaluate the Nix expression containing the job definitions: $?"; or die "cannot evaluate the Nix expression containing the job definitions: $?";
chomp $drvPath; chomp $drvPath;
@ -202,7 +222,7 @@ sub checkJobSet {
die unless $job->{drvPath} eq $drvPath; die unless $job->{drvPath} eq $drvPath;
my $outPath = $job->{outPath}; my $outPath = $job->{outPath};
buildJob($project, $jobset, $jobName, $drvPath, $outPath); buildJob($project, $jobset, $jobName, $drvPath, $outPath, $usedInputs);
} }
} }