Главный ответ почти сработал для меня, но у меня была одна большая проблема: у меня было очень большое количество (~ 100) заданий по зомби из-за особенно неудачного перезапуска Jenkins, поэтому вручную находили имя задания и номер сборки каждого и каждая работа зомби, а затем их ручное убийство были невозможны. Вот как я автоматически нашел и убил работу зомби:
Jenkins.instance.getItemByFullName(multibranchPipelineProjectName).getItems().each { repository->
repository.getItems().each { branch->
branch.builds.each { build->
if (build.getResult().equals(null)) {
build.doKill()
}
}
}
}
Этот скрипт перебирает все сборки всех заданий и использует, getResult().equals(null)
чтобы определить, завершено ли задание или нет. Сборка, которая находится в очереди, но еще не запущена, не будет повторяться (так как эта сборка не будет job.builds
), а уже завершенная сборка будет возвращать что-то другое, чем null
для build.getResult()
. Законно запущенное задание также будет иметь результат сборки null
, поэтому убедитесь, что у вас нет запущенных заданий, которые вы не хотите уничтожать, прежде чем запускать это.
Многократные вложенные циклы в основном необходимы для обнаружения каждой ветви / PR для каждого репозитория в проекте Multichranch Pipeline; если вы не используете многоотраслевые конвейеры, вы можете просто перебрать все ваши задания напрямую, например Jenkins.instance.getItems().each
.