hydra
* remove trailing spaces from email notification * option to disable email notification for jobset
This commit is contained in:
parent
044edfb764
commit
8a01999220
@ -149,6 +149,8 @@ sub updateJobset {
|
|||||||
, nixexprpath => $nixExprPath
|
, nixexprpath => $nixExprPath
|
||||||
, nixexprinput => $nixExprInput
|
, nixexprinput => $nixExprInput
|
||||||
, enabled => trim($c->request->params->{enabled}) eq "1" ? 1 : 0
|
, enabled => trim($c->request->params->{enabled}) eq "1" ? 1 : 0
|
||||||
|
, enableemail => trim($c->request->params->{enableemail}) eq "1" ? 1 : 0
|
||||||
|
, emailoverride => trim($c->request->params->{emailoverride})
|
||||||
});
|
});
|
||||||
|
|
||||||
my %inputNames;
|
my %inputNames;
|
||||||
|
@ -8,6 +8,140 @@ use warnings;
|
|||||||
|
|
||||||
use base 'DBIx::Class';
|
use base 'DBIx::Class';
|
||||||
|
|
||||||
|
__PACKAGE__->load_components("Core");
|
||||||
|
__PACKAGE__->table("Jobsets");
|
||||||
|
__PACKAGE__->add_columns(
|
||||||
|
"name",
|
||||||
|
{
|
||||||
|
data_type => "text",
|
||||||
|
default_value => undef,
|
||||||
|
is_foreign_key => 1,
|
||||||
|
is_nullable => 0,
|
||||||
|
size => undef,
|
||||||
|
},
|
||||||
|
"project",
|
||||||
|
{
|
||||||
|
data_type => "text",
|
||||||
|
default_value => undef,
|
||||||
|
is_foreign_key => 1,
|
||||||
|
is_nullable => 0,
|
||||||
|
size => undef,
|
||||||
|
},
|
||||||
|
"description",
|
||||||
|
{
|
||||||
|
data_type => "text",
|
||||||
|
default_value => undef,
|
||||||
|
is_nullable => 1,
|
||||||
|
size => undef,
|
||||||
|
},
|
||||||
|
"nixexprinput",
|
||||||
|
{
|
||||||
|
data_type => "text",
|
||||||
|
default_value => undef,
|
||||||
|
is_foreign_key => 1,
|
||||||
|
is_nullable => 0,
|
||||||
|
size => undef,
|
||||||
|
},
|
||||||
|
"nixexprpath",
|
||||||
|
{
|
||||||
|
data_type => "text",
|
||||||
|
default_value => undef,
|
||||||
|
is_nullable => 0,
|
||||||
|
size => undef,
|
||||||
|
},
|
||||||
|
"errormsg",
|
||||||
|
{
|
||||||
|
data_type => "text",
|
||||||
|
default_value => undef,
|
||||||
|
is_nullable => 1,
|
||||||
|
size => undef,
|
||||||
|
},
|
||||||
|
"errortime",
|
||||||
|
{
|
||||||
|
data_type => "integer",
|
||||||
|
default_value => undef,
|
||||||
|
is_nullable => 1,
|
||||||
|
size => undef,
|
||||||
|
},
|
||||||
|
"lastcheckedtime",
|
||||||
|
{
|
||||||
|
data_type => "integer",
|
||||||
|
default_value => undef,
|
||||||
|
is_nullable => 1,
|
||||||
|
size => undef,
|
||||||
|
},
|
||||||
|
"enabled",
|
||||||
|
{ data_type => "integer", default_value => 1, is_nullable => 0, size => undef },
|
||||||
|
"enableemail",
|
||||||
|
{ data_type => "integer", default_value => 1, is_nullable => 0, size => undef },
|
||||||
|
"emailoverride",
|
||||||
|
{
|
||||||
|
data_type => "text",
|
||||||
|
default_value => undef,
|
||||||
|
is_nullable => 0,
|
||||||
|
size => undef,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
__PACKAGE__->set_primary_key("project", "name");
|
||||||
|
__PACKAGE__->belongs_to("project", "Hydra::Schema::Projects", { name => "project" });
|
||||||
|
__PACKAGE__->belongs_to(
|
||||||
|
"jobsetinput",
|
||||||
|
"Hydra::Schema::JobsetInputs",
|
||||||
|
{ jobset => "name", name => "nixexprinput", project => "project" },
|
||||||
|
);
|
||||||
|
__PACKAGE__->has_many(
|
||||||
|
"jobsetinputs",
|
||||||
|
"Hydra::Schema::JobsetInputs",
|
||||||
|
{
|
||||||
|
"foreign.jobset" => "self.name",
|
||||||
|
"foreign.project" => "self.project",
|
||||||
|
},
|
||||||
|
);
|
||||||
|
__PACKAGE__->has_many(
|
||||||
|
"jobs",
|
||||||
|
"Hydra::Schema::Jobs",
|
||||||
|
{
|
||||||
|
"foreign.jobset" => "self.name",
|
||||||
|
"foreign.project" => "self.project",
|
||||||
|
},
|
||||||
|
);
|
||||||
|
__PACKAGE__->has_many(
|
||||||
|
"builds",
|
||||||
|
"Hydra::Schema::Builds",
|
||||||
|
{
|
||||||
|
"foreign.jobset" => "self.name",
|
||||||
|
"foreign.project" => "self.project",
|
||||||
|
},
|
||||||
|
);
|
||||||
|
__PACKAGE__->has_many(
|
||||||
|
"jobsetinputhashes",
|
||||||
|
"Hydra::Schema::JobsetInputHashes",
|
||||||
|
{
|
||||||
|
"foreign.jobset" => "self.name",
|
||||||
|
"foreign.project" => "self.project",
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
# Created by DBIx::Class::Schema::Loader v0.04999_09 @ 2010-01-06 10:15:26
|
||||||
|
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:buO0P7XQexj6YEwEAsq3EQ
|
||||||
|
# These lines were loaded from '/home/rbvermaa/src/hydra/src/lib/Hydra/Schema/Jobsets.pm' found in @INC.
|
||||||
|
# They are now part of the custom portion of this file
|
||||||
|
# for you to hand-edit. If you do not either delete
|
||||||
|
# this section or remove that file from @INC, this section
|
||||||
|
# will be repeated redundantly when you re-create this
|
||||||
|
# file again via Loader!
|
||||||
|
|
||||||
|
package Hydra::Schema::Jobsets;
|
||||||
|
|
||||||
|
# Created by DBIx::Class::Schema::Loader
|
||||||
|
# DO NOT MODIFY THE FIRST PART OF THIS FILE
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use base 'DBIx::Class';
|
||||||
|
|
||||||
__PACKAGE__->load_components("Core");
|
__PACKAGE__->load_components("Core");
|
||||||
__PACKAGE__->table("Jobsets");
|
__PACKAGE__->table("Jobsets");
|
||||||
__PACKAGE__->add_columns(
|
__PACKAGE__->add_columns(
|
||||||
@ -118,5 +252,10 @@ __PACKAGE__->has_many(
|
|||||||
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:fVXvhb343Zw1625daVz40g
|
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:fVXvhb343Zw1625daVz40g
|
||||||
|
|
||||||
|
|
||||||
|
# You can replace this text with custom content, and it will be preserved on regeneration
|
||||||
|
1;
|
||||||
|
# End of lines loaded from '/home/rbvermaa/src/hydra/src/lib/Hydra/Schema/Jobsets.pm'
|
||||||
|
|
||||||
|
|
||||||
# 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
|
||||||
1;
|
1;
|
||||||
|
@ -78,6 +78,18 @@
|
|||||||
[% INCLUDE renderSelection param="enabled" curValue=jobset.enabled options={"1" = "Yes", "0" = "No"} %]
|
[% INCLUDE renderSelection param="enabled" curValue=jobset.enabled options={"1" = "Yes", "0" = "No"} %]
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Enable email notification:</th>
|
||||||
|
<td>
|
||||||
|
[% INCLUDE renderSelection param="enableemail" curValue=jobset.enableemail options={"1" = "Yes", "0" = "No"} %]
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Email override:</th>
|
||||||
|
<td>
|
||||||
|
[% INCLUDE maybeEditString param="emailoverride" value=jobset.emailoverride %]
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
[% IF !edit %]
|
[% IF !edit %]
|
||||||
<tr>
|
<tr>
|
||||||
<th>Last checked:</th>
|
<th>Last checked:</th>
|
||||||
|
@ -62,32 +62,46 @@ sub sendTwitterNotification {
|
|||||||
warn "$@\n" if $@;
|
warn "$@\n" if $@;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sub sendEmailNotification {
|
sub sendEmailNotification {
|
||||||
my ($build) = @_;
|
my ($build) = @_;
|
||||||
|
|
||||||
die unless defined $build->resultInfo;
|
die unless defined $build->resultInfo;
|
||||||
|
|
||||||
return if !$build->maintainers;
|
return if !($build->maintainers || $build->jobset->enableemail);
|
||||||
|
|
||||||
# Do we want to send mail?
|
# Do we want to send mail?
|
||||||
|
|
||||||
if ($build->resultInfo->buildstatus == 0) {
|
my $prevBuild;
|
||||||
# Build succeeded. Only send mail if the previous build for
|
($prevBuild) = $db->resultset('Builds')->search(
|
||||||
# the same platform failed.
|
{ project => $build->project->name
|
||||||
return; # TODO
|
, jobset => $build->jobset->name
|
||||||
|
, job => $build->job->name
|
||||||
|
, system => $build->system
|
||||||
|
, finished => 1
|
||||||
|
, id => { '!=', $build->id }
|
||||||
|
}, { order_by => ["timestamp DESC"] }
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
if (defined $prevBuild && ($build->resultInfo->buildstatus == $prevBuild->resultInfo->buildstatus)) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Send mail.
|
# Send mail.
|
||||||
|
|
||||||
# !!! should use the Template Toolkit here.
|
# !!! should use the Template Toolkit here.
|
||||||
|
|
||||||
print STDERR "sending mail notification to ", $build->maintainers, "\n";
|
print STDERR "sending mail notification to ", $build->maintainers, "\n";
|
||||||
|
|
||||||
my $jobName = $build->project->name . ":" . $build->jobset->name . ":" . $build->job->name;
|
my $jobName = $build->project->name . ":" . $build->jobset->name . ":" . $build->job->name;
|
||||||
|
|
||||||
my $status =
|
my $status = $build->resultInfo->buildstatus == 0 ? "SUCCEEDED" : "FAILED";
|
||||||
$build->resultInfo->buildstatus == 0 ? "SUCCEEDED" : "FAILED";
|
my $statusMsg;
|
||||||
|
if(defined $prevBuild) {
|
||||||
|
my $prevStatus = $prevBuild->resultInfo->buildstatus == 0 ? "SUCCEEDED" : "FAILED";
|
||||||
|
$statusMsg = "changed from $prevStatus to $status";
|
||||||
|
} else {
|
||||||
|
$statusMsg = $status;
|
||||||
|
}
|
||||||
|
|
||||||
my $sender = $config{'notification_sender'} ||
|
my $sender = $config{'notification_sender'} ||
|
||||||
(($ENV{'USER'} || "hydra") . "@" . hostname_long);
|
(($ENV{'USER'} || "hydra") . "@" . hostname_long);
|
||||||
@ -134,8 +148,8 @@ sub sendEmailNotification {
|
|||||||
|
|
||||||
my $body = "Hi,\n"
|
my $body = "Hi,\n"
|
||||||
. "\n"
|
. "\n"
|
||||||
. "This is to let you know that Hydra build " . $build->id
|
. "This is to let you know that Hydra build" . $build->id
|
||||||
. " of job " . $jobName . " has $status.\n"
|
. " of job " . $jobName . " has $statusMsg.\n"
|
||||||
. "\n"
|
. "\n"
|
||||||
. "Complete build information can be found on this page: "
|
. "Complete build information can be found on this page: "
|
||||||
. "$selfURI/build/" . $build->id . "\n"
|
. "$selfURI/build/" . $build->id . "\n"
|
||||||
@ -151,10 +165,13 @@ sub sendEmailNotification {
|
|||||||
. $inputsTable->body
|
. $inputsTable->body
|
||||||
. "\n"
|
. "\n"
|
||||||
. "Regards,\n\nThe Hydra build daemon.\n";
|
. "Regards,\n\nThe Hydra build daemon.\n";
|
||||||
|
# stripping trailing spaces from lines
|
||||||
|
$body =~ s/[\ ]+$//gm;
|
||||||
|
|
||||||
|
my $to = (!$build->jobset->emailoverride eq "") ? $build->jobset->emailoverride : $build->maintainers;
|
||||||
my $email = Email::Simple->create(
|
my $email = Email::Simple->create(
|
||||||
header => [
|
header => [
|
||||||
To => $build->maintainers,
|
To => $to,
|
||||||
From => "Hydra Build Daemon <$sender>",
|
From => "Hydra Build Daemon <$sender>",
|
||||||
Subject => "Hydra job $jobName build " . $build->id . " $status",
|
Subject => "Hydra job $jobName build " . $build->id . " $status",
|
||||||
],
|
],
|
||||||
@ -198,7 +215,7 @@ sub doBuild {
|
|||||||
"--max-silent-time 3600 --keep-going --fallback " .
|
"--max-silent-time 3600 --keep-going --fallback " .
|
||||||
"--no-build-output --log-type flat --print-build-trace " .
|
"--no-build-output --log-type flat --print-build-trace " .
|
||||||
"--add-root " . gcRootFor $outPath . " 2>&1";
|
"--add-root " . gcRootFor $outPath . " 2>&1";
|
||||||
|
print STDERR $cmd;
|
||||||
my $max = $build->buildsteps->find(
|
my $max = $build->buildsteps->find(
|
||||||
{}, {select => {max => 'stepnr + 1'}, as => ['max']});
|
{}, {select => {max => 'stepnr + 1'}, as => ['max']});
|
||||||
my $buildStepNr = defined $max ? $max->get_column('max') : 1;
|
my $buildStepNr = defined $max ? $max->get_column('max') : 1;
|
||||||
|
@ -160,7 +160,9 @@ sub checkJobset {
|
|||||||
}
|
}
|
||||||
$msg .= "at `" . $error->{location} . "' [$bindings]:\n" . $error->{msg} . "\n\n";
|
$msg .= "at `" . $error->{location} . "' [$bindings]:\n" . $error->{msg} . "\n\n";
|
||||||
}
|
}
|
||||||
setJobsetError($jobset, $msg);
|
if( !($msg eq "") ) {
|
||||||
|
setJobsetError($jobset, $msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -178,7 +180,9 @@ sub checkJobsetWrapped {
|
|||||||
print "error evaluating jobset ", $jobset->name, ": $msg";
|
print "error evaluating jobset ", $jobset->name, ": $msg";
|
||||||
txn_do($db, sub {
|
txn_do($db, sub {
|
||||||
$jobset->update({lastcheckedtime => time});
|
$jobset->update({lastcheckedtime => time});
|
||||||
setJobsetError($jobset, $msg);
|
if( !($msg eq "") ) {
|
||||||
|
setJobsetError($jobset, $msg);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,8 @@ create table Jobsets (
|
|||||||
errorTime integer, -- timestamp associated with errorMsg
|
errorTime integer, -- timestamp associated with errorMsg
|
||||||
lastCheckedTime integer, -- last time the scheduler looked at this jobset
|
lastCheckedTime integer, -- last time the scheduler looked at this jobset
|
||||||
enabled integer not null default 1,
|
enabled integer not null default 1,
|
||||||
|
enableEmail integer not null default 1,
|
||||||
|
emailOverride text not null,
|
||||||
primary key (project, name),
|
primary key (project, name),
|
||||||
foreign key (project) references Projects(name) on delete cascade on update cascade
|
foreign key (project) references Projects(name) on delete cascade on update cascade
|
||||||
#ifdef SQLITE
|
#ifdef SQLITE
|
||||||
|
Loading…
x
Reference in New Issue
Block a user