2013-05-08 17:30:30 +02:00
|
|
|
|
package Hydra::Plugin::EmailNotification;
|
|
|
|
|
|
2014-11-19 14:44:04 +01:00
|
|
|
|
use utf8;
|
2013-05-08 17:30:30 +02:00
|
|
|
|
use strict;
|
2013-05-08 18:34:18 +02:00
|
|
|
|
use parent 'Hydra::Plugin';
|
2013-05-08 17:30:30 +02:00
|
|
|
|
use POSIX qw(strftime);
|
2013-05-09 14:23:15 +02:00
|
|
|
|
use Template;
|
2013-05-08 17:30:30 +02:00
|
|
|
|
use Hydra::Helper::Nix;
|
2013-05-09 11:39:58 +02:00
|
|
|
|
use Hydra::Helper::CatalystUtils;
|
2014-11-19 14:44:04 +01:00
|
|
|
|
use Hydra::Helper::Email;
|
2013-05-08 17:30:30 +02:00
|
|
|
|
|
2019-08-13 17:20:16 +02:00
|
|
|
|
sub isEnabled {
|
|
|
|
|
my ($self) = @_;
|
|
|
|
|
return $self->{config}->{email_notification} == 1;
|
|
|
|
|
}
|
2013-05-08 17:30:30 +02:00
|
|
|
|
|
2013-07-05 18:10:50 -04:00
|
|
|
|
my $template = <<EOF;
|
2013-05-09 14:23:15 +02:00
|
|
|
|
Hi,
|
|
|
|
|
|
2014-11-19 14:44:04 +01:00
|
|
|
|
The status of Hydra job ‘[% showJobName(build) %]’ [% IF showSystem %](on [% build.system %]) [% END %][% IF prevBuild && build.buildstatus != prevBuild.buildstatus %]has changed from "[% showStatus(prevBuild) %]" to "[% showStatus(build) %]"[% ELSE %]is "[% showStatus(build) %]"[% END %]. For details, see
|
2013-05-09 14:23:15 +02:00
|
|
|
|
|
|
|
|
|
[% baseurl %]/build/[% build.id %]
|
|
|
|
|
|
|
|
|
|
[% IF dependents.size > 0 -%]
|
|
|
|
|
The following dependent jobs also failed:
|
|
|
|
|
|
|
|
|
|
[% FOREACH b IN dependents -%]
|
|
|
|
|
* [% showJobName(b) %] ([% baseurl %]/build/[% b.id %])
|
|
|
|
|
[% END -%]
|
|
|
|
|
|
|
|
|
|
[% END -%]
|
2014-11-19 14:52:42 +01:00
|
|
|
|
[% IF nrCommits > 0 && authorList -%]
|
2014-11-19 15:24:31 +01:00
|
|
|
|
This may be due to [% IF nrCommits > 1 -%][% nrCommits %] commits[%- ELSE -%]a commit[%- END -%] by [% authorList %].
|
2013-10-07 11:13:37 -04:00
|
|
|
|
|
2013-10-17 11:20:27 +02:00
|
|
|
|
[% END -%]
|
2013-05-09 14:23:15 +02:00
|
|
|
|
[% IF build.buildstatus == 0 -%]
|
|
|
|
|
Yay!
|
|
|
|
|
[% ELSE -%]
|
|
|
|
|
Go forth and fix [% IF dependents.size == 0 -%]it[% ELSE %]them[% END %].
|
|
|
|
|
[% END -%]
|
|
|
|
|
|
|
|
|
|
Regards,
|
|
|
|
|
|
|
|
|
|
The Hydra build daemon.
|
|
|
|
|
EOF
|
2013-05-08 17:30:30 +02:00
|
|
|
|
|
|
|
|
|
|
2013-05-09 11:39:58 +02:00
|
|
|
|
sub buildFinished {
|
|
|
|
|
my ($self, $build, $dependents) = @_;
|
2013-05-08 17:30:30 +02:00
|
|
|
|
|
2013-05-09 11:39:58 +02:00
|
|
|
|
die unless $build->finished;
|
2013-05-08 17:30:30 +02:00
|
|
|
|
|
2013-05-09 11:39:58 +02:00
|
|
|
|
# Figure out to whom to send notification for each build. For
|
|
|
|
|
# each email address, we send one aggregate email listing only the
|
|
|
|
|
# relevant builds for that address.
|
|
|
|
|
my %addresses;
|
|
|
|
|
foreach my $b ($build, @{$dependents}) {
|
2013-06-27 18:08:00 +02:00
|
|
|
|
my $prevBuild = getPreviousBuild($b);
|
2013-07-05 14:06:10 -04:00
|
|
|
|
# Do we want to send mail for this build?
|
|
|
|
|
unless ($ENV{'HYDRA_FORCE_SEND_MAIL'}) {
|
|
|
|
|
next unless $b->jobset->enableemail;
|
2013-05-08 17:30:30 +02:00
|
|
|
|
|
2013-07-05 14:06:10 -04:00
|
|
|
|
# If build is cancelled or aborted, do not send email.
|
|
|
|
|
next if $b->buildstatus == 4 || $b->buildstatus == 3;
|
2013-05-08 17:30:30 +02:00
|
|
|
|
|
2013-07-05 14:06:10 -04:00
|
|
|
|
# If there is a previous (that is not cancelled or aborted) build
|
|
|
|
|
# with same buildstatus, do not send email.
|
|
|
|
|
next if defined $prevBuild && ($b->buildstatus == $prevBuild->buildstatus);
|
|
|
|
|
}
|
2013-05-08 17:30:30 +02:00
|
|
|
|
|
2013-07-05 14:06:10 -04:00
|
|
|
|
my $to = $b->jobset->emailoverride ne "" ? $b->jobset->emailoverride : $b->maintainers;
|
2013-05-08 17:30:30 +02:00
|
|
|
|
|
2013-09-18 12:51:51 +00:00
|
|
|
|
foreach my $address (split ",", ($to // "")) {
|
2013-07-05 14:06:10 -04:00
|
|
|
|
$address = trim $address;
|
2013-05-08 17:30:30 +02:00
|
|
|
|
|
2013-05-09 11:39:58 +02:00
|
|
|
|
$addresses{$address} //= { builds => [] };
|
|
|
|
|
push @{$addresses{$address}->{builds}}, $b;
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-05-08 17:30:30 +02:00
|
|
|
|
|
2013-10-08 14:47:24 -04:00
|
|
|
|
my ($authors, $nrCommits, $emailable_authors) = getResponsibleAuthors($build, $self->{plugins});
|
2013-10-07 11:13:37 -04:00
|
|
|
|
my $authorList;
|
2014-02-26 11:05:46 -05:00
|
|
|
|
my $prevBuild = getPreviousBuild($build);
|
|
|
|
|
if (scalar keys %{$authors} > 0 &&
|
|
|
|
|
((!defined $prevBuild) || ($build->buildstatus != $prevBuild->buildstatus))) {
|
2013-10-07 11:13:37 -04:00
|
|
|
|
my @x = map { "$_ <$authors->{$_}>" } (sort keys %{$authors});
|
2013-10-16 08:57:48 -04:00
|
|
|
|
$authorList = join(" or ", scalar @x > 1 ? join(", ", @x[0..scalar @x - 2]): (), $x[-1]);
|
2013-10-08 14:47:24 -04:00
|
|
|
|
$addresses{$_} = { builds => [ $build ] } foreach (@{$emailable_authors});
|
2013-10-07 11:13:37 -04:00
|
|
|
|
}
|
|
|
|
|
|
2013-05-09 11:39:58 +02:00
|
|
|
|
# Send an email to each interested address.
|
|
|
|
|
for my $to (keys %addresses) {
|
|
|
|
|
print STDERR "sending mail notification to ", $to, "\n";
|
|
|
|
|
my @builds = @{$addresses{$to}->{builds}};
|
|
|
|
|
|
2013-05-09 14:23:15 +02:00
|
|
|
|
my $tt = Template->new({});
|
2013-05-09 11:39:58 +02:00
|
|
|
|
|
2013-05-09 14:23:15 +02:00
|
|
|
|
my $vars =
|
2013-06-27 18:08:00 +02:00
|
|
|
|
{ build => $build, prevBuild => getPreviousBuild($build)
|
2013-05-09 14:23:15 +02:00
|
|
|
|
, dependents => [grep { $_->id != $build->id } @builds]
|
2014-11-19 14:44:04 +01:00
|
|
|
|
, baseurl => getBaseUrl($self->{config})
|
2013-05-09 14:23:15 +02:00
|
|
|
|
, showJobName => \&showJobName, showStatus => \&showStatus
|
2019-08-13 17:42:19 +02:00
|
|
|
|
, showSystem => index($build->get_column('job'), $build->system) == -1
|
2013-10-07 11:13:37 -04:00
|
|
|
|
, nrCommits => $nrCommits
|
|
|
|
|
, authorList => $authorList
|
2013-05-09 14:23:15 +02:00
|
|
|
|
};
|
2013-05-09 11:39:58 +02:00
|
|
|
|
|
2013-05-09 14:23:15 +02:00
|
|
|
|
my $body;
|
|
|
|
|
$tt->process(\$template, $vars, \$body)
|
|
|
|
|
or die "failed to generate email from template";
|
2013-05-09 11:39:58 +02:00
|
|
|
|
|
2013-05-09 14:23:15 +02:00
|
|
|
|
# stripping trailing spaces from lines
|
|
|
|
|
$body =~ s/[\ ]+$//gm;
|
2013-05-09 11:39:58 +02:00
|
|
|
|
|
2014-11-19 14:44:04 +01:00
|
|
|
|
my $subject =
|
|
|
|
|
showStatus($build) . ": Hydra job " . showJobName($build)
|
|
|
|
|
. ($vars->{showSystem} ? " on " . $build->system : "")
|
|
|
|
|
. (scalar @{$vars->{dependents}} > 0 ? " (and " . scalar @{$vars->{dependents}} . " others)" : "");
|
|
|
|
|
|
|
|
|
|
sendEmail(
|
|
|
|
|
$self->{config}, $to, $subject, $body,
|
2019-08-13 17:42:19 +02:00
|
|
|
|
[ 'X-Hydra-Project' => $build->get_column('project'),
|
|
|
|
|
, 'X-Hydra-Jobset' => $build->get_column('jobset'),
|
|
|
|
|
, 'X-Hydra-Job' => $build->get_column('job'),
|
2014-11-19 14:44:04 +01:00
|
|
|
|
, 'X-Hydra-System' => $build->system
|
|
|
|
|
]);
|
2013-05-08 17:30:30 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-08 18:34:18 +02:00
|
|
|
|
|
2013-05-08 17:30:30 +02:00
|
|
|
|
1;
|