forked from lix-project/hydra
* Get dependencies from the database.
This commit is contained in:
parent
621ce1ee64
commit
a970603ad1
|
@ -9,6 +9,12 @@ use HydraFrontend::Schema;
|
||||||
my $db = HydraFrontend::Schema->connect("dbi:SQLite:dbname=hydra.sqlite", "", "", {});
|
my $db = HydraFrontend::Schema->connect("dbi:SQLite:dbname=hydra.sqlite", "", "", {});
|
||||||
|
|
||||||
|
|
||||||
|
sub isValidPath {
|
||||||
|
my $path = shift;
|
||||||
|
return system("nix-store --check-validity $path 2> /dev/null") == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
sub buildJob {
|
sub buildJob {
|
||||||
my ($project, $jobset, $jobName, $drvPath, $outPath) = @_;
|
my ($project, $jobset, $jobName, $drvPath, $outPath) = @_;
|
||||||
|
|
||||||
|
@ -22,7 +28,7 @@ sub buildJob {
|
||||||
my $startTime = 0;
|
my $startTime = 0;
|
||||||
my $stopTime = 0;
|
my $stopTime = 0;
|
||||||
|
|
||||||
if (system("nix-store --check-validity $outPath 2> /dev/null") != 0) {
|
if (!isValidPath($outPath)) {
|
||||||
$isCachedBuild = 0;
|
$isCachedBuild = 0;
|
||||||
|
|
||||||
$startTime = time();
|
$startTime = time();
|
||||||
|
@ -150,12 +156,34 @@ sub checkJobSet {
|
||||||
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";
|
||||||
die "missing input `$argName'" if !defined $inputInfo->{$argName};
|
my $storePath;
|
||||||
$extraArgs .= " --arg $argName '{path = " . $inputInfo->{$argName}->{storePath} . ";}'";
|
if (defined $inputInfo->{$argName}) {
|
||||||
|
# The argument name matches an input.
|
||||||
|
$storePath = $inputInfo->{$argName}->{storePath};
|
||||||
|
} else {
|
||||||
|
(my $prevBuild) = $db->resultset('Builds')->search(
|
||||||
|
{project => $project->name, jobset => $jobset->name, attrname => $argName},
|
||||||
|
{order_by => "timestamp DESC", rows => 1});
|
||||||
|
if (defined $prevBuild) {
|
||||||
|
# The argument name matches a previously built
|
||||||
|
# job in this jobset. Pick the most recent
|
||||||
|
# build. !!! refine the selection criteria:
|
||||||
|
# e.g., most recent successful build.
|
||||||
|
if (!isValidPath($prevBuild->outpath)) {
|
||||||
|
die "input path " . $prevBuild->outpath . " has been garbage-collected";
|
||||||
|
}
|
||||||
|
$storePath = $prevBuild->outpath;
|
||||||
|
} else {
|
||||||
|
# !!! reschedule?
|
||||||
|
die "missing input `$argName'";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$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;
|
||||||
|
|
Loading…
Reference in a new issue