summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/jitterbug.pm32
-rw-r--r--lib/jitterbug/Builder.pm5
-rw-r--r--lib/jitterbug/Hook.pm125
-rw-r--r--lib/jitterbug/Schema.pm2
-rw-r--r--lib/jitterbug/Schema/Result/Task.pm11
-rw-r--r--lib/jitterbug/Task.pm2
6 files changed, 141 insertions, 36 deletions
diff --git a/lib/jitterbug.pm b/lib/jitterbug.pm
index c876cb6..1bf3aab 100644
--- a/lib/jitterbug.pm
+++ b/lib/jitterbug.pm
@@ -9,9 +9,17 @@ our $VERSION = '0.1';
load_app 'jitterbug::Hook', prefix => '/hook';
load_app 'jitterbug::Project', prefix => '/project';
load_app 'jitterbug::WebService', prefix => '/api';
-#load_app 'jitterbug::Task', prefix => '/task';
+load_app 'jitterbug::Task', prefix => '/task';
get '/' => sub {
+ my $projects = _get_projects();
+ my ( $builds, $runnings ) = _get_builds();
+
+ template 'index',
+ { projects => $projects, builds => $builds, runnings => $runnings };
+};
+
+sub _get_projects {
my @projects = ();
@@ -41,7 +49,25 @@ get '/' => sub {
sort { $b->{last_build}->{timestamp} cmp $a->{last_build}->{timestamp} }
@projects;
- template 'index', {projects => \@projects};
-};
+ return \@projects;
+}
+
+sub _get_builds {
+
+ my @builds = ();
+ my @runnings = ();
+
+ my $builds = schema->resultset('Task')->search();
+ while ( my $build = $builds->next ) {
+ my $build_desc = {
+ project => $build->project->name,
+ id => $build->id,
+ running => $build->running,
+ };
+ $build->running ? push @runnings, $build_desc : push @builds,
+ $build_desc;
+ }
+ return ( \@builds, \@runnings );
+}
true;
diff --git a/lib/jitterbug/Builder.pm b/lib/jitterbug/Builder.pm
index a5f0cbb..deb4c5b 100644
--- a/lib/jitterbug/Builder.pm
+++ b/lib/jitterbug/Builder.pm
@@ -3,6 +3,7 @@ package jitterbug::Builder;
use strict;
use warnings;
+use DateTime;
use YAML qw/LoadFile Dump/;
use JSON;
use File::Path qw/rmtree/;
@@ -85,7 +86,9 @@ sub run_task {
my $desc = JSON::decode_json( $task->commit->content );
my $conf = $self->{'conf'};
- $desc->{'build'}{'start_time'} = time();
+ my $dt = DateTime->now();
+ $task->update({started_when => $dt});
+ $desc->{'build'}{'start_time'} = $dt->epoch;
debug("Build Start");
my $report_path = dir(
diff --git a/lib/jitterbug/Hook.pm b/lib/jitterbug/Hook.pm
index 87cfba2..fe27921 100644
--- a/lib/jitterbug/Hook.pm
+++ b/lib/jitterbug/Hook.pm
@@ -19,29 +19,21 @@ post '/' => sub {
$payload = from_json($payload);
my $repo = $payload->{repository}->{name};
+ my $ref = $payload->{ref};
+
+ if ( !_authorized_branch( $repo, $ref ) ) {
+ debug("this branch is not authorized");
+ status 200;
+ return;
+ }
my $project = schema->resultset('Project')->find( { name => $repo } );
+ $project = _create_new_project( $repo, $payload ) if !$project;
- if ( !$project ) {
- debug("need to create a new project");
- try {
- schema->txn_do(
- sub {
- $project = schema->resultset('Project')->create(
- {
- name => $repo,
- url => $payload->{repository}->{url},
- description =>
- $payload->{repository}->{description},
- owner => to_json($payload->{repository}->{owner}),
- }
- );
- }
- );
- }
- catch {
- error($_);
- };
+ if ( !_slot_available_for_task( $project->id ) ) {
+ debug("task already present for this project");
+ status 200;
+ return;
}
my $last_commit = pop @{ $payload->{commits} };
@@ -49,15 +41,85 @@ post '/' => sub {
$last_commit->{pusher} = $payload->{pushed};
$last_commit->{ref} = $payload->{ref};
+ _insert_commit($last_commit, $project);
+ _insert_new_task( $last_commit, $project );
+
+ debug("hook accepted");
+
+ { updated => $repo };
+};
+
+sub _authorized_branch {
+ my ($repo, $ref) = @_;
+ my $jtbg_conf = setting 'jitterbug';
+ my $branches_conf = $jtbg_conf->{branches};
+
+ foreach my $name ($repo, 'jt_global') {
+ if ( defined $branches_conf->{$name} ) {
+ return 0 if _should_skip( $ref, $branches_conf->{$name} );
+ }
+ }
+ return 1;
+}
+
+sub _should_skip {
+ my ( $ref, $conf ) = @_;
+ foreach my $br_name (@$conf) {
+ return 1 if $ref =~ m!^refs/heads/$br_name!;
+ }
+ return 0;
+}
+
+sub _create_new_project {
+ my ($repo, $payload) = @_;
+
+ debug("need to create a new project");
+
+ my $project;
+ try {
+ schema->txn_do(
+ sub {
+ $project = schema->resultset('Project')->create(
+ {
+ name => $repo,
+ url => $payload->{repository}->{url},
+ description => $payload->{repository}->{description},
+ owner => to_json( $payload->{repository}->{owner} ),
+ }
+ );
+ }
+ );
+ }
+ catch {
+ error($_);
+ };
+ return $project;
+}
+
+sub _slot_available_for_task {
+ my $project_id = shift;
+
+ # is there already a task for this project, and could we stack ?
+ my $jtbg_settings = setting('jitterbug') || {};
+ my $stack_option = $jtbg_settings->{options}->{stack_tasks};
+ my $total_task =
+ schema->resultset('Task')->search( { projectid => $project_id } )->count;
+
+ ( $total_task && !$stack_option) ? return 0 : return 1;
+}
+
+sub _insert_commit {
+ my ($commit, $project) = @_;
+
try {
schema->txn_do(
sub {
schema->resultset('Commit')->create(
{
- sha256 => $last_commit->{id},
- content => to_json($last_commit),
+ sha256 => $commit->{id},
+ content => to_json($commit),
projectid => $project->projectid,
- timestamp => $last_commit->{timestamp},
+ timestamp => $commit->{timestamp},
}
);
}
@@ -66,22 +128,25 @@ post '/' => sub {
catch {
error($_);
};
+}
+sub _insert_new_task {
+ my ( $commit, $project ) = @_;
try {
schema->txn_do(
sub {
schema->resultset('Task')->create(
- {sha256 => $last_commit->{id}, projectid => $project->projectid}
+ {
+ sha256 => $commit->{id},
+ projectid => $project->projectid
+ }
);
}
);
- }catch{
+ }
+ catch {
error($_);
};
-
- debug("hook accepted");
-
- { updated => $repo };
-};
+}
1;
diff --git a/lib/jitterbug/Schema.pm b/lib/jitterbug/Schema.pm
index 5014c12..c671d78 100644
--- a/lib/jitterbug/Schema.pm
+++ b/lib/jitterbug/Schema.pm
@@ -1,6 +1,8 @@
package jitterbug::Schema;
use base qw/DBIx::Class::Schema/;
+our $VERSION = '4';
+
__PACKAGE__->load_namespaces();
1;
diff --git a/lib/jitterbug/Schema/Result/Task.pm b/lib/jitterbug/Schema/Result/Task.pm
index e63e101..ad880d8 100644
--- a/lib/jitterbug/Schema/Result/Task.pm
+++ b/lib/jitterbug/Schema/Result/Task.pm
@@ -2,6 +2,7 @@ package jitterbug::Schema::Result::Task;
use base qw/DBIx::Class::Core/;
__PACKAGE__->table('task');
+__PACKAGE__->load_components(qw/InflateColumn::DateTime/);
__PACKAGE__->add_columns(
taskid => {
data_type => 'int',
@@ -12,10 +13,18 @@ __PACKAGE__->add_columns(
data_type => 'int',
is_foreign_key => 1,
},
+ running => {
+ data_type => 'bool',
+ default_value => 0,
+ },
+ started_when => {
+ data_type => 'datetime',
+ is_nullable => 1,
+ datetime_undef_if_invalid => 1
+ },
);
__PACKAGE__->set_primary_key('taskid');
-__PACKAGE__->add_unique_constraint( [qw/projectid/] );
__PACKAGE__->add_unique_constraint( [qw/sha256/] );
__PACKAGE__->belongs_to(
project => 'jitterbug::Schema::Result::Project',
diff --git a/lib/jitterbug/Task.pm b/lib/jitterbug/Task.pm
index f14a9c6..998e9e4 100644
--- a/lib/jitterbug/Task.pm
+++ b/lib/jitterbug/Task.pm
@@ -7,7 +7,7 @@ use jitterbug::Plugin::Template;
get '/:task_id' => sub {
my $task_id = params->{task_id};
- my $task = schema->resultset('Task')->search($task_id);
+ my $task = schema->resultset('Task')->find($task_id);
if (!$task) {
render_error("task doesn't exists", 404);