Jenkins管道-自定义超时行为

时间:2018-10-31 09:40:44

标签: jenkins groovy jenkins-pipeline jenkins-groovy

我需要超时功能的自定义行为。例如,当我使用时:

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

它终止doSomeStuff()函数。

我想要实现的不是终止函数的执行,而是每隔10分钟调用一次另一个函数,直到doSomeStuff()执行完成。 我无法使用Jenkins的Build-timeout插件,因为我需要将此行为应用于管道。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果其他人有相同的问题:经过研究后,我想到解决我的问题的唯一方法是修改jenkins管道的notification plugin,以添加新字段会包含时间值(以分钟为单位),以延迟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();
}

也许不是最好的解决方案,但它对我有用,我希望它对其他人也有帮助。