Конвейер Jenkins - пользовательское поведение тайм-аута - PullRequest
0 голосов
/ 31 октября 2018

Мне нужно пользовательское поведение для функции тайм-аута. Например, когда я использую:

timeout(time: 10, unit: 'MINUTES') {
    doSomeStuff()        
}

завершает функцию doSomeStuff ().

Чего я хочу добиться, это не прекратить выполнение функции, а вызывать другую функцию каждые 10 минут, пока doSomeStuff () не завершится с выполнением. Я не могу использовать плагин Build-timeout от Jenkins, так как мне нужно применить это поведение к конвейерам. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 05 ноября 2018

В случае, если у кого-то еще есть такая же проблема: после некоторого исследования, мне пришло в голову решить мою проблему, это изменить плагин уведомлений для конвейера jenkins, чтобы добавить новое поле, которое будет содержать значение времени (в минутах) для отсрочки вызова URL. В самом коде, где был вызван URL, я поместил эти строки в новый поток и позволил этому потоку бездействовать в течение необходимого количества времени перед выполнением оставшегося кода. Примерно так:

@Override
public void onStarted(final Run r, final TaskListener listener) {
    HudsonNotificationProperty property = (HudsonNotificationProperty) r.getParent().getProperty(HudsonNotificationProperty.class);
    int invokeUrlTimeout = 0;
    if (property != null && !property.getEndpoints().isEmpty()){
        invokeUrlTimeout = property.getEndpoints().get(0).getInvokeUrlTimeout();
    }
    int finalInvokeUrlTimeout = invokeUrlTimeout;
    new Thread(() -> {
        sleep(finalInvokeUrlTimeout * 60 * 1000);
        Executor e = r.getExecutor();
        Phase.QUEUED.handle(r, TaskListener.NULL, e != null ? System.currentTimeMillis() - e.getTimeSpentInQueue() : 0L);
        Phase.STARTED.handle(r, listener, r.getTimeInMillis());
    }).start();
}

Возможно, не лучшее решение, но оно работает для меня, и я надеюсь, что оно поможет и другим людям.

...