From 8cef7d4b42daade336cac3099b647667fa5d1585 Mon Sep 17 00:00:00 2001 From: Manager Bot Date: Tue, 1 Nov 2022 18:51:10 +0000 Subject: [PATCH] Fast media syncing. --- Web/lib/MJB/Web.pm | 9 +++++++ Web/lib/MJB/Web/Controller/Dashboard.pm | 4 ++-- Web/lib/MJB/Web/Task/SyncBlogMedia.pm | 31 +++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 Web/lib/MJB/Web/Task/SyncBlogMedia.pm diff --git a/Web/lib/MJB/Web.pm b/Web/lib/MJB/Web.pm index f9a817a..6d28ce0 100644 --- a/Web/lib/MJB/Web.pm +++ b/Web/lib/MJB/Web.pm @@ -39,6 +39,14 @@ sub startup ($self) { $blog->create_related( 'builds', { job_id => $build_job_id } ); }); + $self->helper( sync_blog_media => sub ( $c, $blog ) { + my $build_job_id = $c->minion->enqueue( 'sync_blog_media', [ $blog->id ], { + notes => { '_bid_' . $blog->id => 1 }, + priority => $blog->build_priority, + }); + $blog->create_related( 'builds', { job_id => $build_job_id } ); + }); + # Minion plugin & tasks $self->plugin( Minion => { Pg => $self->config->{database}->{minion} } ); @@ -46,6 +54,7 @@ sub startup ($self) { $self->minion->add_task( purge_blog => 'MJB::Web::Task::PurgeBlog' ); $self->minion->add_task( deploy_blog => 'MJB::Web::Task::DeployBlog' ); $self->minion->add_task( sync_blog => 'MJB::Web::Task::SyncBlog' ); + $self->minion->add_task( sync_blog_media => 'MJB::Web::Task::SyncBlogMedia' ); # SSL cert related jobs. $self->minion->add_task( create_ssl_cert => 'MJB::Web::Task::CreateSSLCert' ); diff --git a/Web/lib/MJB/Web/Controller/Dashboard.pm b/Web/lib/MJB/Web/Controller/Dashboard.pm index d74ad74..5de29d5 100644 --- a/Web/lib/MJB/Web/Controller/Dashboard.pm +++ b/Web/lib/MJB/Web/Controller/Dashboard.pm @@ -199,7 +199,7 @@ sub do_blog_media_remove( $c ) { $jekyll->remove_file( $media_file->to_string, "Removed media file" . $media_file->basename ); } - $c->deploy_blog( $blog ); + $c->sync_blog_media( $blog ); $c->flash( confirmation => "Removed " . $media_file->basename ); $c->redirect_to( $c->url_for( 'show_dashboard_blog_media', { id => $blog->id } ) ); @@ -224,7 +224,7 @@ sub do_blog_media ( $c ) { "Add media " . $upload->filename ); - $c->deploy_blog( $blog ); + $c->sync_blog_media( $blog ); $c->flash( confirmation => "Uploaded file!" ); $c->redirect_to( $c->url_for( 'show_dashboard_blog_media', { id => $blog->id } ) ); diff --git a/Web/lib/MJB/Web/Task/SyncBlogMedia.pm b/Web/lib/MJB/Web/Task/SyncBlogMedia.pm new file mode 100644 index 0000000..20e2937 --- /dev/null +++ b/Web/lib/MJB/Web/Task/SyncBlogMedia.pm @@ -0,0 +1,31 @@ +package MJB::Web::Task::SyncBlogMedia; +use Mojo::Base 'MJB::Web::Task', -signatures; +use Mojo::File qw( curfile ); +use File::Copy::Recursive qw( dircopy ); +use IPC::Run3; + +sub run ( $job, $blog_id ) { + $job->note( _mds_template => 'build_static' ); + + my $build_dir = $job->checkout_repo( $blog_id ); + my $blog = $job->app->db->blog( $blog_id ); + + $job->note( is_clone_complete => 1 ); + + # Show the user the commit we're on. + $job->system_command( [ 'git', '-C', $build_dir->child('src')->to_string, 'log', '-1' ] ); + + $job->note( is_build_complete => 1 ); + + my $domain = $blog->domain->name; + + foreach my $host ( qw( root@web-west.myjekyllblog.net root@web-east.myjekyllblog.net ) ) { + $job->system_command( [ qw( rsync -vrLptgoD --delete -e ), 'ssh -o StrictHostKeyChecking=no', $build_dir->child('src')->child('assets')->to_string . "/", "$host:/var/www/$domain/html/assets" ] ); + } + + $job->note( is_deploy_complete => 1 ); + + $job->finish( ); +} + +1;