Updated image deployment script.

Commit
178c92353d8dd8a986d0a897b8dabcab749e7153
Author
Marius Peter <marius.peter@tutanota.com>
Author date
Committer
Marius Peter <marius.peter@tutanota.com>
Committer date
Changed files
deploy
index c96674df..00000000 100755..000000
@@ -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
index 00000000..71e62e3d 000000..100755
@@ -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"