From 956f009672679c5e5d8b152ba8b642442f8c9492 Mon Sep 17 00:00:00 2001 From: Nikola Knezevic Date: Thu, 26 Mar 2020 10:02:41 +0100 Subject: [PATCH 1/3] Add documentation for SlackNotification plugin --- src/lib/Hydra/Plugin/SlackNotification.pm | 50 ++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/lib/Hydra/Plugin/SlackNotification.pm b/src/lib/Hydra/Plugin/SlackNotification.pm index 96933c51..97810516 100644 --- a/src/lib/Hydra/Plugin/SlackNotification.pm +++ b/src/lib/Hydra/Plugin/SlackNotification.pm @@ -7,6 +7,53 @@ use LWP::UserAgent; use Hydra::Helper::CatalystUtils; use JSON; +=head1 NAME + +SlackNotification - hydra-notify plugin for sending Slack notifications about +build results + +=head1 DESCRIPTION + +This plugin reports build statuses to various Slack channels. One can configure +which builds are reported to which channels, and whether reports should be on +state change (regressions and improvements), or for each build. + +=head1 CONFIGURATION + +The module is configured using the C block in Hydra's config file. There +can be multiple such blocks in the config file, each configuring different (or +even the same) set of builds and how they report to Slack channels. + +The following entries are recognized in the C block: + +=over 4 + +=item jobs + +A pattern for job names. All builds whose job name matches this pattern will +emit a message to the designated Slack channel (see C). The pattern will +match the whole name, thus leaving this field empty will result in no +notifications being sent. To match on all builds, use C<.*>. + +=item url + +The URL to a L. + +Slack administrators have to prepare one incoming webhook for each channel. This +URL should be treated as secret, as anyone knowing the URL could post a message +to the Slack workspace (or more precisely, the channel behind it). + +=item force + +(Optional) An I indicating whether to report on every build or only on +changes in the status. If not provided, defaults to 0, that is, sending reports +only when build status changes from success to failure, and vice-versa. Any +other value results in reporting on every build. + +=back + +=cut + sub isEnabled { my ($self) = @_; return defined $self->{config}->{slack}; @@ -44,9 +91,10 @@ sub buildFinished { my $jobName = showJobName $b; foreach my $channel (@config) { - my $force = $channel->{force}; next unless $jobName =~ /^$channel->{jobs}$/; + my $force = $channel->{force}; + # If build is cancelled or aborted, do not send email. next if ! $force && ($b->buildstatus == 4 || $b->buildstatus == 3); From 986fde8888e185440da68fbd86232a52a2fa9363 Mon Sep 17 00:00:00 2001 From: Nikola Knezevic Date: Thu, 26 Mar 2020 10:42:26 +0100 Subject: [PATCH 2/3] Refactor code Extract the conditions before the loop, as they do not change due to channel definition. --- src/lib/Hydra/Plugin/SlackNotification.pm | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/lib/Hydra/Plugin/SlackNotification.pm b/src/lib/Hydra/Plugin/SlackNotification.pm index 97810516..3cd75173 100644 --- a/src/lib/Hydra/Plugin/SlackNotification.pm +++ b/src/lib/Hydra/Plugin/SlackNotification.pm @@ -87,20 +87,24 @@ sub buildFinished { # we send one aggregate message. my %channels; foreach my $b ($build, @{$dependents}) { - my $prevBuild = getPreviousBuild($b); my $jobName = showJobName $b; + my $buildStatus = $b->buildstatus; + my $cancelledOrAborted = $buildStatus == 4 || $buildStatus == 3; + + my $prevBuild = getPreviousBuild($b); + my $sameAsPrevious = defined $prevBuild && ($buildStatus == $prevBuild->buildstatus); foreach my $channel (@config) { next unless $jobName =~ /^$channel->{jobs}$/; my $force = $channel->{force}; - # If build is cancelled or aborted, do not send email. - next if ! $force && ($b->buildstatus == 4 || $b->buildstatus == 3); + # If build is cancelled or aborted, do not send Slack notification. + next if ! $force && $cancelledOrAborted; # If there is a previous (that is not cancelled or aborted) build - # with same buildstatus, do not send email. - next if ! $force && defined $prevBuild && ($b->buildstatus == $prevBuild->buildstatus); + # with same buildstatus, do not send Slack notification. + next if ! $force && $sameAsPrevious; $channels{$channel->{url}} //= { channel => $channel, builds => [] }; push @{$channels{$channel->{url}}->{builds}}, $b; From 1bee6e3d8a9c22a84f6b1d7590c14f59c8262110 Mon Sep 17 00:00:00 2001 From: Nikola Knezevic Date: Thu, 26 Mar 2020 10:43:17 +0100 Subject: [PATCH 3/3] Add debug logging This will help us track potential problems with the plugin. --- src/lib/Hydra/Plugin/SlackNotification.pm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/lib/Hydra/Plugin/SlackNotification.pm b/src/lib/Hydra/Plugin/SlackNotification.pm index 3cd75173..a09fbe03 100644 --- a/src/lib/Hydra/Plugin/SlackNotification.pm +++ b/src/lib/Hydra/Plugin/SlackNotification.pm @@ -93,12 +93,18 @@ sub buildFinished { my $prevBuild = getPreviousBuild($b); my $sameAsPrevious = defined $prevBuild && ($buildStatus == $prevBuild->buildstatus); + my $prevBuildStatus = (defined $prevBuild) ? $prevBuild->buildstatus : -1; + my $prevBuildId = (defined $prevBuild) ? $prevBuild->id : -1; + + print STDERR "SlackNotification_Debug job name $jobName status $buildStatus (previous: $prevBuildStatus from $prevBuildId)\n"; foreach my $channel (@config) { next unless $jobName =~ /^$channel->{jobs}$/; my $force = $channel->{force}; + print STDERR "SlackNotification_Debug found match with '$channel->{jobs}' with force=$force\n"; + # If build is cancelled or aborted, do not send Slack notification. next if ! $force && $cancelledOrAborted; @@ -106,6 +112,7 @@ sub buildFinished { # with same buildstatus, do not send Slack notification. next if ! $force && $sameAsPrevious; + print STDERR "SlackNotification_Debug adding $jobName to the report list\n"; $channels{$channel->{url}} //= { channel => $channel, builds => [] }; push @{$channels{$channel->{url}}->{builds}}, $b; } @@ -145,6 +152,8 @@ sub buildFinished { $text .= join(" or ", scalar @x > 1 ? join(", ", @x[0..scalar @x - 2]) : (), $x[-1]); } + print STDERR "SlackNotification_Debug POSTing to url ending with: ${\substr $url, -8}\n"; + my $msg = { attachments => [{ fallback => "Job " . showJobName($build) . " build number " . $build->id . ": " . showStatus($build),