В моем тестировании шаг конвейерного тайм-аута уничтожит зависший процесс до того, как он достигнет вашего блока catch, поэтому, похоже, нет никакого способа запустить «jstack» (например), потому что слишком поздно:
try{
timeout(time: 3, unit: 'SECONDS') {
sh "some slow/hanging java process"
}
} catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) {
//check that the cause is org.jenkinsci.plugins.workflow.steps.TimeoutStepExecution.ExceededTimeout
// then try to run jstack on all java processes on the machine.
// but that won't work because the offending process is already gone,
// "timeout" killed it...
}
В целом, как мне отладить процесс, который занимает слишком много времени, не убивая его?
Единственное решение, которое я могу придумать, действительно ужасно, что-то вроде этого:
def ok = false
def alarmTime = System.currentTimeMillis() + 50000 //just before timeout
parallel main: {
timeout(60000) {
//run java
ok = true
}
}, watcher: {
waitUntil {
ok || System.currentTimeMillis() > alarmTime
}
if (!ok) {
//perform debugging just before timeout fires.
}
}
Но это ужасно в коде и в выводе ...
ОБНОВЛЕНИЕ: Я открыл JENKINS-54415 с предложением исправить это.