diff options
Diffstat (limited to 'lib/Iurt/Ulri.pm')
-rwxr-xr-x | lib/Iurt/Ulri.pm | 160 |
1 files changed, 152 insertions, 8 deletions
diff --git a/lib/Iurt/Ulri.pm b/lib/Iurt/Ulri.pm index ce9d104..09be6b0 100755 --- a/lib/Iurt/Ulri.pm +++ b/lib/Iurt/Ulri.pm @@ -3,18 +3,155 @@ package Iurt::Ulri; use base qw(Exporter); use File::Path qw(make_path); use File::Temp qw(mktemp); -use Iurt::Config qw(get_author_email); +use Iurt::Config qw(config_init config_usage get_author_email); use Iurt::File qw(check_file_timeout); use Iurt::Mail qw(sendmail); -use Iurt::Util qw(plog ssh_setup ssh sput); +use Iurt::Util qw(plog ssh_setup sget ssh sput); use File::Slurp qw(read_file); +use MDK::Common qw(cat_); use strict; our @EXPORT = qw( build_package + fetch_logs_and_cleanup + load_config warn_about_failure ); +sub load_config { + my ($run) = @_; + my $HOME = $ENV{HOME}; + my $configfile = "$HOME/.upload.conf"; + my $sysconfigfile = "/etc/iurt/upload.conf"; + + my $config = {}; + foreach my $f ($configfile, $sysconfigfile) { + plog('DEBUG', "load config: $f"); + if (-f $f) { + $config = eval(cat_($f)) + or die "FATAL $run->{program_name}: syntax error in $f"; + last; + } + } + + my %config_usage = ( + admin => { + desc => 'mail address of the bot administrator', + default => 'distrib-admin@mandrivalinux.org' + }, + 'arch_translation' => { + desc => "Renaming of arch", + default => { 'sparc64' => 'sparcv9' } + }, + bot => { + desc => "List of bot able to compile the packages", + default => { + i586 => { + localhost => { + iurt => { + user => 'builder', + command => qq(iurt --copy_srpm --group --config local_spool /home/builder/iurt/__DIR__ --no_rsync --chrooted-urpmi -m __MEDIA__ -- http://localhost/distrib/ -p "__PACKAGER__" -r __TARGET__ __ARCH__), + packages => '/home/builder/iurt/', + }, + }, + }, + }, + }, + media => { + desc => 'Corresponding media to add given the current media', + default => { + default => { + "core/backports" => [ "core/backports", "core/release", "core/updates" ], + "core/backports_testing" => [ + "core/backports", "core/backports_testing", + "core/release", "core/updates" + ], + "core/release" => [ "core/release" ], + "core/updates" => [ "core/release", "core/updates" ], + "core/updates_testing" => [ + "core/release", "core/updates", "core/updates_testing" + ], + "nonfree/backports" => [ + "core/backports", "core/release", "core/updates", + "nonfree/backports", "nonfree/release", "nonfree/updates" + ], + "nonfree/backports_testing" => [ + "core/backports", "core/backports_testing", + "core/release", "core/updates", + "nonfree/backports", "nonfree/backports_testing", + "nonfree/release", "nonfree/updates" + ], + "nonfree/release" => [ "core/release", "nonfree/release" ], + "nonfree/updates" => [ + "core/release", "core/updates", + "nonfree/release", "nonfree/updates" + ], + "nonfree/updates_testing" => [ + "core/release", "core/updates", "core/updates_testing", + "nonfree/release", "nonfree/updates", "nonfree/updates_testing" + ], + "tainted/backports" => [ + "core/backports", "core/release", "core/updates", + "tainted/backports", "tainted/release", "tainted/updates" + ], + "tainted/backports_testing" => [ + "core/backports", "core/backports_testing", + "core/release", "core/updates", + "tainted/backports", "tainted/backports_testing", + "tainted/release", "tainted/updates" + ], + "tainted/release" => [ "core/release", "tainted/release" ], + "tainted/updates" => [ + "core/release", "core/updates", + "tainted/release", "tainted/updates" + ], + "tainted/updates_testing" => [ + "core/release", "core/updates", "core/updates_testing", + "tainted/release", "tainted/updates", "tainted/updates_testing" + ], + }, + }, + }, + faildelay => { + desc => "Time after which the rebuild is considered as a failure", + default => 36000 + }, + http_queue => { + desc => 'Address where log can be consulted', + default => 'http://pkgsubmit.mageia.org/uploads/' + }, + queue => { + desc => "Root of the tree where the packages to compile are located", + default => "$HOME/uploads" + }, + tmp => { + desc => "Temporary directory", + default => "$HOME/tmp" + }, + ssh_options => { + desc => "SSH options", + default => "-o ConnectTimeout=5 -o BatchMode=yes -o ServerAliveInterval=5" + }, + packager => { + desc => 'Default packager tag user by bot', + default => 'Mageia Team <http://www.mageia.org>' + }, + 'arch' => { + desc => 'Architectures list for each target', + default => { + default => [ 'i586', 'x86_64' ], + }, + }, + 'backoff_delays' => { + desc => 'List of delays in seconds before retrying retriable errors. Error becomes permanent after reaching the end of the list.', + default => [5*60, 30*60, 60*60, 120*60] + }, + ); + config_usage(\%config_usage, $config) if $run->{config_usage}; + config_init(\%config_usage, $config, $run); + return $config; +} + sub build_package { my ($config, $pkg_tree, $media, $prefix, $host, $arch, $bot) = @_; @@ -80,13 +217,13 @@ sub build_package { plog('DEBUG', "Will compile only with media $media_to_add"); $cmd =~ s!__MEDIA__!$media_to_add!g; - #- allow x86_64 hosts to build i586 packages - if ($arch eq 'i586') { - $cmd = "setarch i586 $cmd"; + #- force 32bit if needed, this allows to build 32 bits package on 64 bit hosts + if ($arch =~ /^(i.86|armv5tl|armv7hl)/) { + $cmd = "setarch linux32 $cmd"; } plog('DEBUG', "Build $pkgs"); - ssh($remote, "'echo PID=\$\$; exec $cmd $pkgs &>$prefix_dir/log/botcmd.\$(date +%s).\$(hostname -s).log' > $temp &"); + ssh($remote, "'echo PID=\$\$; exec $cmd $pkgs &>$prefix_dir/log/botcmd.\$(date +%s).$arch.\$(hostname -s).log' > $temp &"); # wait 10 seconds or until we have the log file # plus 20 seconds if it timeouts. @@ -144,6 +281,13 @@ sub get_pid_from_file { $pid; } +sub fetch_logs_and_cleanup { + my ($remote, $remote_dir, $target_dir) = @_; + make_path($target_dir); + sget($remote, "$remote_dir/log/*", $target_dir); + ssh($remote, "rm -rf $remote_dir"); +} + sub warn_about_failure { my ($config, $user, $ent, $arch, $fail_dir, $path, $prefix) = @_; my $text = join("\n", "Build of the following packages failed:\n", map { "- $_" } @{$ent->{srpms}}) . "\n"; @@ -161,11 +305,11 @@ sub warn_about_failure { $text .= "\nLog files generated:\n"; opendir my $DP1, "$fail_dir/$prefix/log/"; - foreach my $f1 (sort(readdir($DP1))) { + foreach my $f1 (readdir($DP1)) { next if ! -d "$fail_dir/$prefix/log/$f1" || $f1 =~ m/^\./; opendir my $DP2, "$fail_dir/$prefix/log/$f1"; - foreach my $f2 (readdir $DP2) { + foreach my $f2 (sort(readdir $DP2)) { next if $f2 =~ m/^\./; $text .= "$fpath/log/$f1/$f2\n"; } |