ShipIt-Step-JenkinsCheck/lib/ShipIt/Step/JenkinsCheck.pm
package ShipIt::Step::JenkinsCheck;
use strict;
use warnings;
use base qw/ ShipIt::Step /;
use JSON qw/ decode_json /;
use LWP::UserAgent;
use Try::Tiny;
use ShipIt::Util qw/ $term /;
our $VERSION = '0.01';
sub init {
my ($self, $conf) = @_;
$self->{url} = $conf->value('JenkinsCheck.url');
$self->{jobs} = [ split /,/, $conf->value('JenkinsCheck.jobs') ];
die "No Jenkins URL specified" unless $self->{url};
die "No Jenkins jobs specified" unless @{ $self->{jobs} };
return;
}
# Is really a class method.
sub check_tests {
my ($self, $jenkins, @jobs) = @_;
my $ua = LWP::UserAgent->new();
my $response = $ua->get("$jenkins/api/json");
die $response->status_line unless $response->is_success;
my $obj = decode_json($response->decoded_content);
my %jobs = map { $_->{name} => $_->{color} } @{ $obj->{jobs} };
my @errors;
foreach my $j (@jobs) {
if (!defined($jobs{$j})) {
push @errors, "$j is not being tested by your Jenkins at $jenkins";
}
elsif ($jobs{$j} !~ /^blue|blue_anime$/) {
push @errors, "$j has status ".$jobs{$j};
}
}
return @errors;
}
sub run {
my ($self, $state) = @_;
my @results;
try {
@results = $self->check_tests($self->{url}, @{ $self->{jobs} });
}
catch {
my $err = $_;
while (1) {
my $line = $term->readline("Jenkins check failed with $err, continue build? (y/n)");
die "build aborted" if $line =~ /^n/i;
last if $line =~ /^y/i;
}
};
unless (@results) {
print "Jenkins reports all your tests to be passing.\n";
return;
}
foreach my $r (@results) {
print "$r\n";
}
while (1) {
my $line = $term->readline("Jenkins reports trouble, continue build? (y/n)");
die "build aborted" if $line =~ /^n/i;
last if $line =~ /^y/i;
}
return;
}
1;
__END__
=head1 NAME
ShipIt::Step::JenkinsCheck - Checks your package in your Jenkins CI server before building
=head1 DESCRIPTION
This step checks your project in your Jenkins server, giving you the chance to
abort if the build is currently failing.
=head1 CONFIGURATION
In .shipit config
JenkinsCheck.url = http://my.jenkins.server:8080
JenkinsCheck.jobs = job1,job2 ...
=head1 AUTHOR
Dave Lambley, E<lt>davel@state51.co.ukE<gt>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2012 by Dave Lambley
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.10.1 or,
at your option, any later version of Perl 5 you may have available.
=cut