source: other-projects/nightly-tasks/snapshot/trunk/lib.pl

Last change on this file was 38169, checked in by anupama, 7 months ago

The x64 property should not be set for darwin, only linux as in the other subroutine, create_release

File size: 12.5 KB
Line 
1my $sep = $^O eq "MSWin32" ? "\\" : "/";
2
3sub get_date {
4 local ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
5 local $day = $mday;
6 local $month = $mon+1;
7 local $year = $year+1900;
8 if ( length $month == 1 ) {
9 $month = join( "", "0", $month);
10 }
11 if ( length $day== 1 ) {
12 $day = join( "", "0", $day );
13 }
14 local $date = join( ".", $year,$month,$day );
15 return $date;
16}
17
18sub gen_snapshot_id {
19 if ( exists $_[0] && exists $_[1] ) {
20 return $_[0] . get_date() . $_[1];
21 }
22
23 if ( exists $_[0] ) {
24 return $_[0] . get_date();
25 }
26 return get_date();
27}
28
29sub create_release {
30
31 die "Must provide parameter to create_release\n" unless (exists $_[0]);
32
33 my $release_folder_name = $_[0];
34
35 my $release_version = $release_folder_name;
36 $release_version =~ s/^gs-?//;
37 $release_version =~ s/rc\d$//;
38 my $major_version = $release_version;
39 $major_version =~ s/^(3|2).*/$1/;
40 $release_version =~ s/^($major_version)\.?(\d*).*/$1.$2/;
41 my $rk = "rk".$major_version;
42
43 my $release_version_extra;
44 if ($release_folder_name =~ m/(rc\d)$/) {
45 $release_version_extra = $1;
46 }
47 if ($release_folder_name !~ m/^gs/) { # prefix gs
48 $release_folder_name = "gs".$release_folder_name;
49 }
50 my $release_dir = "$ENV{'DATA_DIR'}${sep}$release_folder_name";
51
52 print "major_version: $major_version\n";
53 print "version: $release_version\n";
54 print "versionextra: $release_version_extra\n";
55 print "release_folder_name: $release_folder_name\n";
56 print "release_dir: $release_dir\n";
57
58 print "about to clean up old snapshots (Ctrl-C to cancel)";
59 local $| = 1;
60 for ( my $i=0; $i<5; $i++ ) {
61 print ".";
62 sleep 1;
63 }
64 $| = 0;
65
66 print "cleaning up previous release snapshot $release_dir\n";
67
68 if(-d $release_dir) {
69 if ( $^O eq "MSWin32" ) {
70 system("rd /q /s \"$release_dir\"");
71 } else {
72 system("rm -rf \"$release_dir\"");
73 }
74 }
75
76 print "creating the release dir\n";
77 mkdir $release_dir or die "couldn't create release directory\n";
78
79 print "changing to the release dir\n";
80 chdir $release_dir;
81
82 #version property
83 print "setting up todays properties\n";
84 `echo version:$release_version> $rk-build.properties`;
85
86 if($release_version_extra) {
87 `echo version-extra:$release_version_extra>> $rk-build.properties`;
88 }
89
90 #processor propertylocal $| = 1;
91 if ( $^O eq "darwin" ) {
92 print "setting processor\n";
93 if ( `uname -p` eq "i386" ) {
94 `echo processor:intel>> $rk-build.properties`;
95 } elsif ( `uname -p` eq "powerpc" ) {
96 `echo processor:ppc>> $rk-build.properties`;
97 } else {
98 print "unable to determine processor type, using intel\n";
99 `echo processor:intel>> $rk-build.properties`;
100 }
101 } elsif ( $^O eq "linux" ) {
102 # Running "uname -m" on new 32 bit VM returns "i86_64" too
103 # So to properly test for 32 bit, ensure that environment.pl
104 # didn't set $ENV{'GS_OPENSSL_HOST'} to "linux-generic32"
105 if(`uname -m` =~ m/64$/) {
106 if(! exists $ENV{'GS_OPENSSL_HOST'} || $ENV{'GS_OPENSSL_HOST'} ne "linux-generic32") {
107 print "Setting linux architecture to 64 bit";
108 `echo x64:true>> $rk-build.properties`;
109 }
110 }
111 }
112
113 #branch path property
114 if ( $ENV{'branch_path'} ) {
115 `echo branch.path:$ENV{'branch_path'}>> $rk-build.properties`;
116 }
117
118 #server.exe.location
119 if ( $major_version eq "2" && exists $ENV{'SERVER_EXE_LOCATION'} ) {
120 `echo server.exe.location:$ENV{'SERVER_EXE_LOCATION'}>> $rk-build.properties`;
121 }
122
123 print "creating the snapshot using $rk\n";
124 system( $rk );
125}
126
127sub create {
128
129 die "release_dir not set, cant create\n" unless $release_dir;
130
131 print "about to clean up old snapshots (Ctrl-C to cancel)";
132 local $| = 1;
133 for ( my $i=0; $i<5; $i++ ) {
134 print ".";
135 sleep 1;
136 }
137 $| = 0;
138
139 print "cleaning up previous snapshot\n";
140 local $release_parent = dirname($release_dir);
141 if ( $^O eq "MSWin32" ) {
142 system("rd /q /s \"$release_parent\"");
143 } else {
144 system("rm -rf \"$release_parent\"");
145 }
146
147 print "creating the release dir\n";
148 mkdir $release_parent or die "couldn't create release parent directory\n";
149 mkdir $release_dir or die "couldn't create release directory\n";
150
151 print "changing to the release dir\n";
152 chdir $release_dir;
153
154 #version property
155 print "setting up todays properties\n";
156 `echo version:$snapshot_id> $rk-build.properties`;
157
158 #processor propertylocal $| = 1;
159 if ( $^O eq "darwin" ) {
160 print "setting processor\n";
161 if ( `uname -p` eq "i386" ) {
162 `echo processor:intel>> $rk-build.properties`;
163 } elsif ( `uname -p` eq "powerpc" ) {
164 `echo processor:ppc>> $rk-build.properties`;
165 } else {
166 print "unable to determine processor type, using intel\n";
167 `echo processor:intel>> $rk-build.properties`;
168 }
169 }
170
171 #branch path property
172 if ( $ENV{'branch_path'} ) {
173 `echo branch.path:$ENV{'branch_path'}>> $rk-build.properties`;
174 }
175
176 #x64 bit property for linux, not darwin
177 if ( $^O eq "linux" && $ENV{'x64'} ) {
178 `echo x64:true>> $rk-build.properties`;
179 }
180
181 #server.exe.location
182 if ( exists $ENV{'SERVER_EXE_LOCATION'} ) {
183 `echo server.exe.location:$ENV{'SERVER_EXE_LOCATION'}>> $rk-build.properties`;
184 }
185
186 print "creating the snapshot using $rk\n";
187 system( $rk );
188
189}
190
191sub upload {
192 print "preparing files for uploading\n";
193
194 my @munges = ();
195 if ( exists $ENV{'munges'} ) {
196 @munges = split(' ', $ENV{'munges'});
197 }
198
199 #copy products to a temporary folder, giving them their new names
200 if ( -d "$release_dir${sep}uploads" ) {
201 system( "rm -rf '$release_dir${sep}uploads'" );
202 }
203 mkdir "$release_dir${sep}uploads";
204
205 my @files;
206 if ( -d "$release_dir${sep}products" ) {
207 @files = <$release_dir${sep}products${sep}*>;
208 }
209 push( @files, "$release_dir${sep}$rk.out" );
210
211 for my $file ( @files ) {
212 if ( -e $file ) {
213 my $filename = basename($file);
214 #munge
215 for my $m ( @munges ) {
216 $doit="\$filename =~ $m"; eval "$doit";
217 }
218 # copy to uploads folder
219 print "Copying '" . basename($file) . "' to '$filename' in uploads folder\n";
220 if( $^O =~ "linux|darwin" ) {
221 system("cp \"$file\" \"${release_dir}${sep}uploads${sep}$filename\"");
222 }
223 else {
224 system("copy \"$file\" \"${release_dir}${sep}uploads${sep}$filename\"");
225 }
226 }
227
228 }
229
230 # ssh too old inside lsb to upload to www-internal, so we do that in a separate step later
231 # We use the upload-files-to-www-internal.sh script on linux systems now
232 # The following is still left in as it appears to work for the mac
233
234 if( $^O !~ "linux" ) {
235 my $command = "";
236
237 ##my $out = `set`;
238 ##print "out = $out\n";
239 #$command = "cd \"${release_dir}${sep}uploads\" && tar -c * | ";
240 #$command .= ($^O eq "MSWin32" ? "plink" : "ssh");
241 #$command .= " -T -i \"$ENV{'IDENTITY_FILE'}\" nzdl\@puka.cs.waikato.ac.nz";
242 #print "$command\n";
243 #system("$command");
244
245 ## for now, upload a copy to the new machine, later to replace puka
246 #$command = "cd \"${release_dir}${sep}uploads\" && tar -c * | ";
247 #$command .= ($^O eq "MSWin32" ? "plink" : "ssh");
248 #$command .= " -T -i \"$ENV{'IDENTITY_FILE'}\" nzdl-gsorg\@wwwdev.greenstone.org";
249 ##print "$command\n";
250 #system("$command");
251
252 # also upload a copy to www-internal, which is the new wwwdev, and will replace puka.
253 $command = "cd \"${release_dir}${sep}uploads\" && tar -c * | ";
254 $command .= ($^O eq "MSWin32" ? "plink" : "ssh");
255 $command .= " -T -i \"$ENV{'IDENTITY_FILE_ED25519'}\" nzdl-gsorg\@www-internal.greenstone.org";
256 print "$command\n";
257 system("$command");
258 }
259}
260
261# EMAILING DOESN'T WORK, as SMTP not setup on release-kit LSB machines
262
263#sub xsend_mail_on_releasekit_fail {
264
265 # first, create your message
266 # use Email::MIME;
267# my $message = Email::MIME->create(
268# header_str => [
269# From => $ENV{'MONITOR_EMAIL'},
270# To => $ENV{'MONITOR_EMAIL'},
271# Subject => 'Trial message',
272# ],
273# attributes => {
274# encoding => 'quoted-printable',
275# charset => 'ISO-8859-1',
276# },
277# body_str => "Email test!\n",
278# );
279
280# # send the message
281# use Email::Sender::Simple qw(sendmail);
282# sendmail($message);
283
284 # %mail = ( To => $ENV{'MONITOR_EMAIL'},
285# From => $ENV{'MONITOR_EMAIL'},
286# Message => "This is a test message"
287# );
288
289# sendmail(%mail) or die $Mail::Sendmail::error;
290
291# print "OK. Log says:\n", $Mail::Sendmail::log;
292#}
293
294# EMAILING DOESN'T WORK, as SMTP not setup on release-kit LSB machines
295
296# Copied from diffcol's task.pl into here
297# Sending emails with perl: http://learn.perl.org/examples/email.html
298# Sending email attachments with perl: http://www.perlmonks.org/?node_id=19430
299# Sadly none of the packages are installed by default and use of MIME::Lite is discouraged
300sub send_mail_on_releasekit_fail
301{
302 # email greenstone_team if build failed
303
304 my $logfile="$release_dir${sep}$rk.out";
305 my $finalLinesLogOutput=`tail -n 50 $logfile`;
306
307 print STDERR "Checking if successful... \n";
308 # using reverse index to search from bottom of tail output
309 my $had_error = 0;
310
311 if (rindex($finalLinesLogOutput, "BUILD FAILED") != -1) {
312 # release-kit failed to build binary
313 $had_error = 1;
314 }
315 elsif (rindex($finalLinesLogOutput, "BUILD SUCCESSFUL") != -1) {
316 # SUCCESS!
317 $had_error = 0;
318 }
319 else {
320 # saw neither BUILD FAILED nor BUILD SUCCESSFUL in tail of log output
321 # Could be that building never completed, still want to be notified
322 $had_error = 2;
323 }
324
325
326 if(!$had_error) {
327 # everything fine, no need to email
328 return;
329 }
330
331
332 print STDERR "Build had error code: $had_error\n";
333 # let's send the last 200 lines of the log file to the user as email
334 #
335 $finalLinesLogOutput=`tail -n 200 $logfile`;
336
337 my $msg = "Last 200 lines in the log:\n$finalLinesLogOutput";
338 my $subject = "Release-kit $release_dir failed"; # mentions OS, bitness, date
339
340 # let's attach logfile besides
341
342 if($isWin) {
343 if($use_blat && $blat && $ENV{'GSDL_SMTP'}) {
344 # http://stackoverflow.com/questions/709635/sending-mail-from-batch-file
345 #blat -to [email protected] -server smtp.example.com -f [email protected] -subject "subject" -body "body"
346
347 # need to install blat on windows
348 $cmd = "$blat -to $ENV{'MONITOR_EMAIL'} -server $ENV{'GSDL_SMTP'} -f $ENV{'MONITOR_EMAIL'} -attach $logfile -subject \"$subject\" -body \"$msg\"";
349 $result = system($cmd);
350 }
351 else {
352 $result = 1; # status from running mail command is 0 if success, 1 if fail
353 print STDERR "********************************************\n";
354 if ($use_blat) {
355 print STDERR "Need blat and SMTP set to send mail attachment\n" ;
356 } else {
357 print STDERR "Not set up to send mail on Windows\n";
358 }
359 print STDERR "Inspect release-kit build log at: $log_file\n";
360 print STDERR "********************************************\n";
361 }
362 } else { # linux
363
364 # try using sendmail, since mutt is not installed on lsb
365 # https://vitux.com/three-ways-to-send-email-from-ubuntu-command-line/
366 # Sending attachment with sendmail is too involved, see
367 # https://unix.stackexchange.com/questions/223636/sendmail-attachment/223650
368 # https://askubuntu.com/questions/355823/sending-file-using-sendmail
369 # Will just put the contents of the rk log file in the body.
370
371 # read in all of logfile
372 # https://stackoverflow.com/questions/206661/what-is-the-best-way-to-slurp-a-file-into-a-string-in-perl
373 my $contents = do {local (@ARGV,$/) = $logfile; <>};
374 my $email_path = "$release_dir${sep}email.txt";
375 if (open(FOUT, '>:utf8', $email_path))
376 {
377 print FOUT "Subject: $subject";
378 if($contents) {
379 print FOUT $contents;
380 } else {
381 print FOUT "Empty release kit building log: $logfile\n";
382 }
383 close(FOUT);
384 $cmd = "sendmail $ENV{'MONITOR_EMAIL'} < $email_path";
385 $result = system($cmd);
386 }
387 else
388 {
389 print STDERR "WARNING: sendmail email attempt failed. Failed to open file for writing email msg:\n\t$email_path\n";
390
391 # try using mutt to send email
392 my $status = system("command -v mutt > /dev/null 2>&1;"); #better way of doing "which mutt"
393
394 if($status != 0) { # mutt doesn't exist, can't send attachments, so send simple email
395 $cmd="echo '$message' | mail -s '$subject' $ENV{'MONITOR_EMAIL'}";
396
397 print STDERR "********************************************\n";
398 print STDERR "No mutt installed, unable to mail attachment\n";
399 print STDERR "Inspect release-kit build log at: $logfile\n";
400 print STDERR "********************************************\n";
401 } else {
402 #$cmd = "bash -c \"echo '$message' | mutt -a $logfile -s 'subject' -- $ENV{'MONITOR_EMAIL'}\"";
403 $cmd = "echo '$message' | mutt -a $logfile -s '$subject' -- $ENV{'MONITOR_EMAIL'}";
404 }
405
406 # run the mail command
407 $result = system($cmd); #&run_and_print_cmd($cmd);
408 }
409 }
410
411
412 if($result != 0) {
413 print STDERR "*** Unable to send email: $?\n";
414 }
415 else {
416 print STDERR "Sent mail with $logfile attached.\n";
417 }
418
419}
Note: See TracBrowser for help on using the repository browser.