Как установить `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

KB
источник
Голосование за полезную информацию, однако, не решает мою проблему. Я уже пробовал построить плагин тайм-аута, но безуспешно.
Мате Мрше