diff options
Diffstat (limited to 'ulri')
-rwxr-xr-x | ulri | 84 |
1 files changed, 42 insertions, 42 deletions
@@ -256,21 +256,21 @@ foreach my $prefix (keys %pkg_tree) { my $bot_conf = $config->{bot}{$arch}{$host}{$bot}; my $remote = ssh_setup($config->{ssh_options}, $bot_conf->{user}, $host); - + my $prefix_dir = "$bot_conf->{packages}/$path/$prefix-$arch/"; # If our build is noarch, set arch appropriately. # my $lock_file = "$todo_dir/${prefix}_$arch-noarch.$bot.$host.$date.$pid.lock"; - + if (-f $lock_file) { plog('DEBUG', "$prefix is noarch"); $arch = "noarch"; } else { $lock_file =~ s/-noarch//; } - + my $status_file = "$prefix_dir/log/status.log"; plog('INFO', "check status: $host/$arch ($bot [$pid])"); @@ -278,7 +278,7 @@ foreach my $prefix (keys %pkg_tree) { my $success; my $fail; my $later; - + # Check if the build bot finished on the other side # if ($status) { @@ -296,27 +296,27 @@ foreach my $prefix (keys %pkg_tree) { $fail = 1; } } - + if (!$fail) { my @list = split "\n", sout($remote, "ls $prefix_dir"); my $error; my $done; - + my $arch_check = join '|', $arch, if_($untranslated_arch{$arch}, @{$untranslated_arch{$arch}}); plog('MSG', "checking for $arch_check arch"); foreach my $result (@list) { $result =~ /\.(src|$arch_check|noarch)\.rpm$/ or next; - + # do not copy the initial src package $result =~ /^$prefix/ and next; - + my $result_file = "$done_dir/${prefix}_$result"; - + plog('OK', "build ok: $result"); if ($result =~ /\.$arch_check\.rpm$/) { $done = 1; } - + plog('DEBUG', "copy files to done"); make_path($done_dir); if (sget($remote, "$prefix_dir/$result", @@ -338,7 +338,7 @@ foreach my $prefix (keys %pkg_tree) { create_file("$done_dir/${prefix}_$arch.done", "$bot $host"); $success = 1; } - + if ($success) { # Fetch build log and clean remote machine make_path("$done_dir/$prefix"); @@ -353,54 +353,54 @@ foreach my $prefix (keys %pkg_tree) { } } } # if ($status) - + # # Handle build failure # - + my $proc_state; if (!$fail) { chomp($proc_state = sout($remote, "ps h -o state $pid")); } - + my $seconds = time()-$time; - + # Reasons for failure my $timeout = $seconds > $config->{faildelay}; my $zombie = $proc_state eq 'Z'; my $ended = !$proc_state; - + unless ($success || $later || $fail || $timeout || $zombie || $ended) { next bot; } - + plog('INFO', "delete lock file for $prefix"); unlink $lock_file; - + $run{bot}{$host}{$bot} = 0; - + next bot if $later; - + if (!$ended && !$fail) { plog('FAIL', "$bot timed out on $host/$arch ($seconds sec) or " . "it's dead (status $proc_state), removing lock"); $pkg_tree{$prefix}{media}{$media}{arch}{$arch} = 0; next bot; } - + next bot if $success && !$fail; - + if (!$status) { plog('ERROR', "build bot died on $host, reschedule compilation"); next bot; } - + plog('INFO', "Failure reason: $success || $later || $fail || $timeout || $zombie || $ended"); - + plog('FAIL', "build failed"); create_file("$done_dir/${prefix}_$arch.fail", "$bot $host"); make_path($fail_dir); - + mkdir("$fail_dir/$prefix"); if (sget($remote, "$prefix_dir/*", "$fail_dir/$prefix")) { plog('ERROR', "copying from $host:$prefix_dir/ " . @@ -415,10 +415,10 @@ foreach my $prefix (keys %pkg_tree) { if ($user) { warn_about_failure($user, $ent, $arch, $fail_dir, $path, $prefix); } - + # clean the log on the compilation machine ssh($remote, "rm -rf $prefix_dir"); - + } # end bot } # end path } # end prefix @@ -475,40 +475,40 @@ foreach my $prefix (sort keys %pkg_tree) { my $path = $ent->{media}{$media}{path}; my $target = $ent->{target}; my $srpms = $ent->{srpms} or next; - + my $user = get_author_email($ent->{user}) || $config->{packager}; $user =~ s/([<>])/\\$1/g; - + # Local pathnames my $done_dir = "$done/$path"; my $todo_dir = "$todo/$path"; - + # Make sure these exist make_path($done_dir); make_path($todo_dir); - + #plog('DEBUG', "searching a bot to compile @$srpms"); - + # count noarch todos only once even if searching multiple bots my $noarch_countflag = 0; - + my $arch_list = find { ref($_) eq 'ARRAY' } $config->{arch}, (ref($config->{arch}) eq 'HASH' ? ($config->{arch}{$target}, $config->{arch}{default}) : ()); my @arch_list = $arch_list ? @$arch_list : keys %{$config->{bot}}; # need to find a bot for each arch foreach my $arch (@arch_list) { - + # Skip this arch if package is already building as noarch or for this arch # or if it should not be built on this arch next if $pkg_tree{$prefix}{media}{$media}{arch}{noarch}; next if $pkg_tree{$prefix}{media}{$media}{arch}{$arch}; next if $pkg_tree{$prefix}{media}{$media}{excluded_arch}{$arch}; - + # If all packages in a group are noarch, consider the entire group # as noarch # my $noarch = 1; $noarch = 0 if any { !check_noarch("$todo_dir/${prefix}_$_") } @$srpms; - + #plog("@$srpms is noarch") if $noarch; my $excluded = any { !check_arch("$todo_dir/${prefix}_$_", $arch) } @$srpms; @@ -695,7 +695,7 @@ sub warn_about_failure { my ($user, $ent, $arch, $fail_dir, $path, $prefix) = @_; my $text = join("\n", "Build of the following packages failed:\n", map { "- $_" } @{$ent->{srpms}}) . "\n"; my $srpms = join(' ', @{$ent->{srpms}}, undef); - + my $to = get_author_email($user) || "Unknown <$config->{admin}>"; my $cc; my $fpath = "$config->{http_queue}/failure/$path/$prefix"; @@ -706,11 +706,11 @@ sub warn_about_failure { $text .= "Reason:\n"; $text .= read_file("$fail_dir/$prefix/log/status.log"); $text .= "\nLog files generated:\n"; - + opendir my $DP1, "$fail_dir/$prefix/log/"; foreach my $f1 (sort(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) { next if $f2 =~ m/^\./; @@ -719,7 +719,7 @@ sub warn_about_failure { closedir $DP2; } closedir $DP1; - + sendmail($to, $cc, "Rebuild failed on $arch for $srpms", $text, "Ulri the scheduler bot <$config->{admin}>", 0, $config); @@ -739,7 +739,7 @@ sub get_pid_from_file { sub create_file { my $file = shift; my @contents = @_; - + open my $FILE, ">$file" or die "FATAL: can't open $file for writing"; print $FILE "@contents"; } @@ -767,7 +767,7 @@ __END__ Discussion ---------- - + 20060802 (Warly) * I prefer creating a separate scheduler, so that it can eventually call |