App-JenkinsCli
view release on metacpan or search on metacpan
lib/App/JenkinsCli.pm view on Meta::CPAN
package App::JenkinsCli;
# Created on: 2016-05-20 07:52:28
# Create by: Ivan Wills
# $Id$
# $Revision$, $HeadURL$, $Date$
# $Revision$, $Source$, $Date$
use Moo;
use warnings;
use Carp;
use Data::Dumper qw/Dumper/;
use English qw/ -no_match_vars /;
use Jenkins::API;
use Term::ANSIColor qw/colored/;
use File::ShareDir qw/dist_dir/;
use Path::Tiny;
use DateTime;
our $VERSION = "0.013";
has [qw/base_url api_key api_pass test/] => (
is => 'rw',
);
has jenkins => (
is => 'rw',
lazy => 1,
builder => '_jenkins',
);
has colours => (
is => 'rw',
required => 1,
);
has colour_map => (
is => 'rw',
lazy => 1,
default => sub {
my ($self) = @_;
return {
'' => ['reset'],
map {
( $_ => [ split /\s+/, $self->colours->{$_} ] )
}
keys %{ $self->colours }
};
},
);
has opt => (
is => 'rw',
required => 1,
);
sub _jenkins {
my ($self) = @_;
return Jenkins::API->new({
base_url => $self->base_url,
api_key => $self->api_key,
api_pass => $self->api_pass,
});
};
sub _alpha_num {
my $a1 = ref $a ? $a->{name} : $a;
my $b1 = ref $b ? $b->{name} : $b;
$a1 =~ s/(\d+)/sprintf "%05d", $1/egxms;
$b1 =~ s/(\d+)/sprintf "%05d", $1/egxms;
return $a1 cmp $b1;
}
sub ls { shift->list(@_) }
sub list {
my ($self, $query) = @_;
my $jenkins = $self->jenkins();
if ( ! defined $self->opt->regexp ) {
$self->opt->regexp(1);
}
lib/App/JenkinsCli.pm view on Meta::CPAN
require XML::Simple;
local $Data::Dumper::Sortkeys = 1;
local $Data::Dumper::Indent = 1;
my $data = XML::Simple::XMLin($config);
my $recipient = $self->opt->{recipient};
next if $data->{publishers}{'hudson.tasks.Mailer'}{recipients} !~ /$recipient/;
}
$self->$action();
}
return;
}
sub _ls_job {
my ($self, $jenkins, $return) = @_;
my ($max, $space) = (0, 8);
return sub {
my $name = $_->{name};
my ($extra_pre, $extra_post) = ('') x 2;
if ( ! $_->{color} ) {
$_->{color} = '';
}
elsif ( $_->{color} =~ s/_anime// ) {
$extra_pre = '*';
}
if ( $self->opt->{verbose} ) {
eval {
my $details = $jenkins->_json_api(
['job', $_->{name}, qw/api json/],
{
extra_params => {
depth => 1,
tree => 'lastBuild[timestamp,displayName,builtOn,duration]'
}
}
);
my $duration = 'Never run';
if ( $details->{lastBuild}{duration} ) {
$duration = $details->{lastBuild}{duration} / 1_000;
if ( $duration > 2 * 60 * 60 ) {
$duration = int($duration / 60 / 60) . ' hrs';
}
elsif ( $duration >= 60 * 60 ) {
$duration = '1 hr ' . (int( ($duration - 60 * 60) / 60 )) . ' min';
}
elsif ( $duration > 2 * 60 ) {
$duration = int($duration / 60 ) . ' min';
}
elsif ( $duration >= 60 ) {
$duration = '1 min ' . ($duration - 60) . ' sec';
}
else {
$duration .= ' sec';
}
}
$extra_post .= DateTime->from_epoch( epoch => ( $details->{lastBuild}{timestamp} || 0 ) / 1000 );
if ( $details->{lastBuild}{displayName} && $details->{lastBuild}{builtOn} ) {
$extra_post .= " ($duration / $details->{lastBuild}{displayName} / $details->{lastBuild}{builtOn})";
}
else {
$extra_post .= " Never run";
}
1;
} or do {
warn "Error getting job $_->{name}'s details: $@\n";
};
$name = $self->base_url . 'job/' . $name;
}
# map "jenkins" colours to real colours
my $color = $self->colour_map->{$_->{color}} || [$_->{color}];
if ( !$max ) {
$max = $space + length $name . " $extra_pre";
}
elsif ( length $name > $max ) {
$max = $space + length $name . " $extra_pre";
$space -= 2 if $space > 2;
}
my $out = $self->opt->{color}
? colored($color, sprintf "% -${max}s", "$name $extra_pre") . " $extra_post\n"
: sprintf("% -${max}s", "$name $extra_pre") . " $extra_post\n";
if ( $self->opt->{long} ) {
$out = "$_->{color} $out";
}
if ($return) {
return $out;
}
print $out;
};
}
sub _error {
my ($msg) = @_;
warn $msg;
exit 1;
}
1;
__END__
=head1 NAME
App::JenkinsCli - Command line tool for interacting with Jenkins
=head1 VERSION
This documentation refers to App::JenkinsCli version 0.013
=head1 SYNOPSIS
( run in 0.605 second using v1.01-cache-2.11-cpan-63c85eba8c4 )