Skip to content

Commit

Permalink
Move hook scripts into a separate Minion job
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Jun 14, 2022
1 parent 53a0598 commit 8ab07cb
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 9 deletions.
1 change: 1 addition & 0 deletions lib/OpenQA/Shared/Plugin/Gru.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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),
);
Expand Down
14 changes: 7 additions & 7 deletions lib/OpenQA/Task/Job/FinalizeResults.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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;
23 changes: 23 additions & 0 deletions lib/OpenQA/Task/Job/HookScript.pm
Original file line number Diff line number Diff line change
@@ -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;
5 changes: 3 additions & 2 deletions t/10-jobs.t
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 8ab07cb

Please sign in to comment.