summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJonathan "Duke" Leto <jonathan@leto.net>2011-01-19 13:04:42 -0800
committerJonathan "Duke" Leto <jonathan@leto.net>2011-01-19 13:04:42 -0800
commit05c0a17eabb8cb52535ca1ae30fcf8ce0906f5c3 (patch)
tree7a782c216051e366c215ad902571d34cf2939a17 /lib
parentAttempt to fix the mangled build failure email bug (diff)
parentFix a jitterbug::Emailer test (diff)
downloadjitterbug-05c0a17eabb8cb52535ca1ae30fcf8ce0906f5c3.tar.gz
Merge branch 'refactor_builder'
Conflicts: config.yml lib/jitterbug/Builder.pm scripts/build-failed.sh
Diffstat (limited to 'lib')
-rw-r--r--lib/jitterbug/Builder.pm20
-rw-r--r--lib/jitterbug/Emailer.pm78
2 files changed, 93 insertions, 5 deletions
diff --git a/lib/jitterbug/Builder.pm b/lib/jitterbug/Builder.pm
index 32bc51c..a836f70 100644
--- a/lib/jitterbug/Builder.pm
+++ b/lib/jitterbug/Builder.pm
@@ -113,7 +113,9 @@ sub run_task {
my $builder = $conf->{'jitterbug'}{'build_process'}{'builder'};
- my $builder_command = "$builder $build_dir $report_path";
+ my $perlbrew = $conf->{'options'}{'perlbrew'} || 1;
+
+ my $builder_command = "$builder $build_dir $report_path $perlbrew";
debug("Going to run builder : $builder_command");
my $res = `$builder_command`;
@@ -136,15 +138,23 @@ sub run_task {
$result = "FAIL";
my $message = $desc->{'message'};
my $commiter = $desc->{'author'}{'email'};
- my $output = "Build failed";
+ my $output = $lines;
my $sha = $desc->{'id'};
my $on_failure = $conf->{'jitterbug'}{'build_process'}{'on_failure'};
- my $on_failure_email = $conf->{'jitterbug'}{'build_process'}{'on_failure_email'};
+ my $on_failure_cc_email = $conf->{'jitterbug'}{'build_process'}{'on_failure_email'};
$message =~ s/'/\\'/g; $commiter =~ s/'/\\'/g; $output =~ s/'/\\'/g;
- my $failure_cmd = qq{$on_failure '$commiter' '$message' '$output' $sha $on_failure_email};
+ my $failure_cmd = sprintf("%s '%s' %s '%s' '%s' %s %s", $on_failure, $commiter, $task->project->name, $message, $output, $sha, $on_failure_cc_email);
debug("Running failure command: $failure_cmd");
- `$failure_cmd`;
+
+ # does it look like a module name?
+ if ($on_failure =~ /::/) {
+ # we should do some error checking here
+ eval "require $on_failure";
+ $on_failure->new($conf,$task,$output)->run;
+ } else {
+ system($failure_cmd);
+ }
}
$desc->{'build'}{'version'}{$name} = $result;
close $fh;
diff --git a/lib/jitterbug/Emailer.pm b/lib/jitterbug/Emailer.pm
new file mode 100644
index 0000000..d21028f
--- /dev/null
+++ b/lib/jitterbug/Emailer.pm
@@ -0,0 +1,78 @@
+package jitterbug::Emailer;
+
+use strict;
+use warnings;
+use Email::Stuff;
+use JSON;
+
+sub new {
+ my $self = bless {} => shift;
+ my ($conf,$task,$tap_output) = @_;
+ # smelly
+ $self->{'conf'} = $conf;
+ $self->{'task'} = $task;
+ $self->{'tap_output'} = $tap_output;
+
+ return $self;
+}
+
+sub _make_body {
+ my ($header, $message, $tap, $footer) = @_;
+
+ no warnings 'uninitialized';
+ return <<BODY;
+$header
+Commit Message:
+$message
+
+TAP Output:
+$tap
+$footer
+BODY
+
+}
+sub run {
+ my $self = shift;
+ my $task = $self->{'task'};
+ my $buildconf = $self->{'conf'}->{'jitterbug'}{'build_process'};
+ my $project = $task->project->name;
+ my $tap = $self->{'tap_output'};
+ my $sha1 = $task->commit->sha256;
+ my $shortsha1 = substr($sha1, 0, 8);
+ my $desc = JSON::decode_json( $task->commit->content );
+ my $email = $desc->{'author'}{'email'};
+ my $message = $desc->{'message'};
+ my $header = $buildconf->{'on_failure_header'};
+ my $footer = $buildconf->{'on_failure_footer'};
+ my $body = _make_body($header,$message, $tap, $footer);
+ my $summary = '';
+
+ if ( $tap =~ m/^(Test Summary Report.*)/ms ) {
+ $summary = $1;
+ }
+
+ # Expand placeholders in our failure email
+ $body =~ s/%%PROJECT%%/$project/g;
+ $body =~ s/%%SHA1%%/$sha1/g;
+ $body =~ s/%%SUMMARY%%/$summary/g;
+
+
+ my $stuff = Email::Stuff->from($buildconf->{'on_failure_from_email'})
+ # bug in Email::Stuff brakes chaining if $email is empty
+ ->to($email || " ")
+ ->cc($buildconf->{'on_failure_cc_email'})
+ ->text_body($body)
+ ->subject(
+ $buildconf->{'on_failure_subject_prefix'} . "$project @ $shortsha1 $message"
+ );
+ # Should we attach a build log for convenience?
+ # ->attach(io('dead_bunbun_faked.gif')->all,
+ # filename => 'dead_bunbun_proof.gif')
+ $self->{'last_email_sent'} = $stuff;
+
+ $stuff->send;
+
+ return $self;
+}
+
+1;