diff --git a/src/lib/Hydra/Controller/Jobset.pm b/src/lib/Hydra/Controller/Jobset.pm index 5877212b..467cc30a 100644 --- a/src/lib/Hydra/Controller/Jobset.pm +++ b/src/lib/Hydra/Controller/Jobset.pm @@ -149,6 +149,8 @@ sub updateJobset { , nixexprpath => $nixExprPath , nixexprinput => $nixExprInput , 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; diff --git a/src/lib/Hydra/Schema/Jobsets.pm b/src/lib/Hydra/Schema/Jobsets.pm index 97f25386..2ec76dab 100644 --- a/src/lib/Hydra/Schema/Jobsets.pm +++ b/src/lib/Hydra/Schema/Jobsets.pm @@ -8,6 +8,140 @@ use warnings; 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__->table("Jobsets"); __PACKAGE__->add_columns( @@ -118,5 +252,10 @@ __PACKAGE__->has_many( # 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 1; diff --git a/src/root/jobset.tt b/src/root/jobset.tt index 77775d46..69097b24 100644 --- a/src/root/jobset.tt +++ b/src/root/jobset.tt @@ -78,6 +78,18 @@ [% INCLUDE renderSelection param="enabled" curValue=jobset.enabled options={"1" = "Yes", "0" = "No"} %] + + Enable email notification: + + [% INCLUDE renderSelection param="enableemail" curValue=jobset.enableemail options={"1" = "Yes", "0" = "No"} %] + + + + Email override: + + [% INCLUDE maybeEditString param="emailoverride" value=jobset.emailoverride %] + + [% IF !edit %] Last checked: diff --git a/src/script/hydra_build.pl b/src/script/hydra_build.pl index d1eea473..bba8093f 100755 --- a/src/script/hydra_build.pl +++ b/src/script/hydra_build.pl @@ -62,32 +62,46 @@ sub sendTwitterNotification { warn "$@\n" if $@; } - sub sendEmailNotification { my ($build) = @_; die unless defined $build->resultInfo; - return if !$build->maintainers; + return if !($build->maintainers || $build->jobset->enableemail); # Do we want to send mail? - if ($build->resultInfo->buildstatus == 0) { - # Build succeeded. Only send mail if the previous build for - # the same platform failed. - return; # TODO + my $prevBuild; + ($prevBuild) = $db->resultset('Builds')->search( + { project => $build->project->name + , 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. - # !!! should use the Template Toolkit here. print STDERR "sending mail notification to ", $build->maintainers, "\n"; my $jobName = $build->project->name . ":" . $build->jobset->name . ":" . $build->job->name; - my $status = - $build->resultInfo->buildstatus == 0 ? "SUCCEEDED" : "FAILED"; + my $status = $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'} || (($ENV{'USER'} || "hydra") . "@" . hostname_long); @@ -134,8 +148,8 @@ sub sendEmailNotification { my $body = "Hi,\n" . "\n" - . "This is to let you know that Hydra build " . $build->id - . " of job " . $jobName . " has $status.\n" + . "This is to let you know that Hydra build" . $build->id + . " of job " . $jobName . " has $statusMsg.\n" . "\n" . "Complete build information can be found on this page: " . "$selfURI/build/" . $build->id . "\n" @@ -151,10 +165,13 @@ sub sendEmailNotification { . $inputsTable->body . "\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( header => [ - To => $build->maintainers, + To => $to, From => "Hydra Build Daemon <$sender>", Subject => "Hydra job $jobName build " . $build->id . " $status", ], @@ -198,7 +215,7 @@ sub doBuild { "--max-silent-time 3600 --keep-going --fallback " . "--no-build-output --log-type flat --print-build-trace " . "--add-root " . gcRootFor $outPath . " 2>&1"; - +print STDERR $cmd; my $max = $build->buildsteps->find( {}, {select => {max => 'stepnr + 1'}, as => ['max']}); my $buildStepNr = defined $max ? $max->get_column('max') : 1; diff --git a/src/script/hydra_scheduler.pl b/src/script/hydra_scheduler.pl index 0351a3cb..29740c21 100755 --- a/src/script/hydra_scheduler.pl +++ b/src/script/hydra_scheduler.pl @@ -160,7 +160,9 @@ sub checkJobset { } $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"; txn_do($db, sub { $jobset->update({lastcheckedtime => time}); - setJobsetError($jobset, $msg); + if( !($msg eq "") ) { + setJobsetError($jobset, $msg); + } }); } } diff --git a/src/sql/hydra.sql b/src/sql/hydra.sql index 32cc4c84..2f82d190 100644 --- a/src/sql/hydra.sql +++ b/src/sql/hydra.sql @@ -39,6 +39,8 @@ create table Jobsets ( errorTime integer, -- timestamp associated with errorMsg lastCheckedTime integer, -- last time the scheduler looked at this jobset enabled integer not null default 1, + enableEmail integer not null default 1, + emailOverride text not null, primary key (project, name), foreign key (project) references Projects(name) on delete cascade on update cascade #ifdef SQLITE