From 45605291eff0216a8d0b4e1d22dde4a3d69cbb15 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Mon, 24 Jan 2011 20:53:24 +0100 Subject: load tasks and display them on the dashboard --- lib/jitterbug.pm | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/jitterbug.pm b/lib/jitterbug.pm index c876cb6..2da9e09 100644 --- a/lib/jitterbug.pm +++ b/lib/jitterbug.pm @@ -9,9 +9,16 @@ 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 }; +}; + +sub _get_projects { my @projects = (); @@ -41,7 +48,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; -- cgit v1.2.3 From cfdb6f235e3b32541a1743c47fbfe17c957116d2 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Mon, 24 Jan 2011 20:53:54 +0100 Subject: add pending status to the schema (TODO: need a script to migrate the schema) --- lib/jitterbug/Schema/Result/Task.pm | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'lib') diff --git a/lib/jitterbug/Schema/Result/Task.pm b/lib/jitterbug/Schema/Result/Task.pm index e63e101..331deb4 100644 --- a/lib/jitterbug/Schema/Result/Task.pm +++ b/lib/jitterbug/Schema/Result/Task.pm @@ -12,6 +12,10 @@ __PACKAGE__->add_columns( data_type => 'int', is_foreign_key => 1, }, + running => { + data_type => 'bool', + default_value => 0, + }, ); __PACKAGE__->set_primary_key('taskid'); -- cgit v1.2.3 From 7b63d950c4dd122777fcd8a1aab9b01f3d46208f Mon Sep 17 00:00:00 2001 From: franck cuny Date: Mon, 24 Jan 2011 20:54:06 +0100 Subject: we want a find, not a search here --- lib/jitterbug/Task.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') 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); -- cgit v1.2.3 From 672eac1ffb7aaf62c651ee63cf069c8826dfca41 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Mon, 24 Jan 2011 21:29:11 +0100 Subject: add version to our schema --- lib/jitterbug/Schema.pm | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib') diff --git a/lib/jitterbug/Schema.pm b/lib/jitterbug/Schema.pm index 5014c12..5b42275 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 = '2'; + __PACKAGE__->load_namespaces(); 1; -- cgit v1.2.3 From 696b319385daa88837af21de1b3a2a3c3c3619ea Mon Sep 17 00:00:00 2001 From: franck cuny Date: Mon, 24 Jan 2011 21:46:43 +0100 Subject: display current build if any --- lib/jitterbug.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/jitterbug.pm b/lib/jitterbug.pm index 2da9e09..1bf3aab 100644 --- a/lib/jitterbug.pm +++ b/lib/jitterbug.pm @@ -15,7 +15,8 @@ get '/' => sub { my $projects = _get_projects(); my ( $builds, $runnings ) = _get_builds(); - template 'index', { projects => $projects, builds => $builds }; + template 'index', + { projects => $projects, builds => $builds, runnings => $runnings }; }; sub _get_projects { -- cgit v1.2.3 From 207eb36a76f53e35fbbbb9ef5f5ed7e1ddae8c59 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Sun, 13 Feb 2011 13:56:53 +0100 Subject: prepare to update schema again --- lib/jitterbug/Schema.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/jitterbug/Schema.pm b/lib/jitterbug/Schema.pm index 5b42275..f47d7e9 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 = '2'; +our $VERSION = '3'; __PACKAGE__->load_namespaces(); -- cgit v1.2.3 From afca829e55239b89a195c1035e8e5b40ca86e011 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Sun, 13 Feb 2011 13:57:13 +0100 Subject: column started_when: datetime when the build started --- lib/jitterbug/Schema/Result/Task.pm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/jitterbug/Schema/Result/Task.pm b/lib/jitterbug/Schema/Result/Task.pm index 331deb4..2eaed62 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', @@ -13,8 +14,13 @@ __PACKAGE__->add_columns( is_foreign_key => 1, }, running => { - data_type => 'bool', - default_value => 0, + data_type => 'bool', + default_value => 0, + }, + started_when => { + data_type => 'datetime', + is_nullable => 1, + datetime_undef_if_invalid => 1 }, ); -- cgit v1.2.3 From b0957451e9763bc5bde74de5556d54619897d292 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Sun, 13 Feb 2011 14:22:44 +0100 Subject: use DateTime --- lib/jitterbug/Builder.pm | 1 + 1 file changed, 1 insertion(+) (limited to 'lib') diff --git a/lib/jitterbug/Builder.pm b/lib/jitterbug/Builder.pm index a836f70..e2d97e7 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/; -- cgit v1.2.3 From 75ee0947cd6eb427dd5dad728276483305aeb668 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Sun, 13 Feb 2011 14:25:17 +0100 Subject: that's why we want datetime --- lib/jitterbug/Builder.pm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/jitterbug/Builder.pm b/lib/jitterbug/Builder.pm index e2d97e7..1f201e2 100644 --- a/lib/jitterbug/Builder.pm +++ b/lib/jitterbug/Builder.pm @@ -86,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( -- cgit v1.2.3 From 6e662082746507eadd10ec8bcd870a770c777134 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Sun, 13 Feb 2011 15:54:10 +0100 Subject: add configuration option to skip some branches; add tests for the Hook --- lib/jitterbug/Hook.pm | 111 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 80 insertions(+), 31 deletions(-) (limited to 'lib') diff --git a/lib/jitterbug/Hook.pm b/lib/jitterbug/Hook.pm index 87cfba2..bf483d5 100644 --- a/lib/jitterbug/Hook.pm +++ b/lib/jitterbug/Hook.pm @@ -19,45 +19,91 @@ post '/' => sub { $payload = from_json($payload); my $repo = $payload->{repository}->{name}; + my $ref = $payload->{ref}; + + my $authorized = _authorized_branch( $repo, $ref ); + if ( !$authorized ) { + debug("this branch is not authorized"); + status 200; + return; + } my $project = schema->resultset('Project')->find( { name => $repo } ); - 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($_); - }; - } + $project = _create_new_project($repo, $payload) if !$project; my $last_commit = pop @{ $payload->{commits} }; $last_commit->{compare} = $payload->{compare}; $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 _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 +112,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; -- cgit v1.2.3 From e03879fe743957c24949000d078f4ffe0d2ef02c Mon Sep 17 00:00:00 2001 From: franck cuny Date: Sun, 13 Feb 2011 16:20:09 +0100 Subject: inside the hook, we check if we can add more than one task for this project the schema is updated to remove the constraint --- lib/jitterbug/Hook.pm | 22 +++++++++++++++++++--- lib/jitterbug/Schema.pm | 2 +- lib/jitterbug/Schema/Result/Task.pm | 1 - 3 files changed, 20 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/jitterbug/Hook.pm b/lib/jitterbug/Hook.pm index bf483d5..fe27921 100644 --- a/lib/jitterbug/Hook.pm +++ b/lib/jitterbug/Hook.pm @@ -21,16 +21,20 @@ post '/' => sub { my $repo = $payload->{repository}->{name}; my $ref = $payload->{ref}; - my $authorized = _authorized_branch( $repo, $ref ); - if ( !$authorized ) { + 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; - $project = _create_new_project($repo, $payload) if !$project; + if ( !_slot_available_for_task( $project->id ) ) { + debug("task already present for this project"); + status 200; + return; + } my $last_commit = pop @{ $payload->{commits} }; $last_commit->{compare} = $payload->{compare}; @@ -92,6 +96,18 @@ sub _create_new_project { 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) = @_; 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', -- cgit v1.2.3