diff --git a/lib/OpenQA/Shared/Plugin/Gru.pm b/lib/OpenQA/Shared/Plugin/Gru.pm index 27229eb87cfc..9f4b4b2eab84 100644 --- a/lib/OpenQA/Shared/Plugin/Gru.pm +++ b/lib/OpenQA/Shared/Plugin/Gru.pm @@ -34,6 +34,7 @@ sub register_tasks { qw(OpenQA::Task::Job::Limit), qw(OpenQA::Task::Job::ArchiveResults), qw(OpenQA::Task::Job::FinalizeResults), + qw(OpenQA::Task::Job::HookScript), qw(OpenQA::Task::Iso::Schedule), qw(OpenQA::Task::Bug::Limit), ); diff --git a/lib/OpenQA/Task/Job/FinalizeResults.pm b/lib/OpenQA/Task/Job/FinalizeResults.pm index 6202e232d377..3d6c2086808b 100644 --- a/lib/OpenQA/Task/Job/FinalizeResults.pm +++ b/lib/OpenQA/Task/Job/FinalizeResults.pm @@ -43,24 +43,24 @@ sub _finalize_results { sub _run_hook_script ($minion_job, $openqa_job, $app, $guard) { my $trigger_hook = $openqa_job->settings_hash->{_TRIGGER_JOB_DONE_HOOK}; + return undef if defined $trigger_hook && !$trigger_hook; return undef unless my $result = $openqa_job->result; + my $hooks = $app->config->{hooks}; my $key = "job_done_hook_$result"; my $hook = $ENV{'OPENQA_' . uc $key} // $hooks->{lc $key}; $hook = $hooks->{job_done_hook} if !$hook && ($trigger_hook || $hooks->{"job_done_hook_enable_$result"}); return undef unless $hook; + my $timeout = $ENV{OPENQA_JOB_DONE_HOOK_TIMEOUT} // '5m'; my $kill_timeout = $ENV{OPENQA_JOB_DONE_HOOK_KILL_TIMEOUT} // '30s'; + $guard->abort(1); - my ($rc, $out) = _done_hook_new_issue($openqa_job, $hook, $timeout, $kill_timeout); - $minion_job->note(hook_cmd => $hook, hook_result => $out, hook_rc => $rc); -} -sub _done_hook_new_issue ($openqa_job, $hook, $timeout, $kill_timeout) { - my $id = $openqa_job->id; - my $out = qx{timeout -v --kill-after="$kill_timeout" "$timeout" $hook $id}; - return ($?, $out); + my $id = $app->minion->enqueue( + hook_script => [$hook, $openqa_job->id, {timeout => $timeout, kill_timeout => $kill_timeout}]); + $minion_job->note(hook_job => $id); } 1; diff --git a/lib/OpenQA/Task/Job/HookScript.pm b/lib/OpenQA/Task/Job/HookScript.pm new file mode 100644 index 000000000000..9c49273678e3 --- /dev/null +++ b/lib/OpenQA/Task/Job/HookScript.pm @@ -0,0 +1,23 @@ +# Copyright 2022 SUSE LLC +# SPDX-License-Identifier: GPL-2.0-or-later + +package OpenQA::Task::Job::HookScript; +use Mojo::Base 'Mojolicious::Plugin', -signatures; + +sub register ($self, $app, $config) { + $app->minion->add_task(hook_script => \&_hook_script); +} + +sub _hook_script ($job, $hook, $openqa_job_id, $options) { + my $timeout = $options->{timeout}; + my $kill_timeout = $options->{kill_timeout}; + my ($rc, $out) = _done_hook_new_issue($openqa_job_id, $hook, $timeout, $kill_timeout); + $job->note(hook_cmd => $hook, hook_result => $out, hook_rc => $rc); +} + +sub _done_hook_new_issue ($openqa_job_id, $hook, $timeout, $kill_timeout) { + my $out = qx{timeout -v --kill-after="$kill_timeout" "$timeout" $hook $openqa_job_id}; + return ($?, $out); +} + +1; diff --git a/t/10-jobs.t b/t/10-jobs.t index 60bea8508a2a..ab97e5c9edb2 100644 --- a/t/10-jobs.t +++ b/t/10-jobs.t @@ -495,9 +495,10 @@ subtest 'carry over, including soft-fails' => sub { }; subtest 'external hook is called on done job if specified' => sub { - my $task_mock = Test::MockModule->new('OpenQA::Task::Job::FinalizeResults', no_auto => 1); + my $task_mock = Test::MockModule->new('OpenQA::Task::Job::HookScript', no_auto => 1); $task_mock->redefine( - _done_hook_new_issue => sub ($openqa_job, $hook, $timeout, $kill_timeout) { + _done_hook_new_issue => sub ($openqa_job_id, $hook, $timeout, $kill_timeout) { + my $openqa_job = $t->app->schema->resultset('Jobs')->find($openqa_job_id); $openqa_job->update({reason => "timeout --kill-after=$kill_timeout $timeout $hook"}) if $hook; }); $job->done;