* remove trailing spaces from email notification
 * option to disable email notification for jobset
This commit is contained in:
Rob Vermaas 2010-01-06 13:07:59 +00:00
parent 044edfb764
commit 8a01999220
6 changed files with 191 additions and 15 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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>

View File

@ -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;

View File

@ -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);
}
}); });
} }
} }

View File

@ -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