about summary refs log tree commit diff
path: root/scripts/builder.pl
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--scripts/builder.pl113
1 files changed, 52 insertions, 61 deletions
diff --git a/scripts/builder.pl b/scripts/builder.pl
index e8fa87d..646037a 100644
--- a/scripts/builder.pl
+++ b/scripts/builder.pl
@@ -3,87 +3,78 @@
 use strict;
 use warnings;
 
-use Redis;
 use JSON;
 use YAML qw/LoadFile Dump/;
 use File::Spec;
 use File::Path qw/rmtree/;
 use File::Basename;
 use Git::Repository;
+use jitterbug::Schema;
 
 $|++;
 
-my $conf  = LoadFile('config.yml');
-my $redis = Redis->new( server => $conf->{redis} );
-my $key   = join( ':', 'jitterbug', 'tasks' );
+my $conf      = LoadFile('config.yml');
+my $dbix_conf = $conf->{plugins}->{DBIC}->{schema};
+my $schema =
+  jitterbug::Schema->connect( $dbix_conf->{dsn}, $dbix_conf->{user},
+    $dbix_conf->{pass} );
 
 while (1) {
-    my $task_key = $redis->spop($key);
-    if ($task_key) {
-        my $task    = $redis->get($task_key);
-        my $desc    = JSON::decode_json($task);
-        my $repo    = $desc->{repo} . '.git';
-        my $commit  = delete $desc->{id};
-        my $project = delete $desc->{project};
+    my $task = $schema->resultset('Task')->search()->single();
 
-        my $report_path =
-          File::Spec->catdir( $conf->{jitterbug}->{reports}->{dir},
-            $project, $commit );
-
-        my $build_dir =
-          File::Spec->catdir( $conf->{jitterbug}->{build}->{dir}, $project );
+    unless ($task) {
+        sleep 5;
+        next;
+    }
 
-        my $r = Git::Repository->create( clone => $repo => $build_dir );
-        $r->run( 'checkout', $commit );
+    my $desc    = JSON::decode_json($task->commit->content);
+    $desc->{build}->{start_time} = time();
 
-        my $builder = $conf->{jitterbug}->{build_process}->{builder};
-        my $res     = `$builder $build_dir $report_path`;
+    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 );
 
-        rmtree($build_dir);
+    my $repo    = $task->project->url . '.git';
+    my $r = Git::Repository->create( clone => $repo => $build_dir );
+    $r->run( 'checkout', $task->commit->sha256 );
 
-        $redis->del($task_key);
+    my $builder = $conf->{jitterbug}->{build_process}->{builder};
+    my $res     = `$builder $build_dir $report_path`;
 
-        my $build = {
-            project => $project,
-            repo    => $repo,
-            commit  => $commit,
-            time    => time(),
-            %$desc,
-        };
+    rmtree($build_dir);
 
-        my @versions = glob( $report_path . '/*' );
-        foreach my $version (@versions) {
-            open my $fh, '<', $version;
-            my @lines  = <$fh>;
-            my $result = pop @lines;
-            while ( $result !~ /^Result/ ) {
-                $result = pop @lines;
-            }
-            chomp $result;
-            $result =~ s/Result:\s//;
-            my ( $name, ) = basename($version);
-            $name =~ s/\.txt//;
-            if ( $result !~ /PASS/ ) {
+    $desc->{build}->{end_time} = time();
 
-                # mail author of the commit
-                my $message  = $desc->{message};
-                my $commiter = $desc->{author}->{email};
-                my $output   = "Build failed";
-                my $sha      = $desc->{commit};
-                my $on_failure =
-                  $conf->{jitterbug}->{build_process}->{on_failure};
-                `$on_failure $commiter $message $output $sha`;
-            }
-            $build->{version}->{$name} = $result;
-            close $fh;
+    my @versions = glob( $report_path . '/*' );
+    foreach my $version (@versions) {
+        open my $fh, '<', $version;
+        my ($result, $lines);
+        while (<$fh>){
+            $lines .= $_;
         }
-
-        my $build_key = join( ':', 'jitterbug', 'build', $commit );
-        $redis->set( $build_key, JSON::encode_json($build) );
-
-        my $project_build = join( ':', 'jitterbug', 'builds', $project );
-        $redis->sadd( $project_build, $build_key );
-        warn "done, next\n";
+        ($result) = $lines =~ /^Result:\s(.*)$/;
+        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;
 }