Как установить `killSoftly` для конкретной работы Дженкинса?


11

Моя сборка Jenkins зависает между этапами сборки и после сборки.

Вывод на консоль показывает, что ожидание составляет 6 минут (но я видел ожидание до одного часа):

10:53:26 BUILD FAILED in 1m 7s
10:53:26 4 actionable tasks: 4 executed
10:53:26 Build step 'Invoke Gradle script' changed build result to FAILURE
10:53:26 Build step 'Invoke Gradle script' marked build as failure
11:09:29 [CucumberReport] Using Cucumber Reports version 4.9.0

Я нашел этот и этот вопросы, которые имеют похожие проблемы, и они говорят, что решение находится -DSoftKillWaitSeconds=0в jenkins.xml.

Однако мне нужен способ установить опцию только для определенных заданий, не связываясь с глобальными настройками Jenkins (я бы не хотел связываться с другими проектами).

РЕДАКТИРОВАТЬ:

Когда я вручную отменяю задание, перед шагом [CucumberReport] отчеты о Cucumber все еще генерируются.

Я также установил флажок « Прервать сборку, если он застрял» в параметрах «Среда сборки» со стратегией тайм-аута No Activity(Тайм-аут секунд = 2).

Когда я собираю проект с этими настройками, сборка завершится с ошибкой «Aborted через 0 секунд», показанной в истории сборки, как и раньше, но вывод консоли будет таким же. (Ничего не меняется, отчеты о огурцах будут создаваться, но по истечении определенного времени ожидания).


Чего вы хотите добиться с помощью параметра? Может быть, есть более простое решение для этого.
— Майкл Кеммерцелль

Я хочу сократить время ожидания после фазы сборки. Как видно из вывода консоли, между этапами сборки и пост-сборки требуется 6 минут ожидания.
— Мате Мрше

Можете ли вы предоставить некоторые части вашего трубопровода? Я сомневаюсь, что Дженкинс просто застрял - здесь что-то должно произойти.
— Майкл Кеммерцелль

Можете ли вы более конкретно указать, какие части конвейера будут интересны, чтобы я мог редактировать и делиться некоторыми, потому что не могу поделиться реальным кодом?
— Мате Мрше

Разве вы не можете просто установить timeoutопцию в своей трубе? Вы должны обязательно опубликовать упрощенную версию своей трубы. Трудно «угадать», что может быть не так. Кроме того, этот вопрос, вероятно, лучше подходит для того, чтобы быть на devops.stackexchange.com
— tftd

Ответы:


4

Это не представляется возможным , чтобы выбрать значение задания специфичного дляSoftKillWaitSeconds (значение выводится из ядра Jenkins в точке , где имя задания не известно).

Я рекомендую исправить обработку прерывания в вашей работе , чтобы она не зависела от «тайм-аута мягкого уничтожения». Если вы работаете в системе Unix-ish, вы можете убедиться в этом, запустив свою работу в новой группе процессов ( set -mв bash) и (например), настроив правильную ловушку выхода.


Так как я новичок в Jenkins, не могли бы вы подробнее рассказать о «выполнении вашей работы в новой группе процессов (установите -m в bash) и (например) настройке правильной ловушки выхода»?
— Мате Мрше

Это не связано с Дженкинсом как таковым. Вы можете использовать этот подход, если ваша работа включает в себя этап сборки «Execute shell» (или если вы можете изменить его так, как он это делает). Затем используйте «set -m» для создания новой группы процессов и используйте ловушку, как показано здесь, чтобы гарантировать, что все процессы в группе будут убиты.
— Алекс О

3

Мы используем плагин Build-timeout для уничтожения зависших заданий со стратегией тайм-аута, установленной на No Activityили Absolute. Для меня это хороший подход, когда вы используете фристайл-проекты. Причина, по которой ваша сборка «Прервана через 0 секунд», заключается в том, что, скорее всего, есть незавершенные дочерние процессы. Из документации :

Поскольку Java позволяет прерывать потоки только в определенных фиксированных местах, в зависимости от того, как зависает сборка, операция прерывания может не действовать. Например,

  • если Дженкинс ожидает завершения дочерних процессов, он может сразу прерваться.
  • если Дженкинс застрял в бесконечном цикле, он никогда не может быть прерван.
  • если Jenkins выполняет сетевой или файловый ввод-вывод в рамках Java VM (например, длительное копирование файла или обновление SVN), его нельзя прервать.

Вы можете попробовать абсолютную стратегию тайм-аута. Вы можете определить глобальную переменную, чтобы не повторять значение времени ожидания в заданиях:

  1. Перейдите в «Управление Jenkins»> «Настроить систему».
  2. Проверьте «Переменные среды» в «Глобальных свойствах».
  3. Добавьте переменную среды name = "GLOBAL_TIMEOUT_MINUTES" value = "20".
  4. Перейти на страницу конфигурации проекта.
  5. Установите флажок «Прервать сборку, если она застряла» в «Среде сборки».
  6. Выберите «Абсолют» для «Стратегия тайм-аута». Конечно, также применимы к другим стратегиям.
  7. Установите «$ {GLOBAL_TIMEOUT_MINUTES}» для «Тайм-аут».
  8. Установите тайм-аут действия «Прервать сборку».

Если это не работает, вы можете попробовать посмотреть в журналах https: // your-jenkins-server / log или в дампе потока.
Зависание может быть вызвано новой / старой версией плагина. Попытайтесь найти, что является незаконченными дочерними процессами. Попробуйте отключить действия пост-сборки одно за другим, чтобы найти тот, который может быть причиной проблемы. Вы можете увидеть /superuser/1401879/debugging-what-happens-when-a-jenkins-build-unexpectedly-pauses-or-hangs


Голосование за полезную информацию, однако, не решает мою проблему. Я уже пробовал построить плагин тайм-аута, но безуспешно.
— Мате Мрше
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.