diff options
author | franck cuny <franck@lumberjaph.net> | 2011-02-13 16:20:46 +0100 |
---|---|---|
committer | franck cuny <franck@lumberjaph.net> | 2011-02-13 16:20:46 +0100 |
commit | 7ba102a0b05decfeb046e541d0f76902a071e9d7 (patch) | |
tree | 898fd14726300d335cdaa11d38b2de868d3eb29d /lib | |
parent | resolve merge conflict (diff) | |
parent | add more tests (diff) | |
download | jitterbug-7ba102a0b05decfeb046e541d0f76902a071e9d7.tar.gz |
Merge branch 'feature/stack_builds' into devel devel
* feature/stack_builds: add more tests inside the hook, we check if we can add more than one task for this project add configuration option to skip some branches; add tests for the Hook that's why we want datetime use DateTime
Diffstat (limited to '')
-rw-r--r-- | lib/jitterbug/Builder.pm | 5 | ||||
-rw-r--r-- | lib/jitterbug/Hook.pm | 125 | ||||
-rw-r--r-- | lib/jitterbug/Schema.pm | 2 | ||||
-rw-r--r-- | lib/jitterbug/Schema/Result/Task.pm | 1 |
4 files changed, 100 insertions, 33 deletions
diff --git a/lib/jitterbug/Builder.pm b/lib/jitterbug/Builder.pm index a836f70..1f201e2 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 f47d7e9..c671d78 100644 --- a/lib/jitterbug/Schema.pm +++ b/lib/jitterbug/Schema.pm @@ -1,7 +1,7 @@ package jitterbug::Schema; use base qw/DBIx::Class::Schema/; -our $VERSION = '3'; +our $VERSION = '4'; __PACKAGE__->load_namespaces(); diff --git a/lib/jitterbug/Schema/Result/Task.pm b/lib/jitterbug/Schema/Result/Task.pm index 2eaed62..ad880d8 100644 --- a/lib/jitterbug/Schema/Result/Task.pm +++ b/lib/jitterbug/Schema/Result/Task.pm @@ -25,7 +25,6 @@ __PACKAGE__->add_columns( ); __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', |