summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJonathan "Duke" Leto <jonathan@leto.net>2011-02-04 17:55:13 -0800
committerJonathan "Duke" Leto <jonathan@leto.net>2011-02-04 17:55:13 -0800
commit7e3bee05bb1abcae98b2a715edc6ea49c1dae9f6 (patch)
tree459d5494a01bb5404c4940f9b16c5c50b8ee5979 /lib
parentUse a stringified version object, because it is prettier (diff)
downloadjitterbug-runner.tar.gz
The start of factoring out a runner from a builderrunner
Diffstat (limited to 'lib')
-rw-r--r--lib/jitterbug/Builder.pm183
-rw-r--r--lib/jitterbug/Runner.pm165
2 files changed, 218 insertions, 130 deletions
diff --git a/lib/jitterbug/Builder.pm b/lib/jitterbug/Builder.pm
index 6441c0d..15d94ec 100644
--- a/lib/jitterbug/Builder.pm
+++ b/lib/jitterbug/Builder.pm
@@ -11,6 +11,7 @@ use Getopt::Long qw/:config no_ignore_case/;
use File::Basename;
use Git::Repository;
use jitterbug::Schema;
+use Cwd;
#use Data::Dumper;
local $| = 1;
@@ -19,144 +20,66 @@ use constant DEBUG => 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};
-
- die "Does not exist!: " . $self->{'configfile'} unless -e $self->{'configfile'};
+ $self->{'conf'} = LoadFile(shift);
return $self;
}
-sub debug {
- warn @_ if DEBUG;
-}
-
-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'};
-
- debug("Loaded config file: " . $self->{'configfile'});
- debug("Connection Info: " . join ':', @{ $dbix_conf->{'connect_info'} });
-
- $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;
-
- while (1) {
- my @tasks = $self->{'schema'}->resultset('Task')->all();
- debug("Found " . scalar(@tasks) . " tasks");
-
- foreach my $task (@tasks) {
- $task ? $self->run_task($task) : $self->sleep;
+ my ($self, $conf) = @_;
+ my ($builddir, $report_path, $perlbrew);
+
+ print "Creating report_path=$report_path\n";
+ system("mkdir -p $report_path");
+
+ die "Couldn't create $builddir !" unless -e $builddir;
+ my $cwd = getcwd;
+ chdir $builddir;
+
+ if ($perlbrew) {
+ my $source_perlbrew = "source $ENV{HOME}/perl5/perlbrew/etc/bashrc";
+ for my $perl ( glob "$ENV{HOME}/perl5/perlbrew/perls/perl-5.*" ) {
+ my $logfile = "$report_path/$perl.txt";
+ system("$source_perlbrew && perlbrew switch $perl");
+ $self->actually_build($logfile);
}
-
- $self->{'cron'} and return 0;
-
- $self->sleep(5);
+ } else {
+ my $perl = $^V;
+ my $logfile = "$report_path/$perl.txt";
+ $self->actually_build($logfile);
}
-
- return 1;
+ chdir $cwd;
}
-sub sleep {
- my ($self, $interval) = @_;
- $interval ||= $self->{'interval'};
- debug("sleeping for $interval seconds\n");
- sleep $interval;
-}
-
-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();
- debug("Build Start");
-
- 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,
- );
-
- debug("Removing $build_dir");
- rmtree($build_dir, { error => \my $err } );
- warn @$err if @$err;
-
- $self->sleep(1); # avoid race conditions
-
- my $repo = $task->project->url . '.git';
- my $r = Git::Repository->create( clone => $repo => $build_dir );
-
- debug("Checking out " . $task->commit->sha256 . " from $repo into $build_dir\n");
- $r->run( 'checkout', $task->commit->sha256 );
-
- my $builder = $conf->{'jitterbug'}{'build_process'}{'builder'};
-
- 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`;
- debug($res);
-
- $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'};
- my $failure_cmd = "$on_failure $commiter $message $output $sha";
- debug("Running failure command: $failure_cmd");
- `$failure_cmd`;
- }
- $desc->{'build'}{'version'}{$name} = $result;
- close $fh;
+sub actually_build () {
+ my ($self, $logfile) = @_;
+ if ( -e 'dist.ini' ) {
+ print "Found dist.ini, using Dist::Zilla\n";
+ my $cmd = <<CMD;
+dzil authordeps | cpanm
+cpanm --installdeps .
+HARNESS_VERBOSE=1 dzil test >> $logfile 2>&1
+CMD
+ system $cmd;
+ } elsif ( -e 'Build.PL' ) {
+ print "Found Build.PL, using Build.PL\n";
+ my $cmd = <<CMD;
+perl Build.PL
+# ./Build installdeps is not available in older Module::Build's
+cpanm --installdeps .
+HARNESS_VERBOSE=1 ./Build test --verbose >> $logfile 2>&1
+CMD
+ system $cmd;
+ } elsif ( -e 'Makefile.PL') {
+ print "Hoping to find Makefile.PL\n";
+ my $cmd = <<CMD;
+ perl Makefile.PL
+ cpanm --installdeps .
+ make
+ HARNESS_VERBOSE=1 make test >> $logfile 2>&1
+CMD
+ system($cmd);
+ } else {
+ die "Don't know how to build or test this!";
}
-
- $task->commit->update( {
- content => JSON::encode_json($desc),
- } );
- debug("Task completed for " . $task->commit->sha256 . "\n");
-
- $task->delete();
-
- debug("Task removed from " . $task->project->name . "\n");
}
-
diff --git a/lib/jitterbug/Runner.pm b/lib/jitterbug/Runner.pm
new file mode 100644
index 0000000..25e6850
--- /dev/null
+++ b/lib/jitterbug/Runner.pm
@@ -0,0 +1,165 @@
+package jitterbug::Runner;
+
+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;
+#use Data::Dumper;
+
+local $| = 1;
+use constant DEBUG => 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};
+
+ die "Does not exist!: " . $self->{'configfile'} unless -e $self->{'configfile'};
+
+ return $self;
+}
+
+sub debug {
+ warn @_ if DEBUG;
+}
+
+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'};
+
+ debug("Loaded config file: " . $self->{'configfile'});
+ debug("Connection Info: " . join ':', @{ $dbix_conf->{'connect_info'} });
+
+ $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;
+
+ while (1) {
+ my @tasks = $self->{'schema'}->resultset('Task')->all();
+ debug("Found " . scalar(@tasks) . " tasks");
+
+ foreach my $task (@tasks) {
+ $task ? $self->run_task($task) : $self->sleep;
+ }
+
+ $self->{'cron'} and return 0;
+
+ $self->sleep(5);
+ }
+
+ return 1;
+}
+
+sub sleep {
+ my ($self, $interval) = @_;
+ $interval ||= $self->{'interval'};
+ debug("sleeping for $interval seconds\n");
+ sleep $interval;
+}
+
+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();
+ debug("Build Start");
+
+ 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,
+ );
+
+ debug("Removing $build_dir");
+ rmtree($build_dir, { error => \my $err } );
+ warn @$err if @$err;
+
+ $self->sleep(1); # avoid race conditions
+
+ my $repo = $task->project->url . '.git';
+ my $r = Git::Repository->create( clone => $repo => $build_dir );
+
+ debug("Checking out " . $task->commit->sha256 . " from $repo into $build_dir\n");
+ $r->run( 'checkout', $task->commit->sha256 );
+
+ my $builder = $conf->{'jitterbug'}{'build_process'}{'builder'};
+
+ my $perlbrew = $conf->{'options'}{'perlbrew'};
+
+ my $builder_command = "$builder $build_dir $report_path $perlbrew";
+
+ debug("Going to run builder : $builder_command");
+ my $res = `$builder_command`;
+ debug($res);
+ my $runner = jitterbug::Runner->new($conf);
+
+ $runner->build;
+
+ $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'};
+ my $failure_cmd = "$on_failure $commiter $message $output $sha";
+ debug("Running failure command: $failure_cmd");
+ `$failure_cmd`;
+ }
+ $desc->{'build'}{'version'}{$name} = $result;
+ close $fh;
+ }
+
+ $task->commit->update( {
+ content => JSON::encode_json($desc),
+ } );
+ debug("Task completed for " . $task->commit->sha256 . "\n");
+
+ $task->delete();
+
+ debug("Task removed from " . $task->project->name . "\n");
+}
+