diff options
-rw-r--r-- | lib/jitterbug/Builder.pm | 124 | ||||
-rw-r--r-- | scripts/builder.pl | 77 |
2 files changed, 127 insertions, 74 deletions
diff --git a/lib/jitterbug/Builder.pm b/lib/jitterbug/Builder.pm new file mode 100644 index 0000000..9eebe8b --- /dev/null +++ b/lib/jitterbug/Builder.pm @@ -0,0 +1,124 @@ +package jitterbug::Builder; + +use strict; +use warnings; + +use YAML qw/LoadFile Dump/; +use JSON; +use File::Path qw/rmtree/; +use Path::Class; +use Getopt::Long qw/:config no_ignore_case/; +use File::Basename; +use Git::Repository; +use jitterbug::Schema; + +local $| = 1; + +sub new { + my $self = bless {} => shift; + + GetOptions( + 'C|cron' => \$self->{'cron'}, + 'c|configfile=s' => \$self->{'configfile'}, + 's|sleep=i' => \$self->{'sleep'}, + ) or die "Cannot get options\n"; + + $self->{'configfile'} + or die qq{missing config.yml, use "-c config.yml" to help us find it\n}; + + return $self; +} + +sub run { + my $self = shift || die "Must call run() from object\n"; + my $conf = $self->{'conf'} = LoadFile( $self->{'configfile'} ); + my $dbix_conf = $conf->{'plugins'}{'DBIC'}{'schema'}; + + $self->{'schema'} = jitterbug::Schema->connect( @{ $dbix_conf->{'connect_info'} } ); + $self->{'interval'} = $self->{'sleep'} || + $conf->{'jitterbug'}{'builder'}{'sleep'} || + 30; + + return $self->build; +} + +sub build { + my $self = shift; + my @tasks = $self->{'schema'}->resultset('Task')->all(); + + while (1) { + foreach my $task (@tasks) { + $task ? $self->run_task($task) : sleep $self->{'interval'}; + } + + $self->{'cron'} and return 0; + + warn "done\n"; + sleep 5; + } + + return 1; +} + +sub run_task { + my $self = shift; + my ($task) = @_; + my $desc = JSON::decode_json( $task->commit->content ); + my $conf = $self->{'conf'}; + + $desc->{'build'}{'start_time'} = time(); + + my $report_path = dir( + $conf->{'jitterbug'}{'reports'}{'dir'}, + $task->project->name, + $task->commit->sha256, + ); + + my $build_dir = dir( + $conf->{'jitterbug'}{'build'}{'dir'}, + $task->project->name, + ); + + my $repo = $task->project->url . '.git'; + my $r = Git::Repository->create( clone => $repo => $build_dir ); + $r->run( 'checkout', $task->commit->sha256 ); + + my $builder = $conf->{'jitterbug'}{'build_process'}{'builder'}; + my $res = `$builder $build_dir $report_path`; + + rmtree($build_dir); + + $desc->{'build'}{'end_time'} = time(); + + my @versions = glob( $report_path . '/*' ); + foreach my $version (@versions) { + open my $fh, '<', $version; + my ($result, $lines); + while (<$fh>){ + $lines .= $_; + } + ($result) = $lines =~ /Result:\s(\w+)/; + my ( $name, ) = basename($version); + $name =~ s/\.txt//; + if ( !$result || ($result && $result !~ /PASS/ )) { + # mail author of the commit + $result = "FAIL"; + my $message = $desc->{'message'}; + my $commiter = $desc->{'author'}{'email'}; + my $output = "Build failed"; + my $sha = $desc->{'id'}; + my $on_failure = + $conf->{'jitterbug'}{'build_process'}{'on_failure'}; + `$on_failure $commiter $message $output $sha`; + } + $desc->{'build'}{'version'}{$name} = $result; + close $fh; + } + + $task->commit->update( { + content => JSON::encode_json($desc), + } ); + + $task->delete(); +} + diff --git a/scripts/builder.pl b/scripts/builder.pl index fba8147..8b7ee2c 100644 --- a/scripts/builder.pl +++ b/scripts/builder.pl @@ -1,80 +1,9 @@ -#!/usr/bin/env perl +#!/usr/bin/perl use strict; use warnings; -use JSON; -use YAML qw/LoadFile Dump/; -use File::Spec; -use File::Path qw/rmtree/; -use File::Basename; -use Git::Repository; -use jitterbug::Schema; +use jitterbug::Builder; -$|++; +exit jitterbug::Builder->new->run; -my $conf_file = shift || die "config.yml is missing"; -my $conf = LoadFile($conf_file); -my $dbix_conf = $conf->{plugins}->{DBIC}->{schema}; -my $schema = jitterbug::Schema->connect( @{ $dbix_conf->{connect_info} } ); -my $interval = $conf->{jitterbug}->{builder}->{sleep} || 30; - -while (1) { - my $task = $schema->resultset('Task')->search()->single(); - - unless ($task) { - sleep $interval; - next; - } - - my $desc = JSON::decode_json($task->commit->content); - $desc->{build}->{start_time} = time(); - - my $report_path = File::Spec->catdir( $conf->{jitterbug}->{reports}->{dir}, - $task->project->name, $task->commit->sha256 ); - my $build_dir = File::Spec->catdir( $conf->{jitterbug}->{build}->{dir}, - $task->project->name ); - - my $repo = $task->project->url . '.git'; - my $r = Git::Repository->create( clone => $repo => $build_dir ); - $r->run( 'checkout', $task->commit->sha256 ); - - my $builder = $conf->{jitterbug}->{build_process}->{builder}; - my $res = `$builder $build_dir $report_path`; - - rmtree($build_dir); - - $desc->{build}->{end_time} = time(); - - my @versions = glob( $report_path . '/*' ); - foreach my $version (@versions) { - open my $fh, '<', $version; - my ($result, $lines); - while (<$fh>){ - $lines .= $_; - } - ($result) = $lines =~ /Result:\s(\w+)/; - my ( $name, ) = basename($version); - $name =~ s/\.txt//; - if ( !$result || ($result && $result !~ /PASS/ )) { - # mail author of the commit - $result = "FAIL"; - my $message = $desc->{message}; - my $commiter = $desc->{author}->{email}; - my $output = "Build failed"; - my $sha = $desc->{id}; - my $on_failure = - $conf->{jitterbug}->{build_process}->{on_failure}; - `$on_failure $commiter $message $output $sha`; - } - $desc->{build}->{version}->{$name} = $result; - close $fh; - } - - $task->commit->update({ - content => JSON::encode_json($desc), - }); - $task->delete(); - warn "done\n"; - sleep 5; -} |