Record the errno if exec fails
This commit is contained in:
parent
4ce8239cea
commit
5bb3e2be78
|
@ -161,9 +161,9 @@ sub buildFinished {
|
|||
$runlog->started();
|
||||
|
||||
system("$command") == 0
|
||||
or warn "notification command '$command' failed with exit status $?\n";
|
||||
or warn "notification command '$command' failed with exit status $? ($!)\n";
|
||||
|
||||
$runlog->completed_with_child_error($?);
|
||||
$runlog->completed_with_child_error($?, $!);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -197,7 +197,10 @@ sub completed_with_child_error {
|
|||
if ($child_error == -1) {
|
||||
# -1 indicates `exec` failed, and this is the only
|
||||
# case where the reported errno is valid.
|
||||
$errno = $reported_errno;
|
||||
#
|
||||
# The `+ 0` is because $! is a dual var and likes to be a string
|
||||
# if it can. +0 forces it to not be. Sigh.
|
||||
$errno = $reported_errno + 0;
|
||||
}
|
||||
|
||||
if (WIFEXITED($child_error)) {
|
||||
|
|
50
t/plugins/RunCommand/errno.t
Normal file
50
t/plugins/RunCommand/errno.t
Normal file
|
@ -0,0 +1,50 @@
|
|||
use feature 'unicode_strings';
|
||||
use strict;
|
||||
use warnings;
|
||||
use JSON::MaybeXS;
|
||||
use Setup;
|
||||
|
||||
my %ctx = test_init(
|
||||
hydra_config => q|
|
||||
<runcommand>
|
||||
command = invalid-command-this-does-not-exist
|
||||
</runcommand>
|
||||
|);
|
||||
|
||||
require Hydra::Schema;
|
||||
require Hydra::Model::DB;
|
||||
|
||||
use Test2::V0;
|
||||
|
||||
my $db = Hydra::Model::DB->new;
|
||||
hydra_setup($db);
|
||||
|
||||
my $project = $db->resultset('Projects')->create({name => "tests", displayname => "", owner => "root"});
|
||||
|
||||
# Most basic test case, no parameters
|
||||
my $jobset = createBaseJobset("basic", "runcommand.nix", $ctx{jobsdir});
|
||||
|
||||
ok(evalSucceeds($jobset), "Evaluating jobs/runcommand.nix should exit with return code 0");
|
||||
is(nrQueuedBuildsForJobset($jobset), 1, "Evaluating jobs/runcommand.nix should result in 1 build1");
|
||||
|
||||
(my $build) = queuedBuildsForJobset($jobset);
|
||||
|
||||
is($build->job, "metrics", "The only job should be metrics");
|
||||
ok(runBuild($build), "Build should exit with return code 0");
|
||||
my $newbuild = $db->resultset('Builds')->find($build->id);
|
||||
is($newbuild->finished, 1, "Build should be finished.");
|
||||
is($newbuild->buildstatus, 0, "Build should have buildstatus 0.");
|
||||
|
||||
ok(sendNotifications(), "Notifications execute successfully.");
|
||||
|
||||
subtest "Validate a run log was created" => sub {
|
||||
my $runlog = $build->runcommandlogs->find({});
|
||||
is($runlog->job_matcher, "*:*:*", "An unspecified job matcher is defaulted to *:*:*");
|
||||
is($runlog->command, 'invalid-command-this-does-not-exist', "The executed command is saved.");
|
||||
is($runlog->start_time, within(time() - 1, 2), "The start time is recent.");
|
||||
is($runlog->end_time, within(time() - 1, 2), "The end time is also recent.");
|
||||
is($runlog->exit_code, undef, "This command should not have executed.");
|
||||
is($runlog->error_number, 2, "This command failed to exec.");
|
||||
};
|
||||
|
||||
done_testing;
|
Loading…
Reference in a new issue