New build control
[buildfarm-client.git] / run_build
index 952e4a91207cd88d41e03ea31716e5ab05367b00..292de22e66c554206fd733dd7893c9c329f18a5a 100755 (executable)
--- a/run_build
+++ b/run_build
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 
 =comment
 
 
 =comment
 
@@ -32,10 +32,11 @@ See accompanying License file for license details
 
 ###################################################
 
 
 ###################################################
 
-use vars qw($VERSION); $VERSION = 'REL_0.1';
+our $VERSION = 'REL_0.1';
 
 use strict;
 use warnings;
 
 use strict;
 use warnings;
+use 5.010;
 use Config;
 use Fcntl qw(:flock :seek);
 use File::Path;
 use Config;
 use Fcntl qw(:flock :seek);
 use File::Path;
@@ -43,6 +44,7 @@ use File::Copy;
 use File::Basename;
 use File::Temp;
 use File::Spec;
 use File::Basename;
 use File::Temp;
 use File::Spec;
+use FindBin qw'$RealBin';
 use IO::Handle;
 use POSIX qw(:signal_h strftime);
 use Data::Dumper;
 use IO::Handle;
 use POSIX qw(:signal_h strftime);
 use Data::Dumper;
@@ -70,6 +72,7 @@ BEGIN
             : 'xxxxxx'
         );
     }
             : 'xxxxxx'
         );
     }
+    push @INC, getcwd();
 }
 
 use EximBuild::SCM;
 }
 
 use EximBuild::SCM;
@@ -82,10 +85,13 @@ if ($0 =~ /(.*)\.pl$/) {
     exec $1, @ARGV;
 }
 
     exec $1, @ARGV;
 }
 
+if (umask != 022) {
+    umask 022;
+    say "$0: forced umask to 022" if -t;
+}
 
 my %module_hooks;
 my $orig_dir = getcwd();
 
 my %module_hooks;
 my $orig_dir = getcwd();
-push @INC, $orig_dir;
 
 # make sure we exit nicely on any normal interrupt
 # so the cleanup handler gets called.
 
 # make sure we exit nicely on any normal interrupt
 # so the cleanup handler gets called.
@@ -152,6 +158,15 @@ print_help() if ($help);
 # process config file
 #
 require $buildconf;
 # process config file
 #
 require $buildconf;
+#use Data::Dumper;
+#die Dumper \%EximBuild::conf;
+
+
+# Does not seem to be necessary
+#die "$0: permissions on '$EximBuild::conf{build_root}' should be >= 0775\n"
+#    if -d $EximBuild::conf{build_root}
+#      and ((stat $EximBuild::conf{build_root})[2] & 0775) != 0775;
+
 
 # get the config data into some local variables
 my (
 
 # get the config data into some local variables
 my (
@@ -159,14 +174,22 @@ my (
     $aux_path,$trigger_exclude,$trigger_include,$secret,
     $keep_errs,$force_every, $make, $optional_steps,
     $use_vpath,$tar_log_cmd, $using_msvc, $extra_config,
     $aux_path,$trigger_exclude,$trigger_include,$secret,
     $keep_errs,$force_every, $make, $optional_steps,
     $use_vpath,$tar_log_cmd, $using_msvc, $extra_config,
-    $make_jobs, $core_file_glob
+    $make_jobs, $core_file_glob, $global_lock_dir
   )
   =@EximBuild::conf{
     qw(build_root target animal print_success aux_path trigger_exclude
       trigger_include secret keep_error_builds force_every make optional_steps
   )
   =@EximBuild::conf{
     qw(build_root target animal print_success aux_path trigger_exclude
       trigger_include secret keep_error_builds force_every make optional_steps
-      use_vpath tar_log_cmd using_msvc extra_config make_jobs core_file_glob)
+      use_vpath tar_log_cmd using_msvc extra_config make_jobs core_file_glob global_lock_dir)
   };
 
   };
 
+# This should be done more generally, for all the scripts
+# including the $buildconf. For now this is duplicated
+# in a similiar war in run_branches.
+$global_lock_dir //= $buildroot // die "$0: need global_lock_dir\n";
+
+die "$0: need read/write permissions on '$global_lock_dir': $!\n"
+    if not -r -w $global_lock_dir;
+
 #default is no parallel build
 $make_jobs ||= 1;
 
 #default is no parallel build
 $make_jobs ||= 1;
 
@@ -1012,16 +1035,30 @@ sub make_test
 {
     return unless step_wanted('test');
     print time_str(),"running make test ...\n" if $verbose;
 {
     return unless step_wanted('test');
     print time_str(),"running make test ...\n" if $verbose;
+
     my $tests_range = $EximBuild::conf{range_num_tests} || "1 4";
     my $tests_range = $EximBuild::conf{range_num_tests} || "1 4";
+    # backwards compat for build-farm.conf from before this support was added
+    $EximBuild::conf{test_configure_env} = {} unless exists $EximBuild::conf{test_configure_env};
+    $EximBuild::conf{test_configure_args} = [] unless exists $EximBuild::conf{test_configure_args};
+    $EximBuild::conf{test_run_args} = "" unless exists $EximBuild::conf{test_run_args};
+
     my @makeout;
     my @makeout;
-    @makeout =`(cd $exim/test
-                autoconf && ./configure && $make )2>&1 `;
+    my %saved_env = %ENV;
+    foreach my $k (keys %{$EximBuild::conf{test_configure_env}}) {
+      $ENV{$k} = $EximBuild::conf{test_configure_env}{$k};
+    }
+    my $conf_args = '';
+    foreach (@{$EximBuild::conf{test_configure_args}}) {
+      s/'/'"'"'/g;
+      $conf_args .= " '${_}'";
+    }
+    @makeout =`(cd $exim/test && ./configure $conf_args && $make )2>&1 `;
+    %ENV = %saved_env;
+
     my $status = $? >>8;
     unless($status)
     {
     my $status = $? >>8;
     unless($status)
     {
-      my @tmp = `(WORKDIR=\$PWD
-                  cd $exim/test
-                  ./runtest \$WORKDIR/$exim/src/build-*/exim -CONTINUE $tests_range )2>&1`;
+      my @tmp = `(cd $exim/test && ./runtest -CONTINUE $EximBuild::conf{test_run_args} $tests_range )2>&1`;
       $status = $? >>8;
       push @makeout, @tmp;
       # Prepend the failed summary log outputs for ease of reading
       $status = $? >>8;
       push @makeout, @tmp;
       # Prepend the failed summary log outputs for ease of reading
@@ -1035,10 +1072,13 @@ sub make_test
       }
     }
     writelog('test',\@makeout);
       }
     }
     writelog('test',\@makeout);
+    send_result('Test',$status,\@makeout) if $status;
+
+    @makeout = `cat $exim/test/run-summary.log`;
+    writelog('test-results',\@makeout);
+
     print "======== make test logs ===========\n",@makeout
       if ($verbose > 1);
     print "======== make test logs ===========\n",@makeout
       if ($verbose > 1);
-
-    send_result('Test',$status,\@makeout) if $status;
     $steps_completed .= " Test";
 }
 
     $steps_completed .= " Test";
 }
 
