[Pharo] Personal fitness tracker web app.
Updated image deployment script.
deploy
@@ -1,104 +0,0 @@
1
Removed:
#!/usr/bin/perl
2
Removed:
# -*- mode: cperl; -*-
3
Removed:
4
Removed:
use 5.38.2;
5
Removed:
use strict;
6
Removed:
use warnings;
7
Removed:
8
Removed:
use Getopt::Long;
9
Removed:
use File::Copy;
10
Removed:
use POSIX qw(strftime);
11
Removed:
use Data::Dumper;
12
Removed:
$Data::Dumper::Terse = 1;
13
Removed:
14
Removed:
=head1 NAME
15
Removed:
16
Removed:
deploy - deploy the MyFitnessTracker web app to my vps
17
Removed:
18
Removed:
=head1 SYNOPSIS
19
Removed:
20
Removed:
deploy [--help] SRC DEST
21
Removed:
22
Removed:
=head1 AUTHOR
23
Removed:
24
Removed:
Marius Peter <mft@marius-peter.com>
25
Removed:
26
Removed:
=head1 COPYRIGHT
27
Removed:
28
Removed:
Copyright 2024 Marius Peter <mft@marius-peter.com>
29
Removed:
30
Removed:
=cut
31
Removed:
32
Removed:
33
Removed:
GetOptions(
34
Removed:
'version=s' => \my $version,
35
Removed:
clean => \my $clean,
36
Removed:
all => \my $all,
37
Removed:
test => \my $test
38
Removed:
);
39
Removed:
40
Removed:
my $app_name = 'mft';
41
Removed:
my $iso8601 = strftime '%Y-%m-%dT%H:%M:%SZ', localtime;
42
Removed:
43
Removed:
if ($clean) {
44
Removed:
my @old_images = glob "/tmp/${app_name}-*"
45
Removed:
or warn "No files can be deleted";
46
Removed:
if ( @old_images and $all ) {
47
Removed:
my $confirm =
48
Removed:
answer "Delete the following files:\n" . Dumper @old_images;
49
Removed:
if ( $confirm eq 'yes' ) {
50
Removed:
unlink @old_images and print "All files deleted successfully.\n";
51
Removed:
}
52
Removed:
else { print "Files not deleted.\n" }
53
Removed:
}
54
Removed:
elsif (@old_images) {
55
Removed:
foreach my $image (@old_images) {
56
Removed:
my $confirm = answer "Delete the following file: $image";
57
Removed:
if ( $confirm eq 'yes' ) {
58
Removed:
unlink $image;
59
Removed:
}
60
Removed:
else { print "File not deleted.\n" }
61
Removed:
}
62
Removed:
}
63
Removed:
goto SUCCESS;
64
Removed:
}
65
Removed:
66
Removed:
unless ($version) {
67
Removed:
warn "No deployment version specified";
68
Removed:
$version = 0;
69
Removed:
}
70
Removed:
71
Removed:
my $pharo_vm = '~/pharolauncher/pharo-vm/pharo';
72
Removed:
my $development_image = $app_name . '.image';
73
Removed:
my $deployment_image = '/tmp/' . $app_name . '-' . $iso8601 . '.image';
74
Removed:
my $remote_server = 'mpeter@vps';
75
Removed:
my $remote_image =
76
Removed:
$remote_server . ':~/Pharo/' . $app_name . '-' . $version . '.image';
77
Removed:
78
Removed:
copy( $development_image, $deployment_image ) or die "Image copy failed: $!";
79
Removed:
80
Removed:
my $script = "MFTUtils createDeploymentImage: ${version}";
81
Removed:
82
Removed:
print "Building deployment image...\n";
83
Removed:
system "$pharo_vm --headless $deployment_image eval $script";
84
Removed:
die "Failed to build deployment image" if $?;
85
Removed:
print "Deployment image built at ${deployment_image}.\n";
86
Removed:
87
Removed:
if ( answer("Deploy the image on $remote_server?") eq 'yes' ) {
88
Removed:
print "Deploying image at $remote_image...\n";
89
Removed:
system 'rsync', qw(
90
Removed:
--verbose
91
Removed:
--progress
92
Removed:
--human-readable
93
Removed:
--compress
94
Removed:
), $deployment_image, $remote_image;
95
Removed:
system 'ssh root@vps systemctl restart mft';
96
Removed:
}
97
Removed:
98
Removed:
if ($test) {
99
Removed:
system "$pharo_vm --headless $deployment_image --no-quit";
100
Removed:
die "Failed to start Pharo deployment image for testing" if $?;
101
Removed:
}
102
Removed:
103
Removed:
SUCCESS:
104
Removed:
print "Successfully perfomed all action.\n"
deploy.pl
@@ -0,0 +1,102 @@
1
Added:
#!/usr/bin/perl
2
Added:
# -*- mode: cperl; -*-
3
Added:
4
Added:
use 5.38.2;
5
Added:
use strict;
6
Added:
use warnings;
7
Added:
8
Added:
use Getopt::Long;
9
Added:
use Pod::Usage;
10
Added:
use File::Basename;
11
Added:
use File::Path qw(make_path);
12
Added:
use File::Copy;
13
Added:
use POSIX qw(strftime);
14
Added:
use Data::Dumper;
15
Added:
$Data::Dumper::Terse = 1;
16
Added:
17
Added:
=head1 NAME
18
Added:
19
Added:
deploy - deploy the MyFitnessTracker web app to my vps
20
Added:
21
Added:
=head1 SYNOPSIS
22
Added:
23
Added:
deploy [--help] IMAGE HOST
24
Added:
25
Added:
=head1 AUTHOR
26
Added:
27
Added:
Marius Peter <mft@marius-peter.com>
28
Added:
29
Added:
=head1 COPYRIGHT
30
Added:
31
Added:
Copyright 2024 Marius Peter <mft@marius-peter.com>
32
Added:
33
Added:
=cut
34
Added:
35
Added:
GetOptions( test => \my $test );
36
Added:
37
Added:
my ( $source, $destination ) = @ARGV;
38
Added:
if ( not defined $source ) {
39
Added:
pod2usage "No development image specified.";
40
Added:
}
41
Added:
elsif ( not -e $source ) {
42
Added:
pod2usage "$source does not exist.";
43
Added:
}
44
Added:
elsif ( not defined $destination ) {
45
Added:
pod2usage "No destination host specified.";
46
Added:
}
47
Added:
48
Added:
my $iso8601 = strftime '%Y-%m-%dT%H:%M:%SZ', localtime;
49
Added:
50
Added:
# Identify resources
51
Added:
52
Added:
my ( $image_devel, $path_devel ) = fileparse $source;
53
Added:
my ( $image_staging, $path_staging ) = ( "mft.image", "/tmp/mft-${iso8601}" );
54
Added:
55
Added:
open my $fh, '<', "${path_devel}/pharo.version";
56
Added:
chomp( my $pharo_version = <$fh> );
57
Added:
close $fh;
58
Added:
print "Pharo version for $image_devel is $pharo_version.\n";
59
Added:
my $pharo_vm = $ENV{HOME} . "/Pharo/vms/${pharo_version}-x64/pharo";
60
Added:
if ( -x $pharo_vm ) {
61
Added:
print "Found Pharo VM $pharo_vm.\n";
62
Added:
}
63
Added:
else {
64
Added:
die "$pharo_vm is not a valid Pharo VM executable path";
65
Added:
}
66
Added:
67
Added:
# Staging image
68
Added:
69
Added:
make_path $path_staging or die $!;
70
Added:
print "Copying development image $image_devel to staging image...\n";
71
Added:
copy "${path_devel}/${image_devel}", "${path_staging}/${image_staging}"
72
Added:
or die $!;
73
Added:
74
Added:
my $script = "MFTUtils createDeploymentImage";
75
Added:
print "Building staging image at $path_staging...\n";
76
Added:
system "$pharo_vm --headless ${path_staging}/${image_staging} eval $script";
77
Added:
if ($?) {
78
Added:
die "Failed to build staging image";
79
Added:
}
80
Added:
else {
81
Added:
print "Staging image built at ${path_staging}/${image_staging}.\n";
82
Added:
}
83
Added:
84
Added:
# Production image
85
Added:
86
Added:
my $image_prod = "${destination}:/var/www/myfitnesstracker.io/${image_staging}";
87
Added:
88
Added:
print "Deploying production image at $image_prod...\n";
89
Added:
system 'rsync', qw( --verbose --progress --human-readable --compress ),
90
Added:
"${path_staging}/${image_staging}", $image_prod;
91
Added:
92
Added:
warn "You must manually log into $destination in order to restart mft.service.";
93
Added:
94
Added:
# system 'ssh root@vps systemctl restart mft';
95
Added:
# if ($?) {
96
Added:
# die "Couldn't restart mft.service on $destination"
97
Added:
# }
98
Added:
# else {
99
Added:
# print "Successfully restarted mft.service on $destination.\n"
100
Added:
# }
101
Added:
102
Added:
print "$image_devel successfully deployed to $image_prod.\n"