X-Git-Url: https://git.exim.org/buildfarm-client.git/blobdiff_plain/d105ee7b8bc1fd73a0a33fe11c33cf126e11223c..3912c3d0d041f53eba0bc079ae9e5e72bece892d:/run_build diff --git a/run_build b/run_build index 952e4a9..292de22 100755 --- a/run_build +++ b/run_build @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/env perl =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 5.010; 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 FindBin qw'$RealBin'; use IO::Handle; use POSIX qw(:signal_h strftime); use Data::Dumper; @@ -70,6 +72,7 @@ BEGIN : 'xxxxxx' ); } + push @INC, getcwd(); } use EximBuild::SCM; @@ -82,10 +85,13 @@ if ($0 =~ /(.*)\.pl$/) { exec $1, @ARGV; } +if (umask != 022) { + umask 022; + say "$0: forced umask to 022" if -t; +} 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. @@ -152,6 +158,15 @@ print_help() if ($help); # 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 ( @@ -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, - $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 - 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; @@ -1012,16 +1035,30 @@ sub make_test { return unless step_wanted('test'); print time_str(),"running make test ...\n" if $verbose; + 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; - @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 @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 @@ -1035,10 +1072,13 @@ sub make_test } } 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); - - send_result('Test',$status,\@makeout) if $status; $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; - 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; @@ -1171,7 +1212,7 @@ sub configure 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; @@ -1430,7 +1471,10 @@ sub get_script_config_dump 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;