@@ -1143,7 +1183,8 @@ sub configure
         @tmp = `echo "Hardcoded Exim user info:"; id $exim_user
           cd $exim && perl -pi -e 's/^EXIM_USER=.*/EXIM_USER=$exim_user/' $local_conf`;
         push @confout, @tmp;
         @tmp = `echo "Hardcoded Exim user info:"; id $exim_user
           cd $exim && perl -pi -e 's/^EXIM_USER=.*/EXIM_USER=$exim_user/' $local_conf`;
         push @confout, @tmp;
-        my $me = `whoami`; chomp $me;
+        #my $me = `whoami`; chomp $me;
+       my $me = getpwuid($>) // die "$0: getpwuid($>): $!\n";
         @tmp = `echo "Build Farm user info:"; id $me
           cd $exim && perl -pi -e 's/^# CONFIGURE_OWNER=\$/CONFIGURE_OWNER=$me/' $local_conf`;
         push @confout, @tmp;
         @tmp = `echo "Build Farm user info:"; id $me
           cd $exim && perl -pi -e 's/^# CONFIGURE_OWNER=\$/CONFIGURE_OWNER=$me/' $local_conf`;
         push @confout, @tmp;
@@ -1171,7 +1212,7 @@ sub configure
         push @confout, @tmp;
         # Build the config_opts array to send to the server
         chomp @tmp;
         push @confout, @tmp;
         # Build the config_opts array to send to the server
         chomp @tmp;
-        my @config_opts = grep s/(?:LOOKUP_|EXPERIMENTAL_|USE_)(\S+)=.*/$1/,
+        my @config_opts = grep s/(?:LOOKUP_|EXPERIMENTAL_|SUPPORT_|USE_)(\S+)=.*/$1/,
                           @tmp;
         push @config_opts, grep s/^(?:EXIM_)(PERL|PYTHON)=.*/$1/,
                            @tmp;
                           @tmp;
         push @config_opts, grep s/^(?:EXIM_)(PERL|PYTHON)=.*/$1/,
                            @tmp;
@@ -1430,7 +1471,10 @@ sub get_script_config_dump
     delete $conf->{secret};
 
     if ($conf->{scm} eq 'git') {
     delete $conf->{secret};
 
     if ($conf->{scm} eq 'git') {
-        chomp($conf->{farm}{revision} = `git describe --tags --always --dirty=+`);
+        chomp($conf->{farm}{revision} = `cd $RealBin && git describe --tags --always --dirty=+`);
+       $conf->{farm}{cwd} = getcwd();
+       $conf->{farm}{bindir} = $RealBin;
+       $conf->{farm}{perl} = $^V;
     }
 
     $Data::Dumper::Sortkeys = 1;
     }
 
     $Data::Dumper::Sortkeys = 1;