Як встановити `killSoftly` для конкретної роботи Дженкінса?


11

Моя конструкція Дженкінса висить між етапами складання та після збирання.

Вихід з консолі показує, що очікується 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.

Однак мені потрібен спосіб встановити варіант лише для певних робочих місць, не возившись із глобальними налаштуваннями Дженкінса (я б не хотів возитися з іншими проектами).

Редагувати:

Коли я вручну припиняю роботу, перед кроком [CucumberReport] звіти про огірки все ще створюються.

Я також перевірив Скасувати збірку, якщо вона застрягла у вікні параметрів середовища побудови, із встановленою стратегією No Activityтайм-аут (Час очікування секунд = 2).

Коли я будую проект із цими налаштуваннями, збірка не завершиться, якщо "Перервано через 0 секунд", показане в Історії збірок, як і раніше, але вихід консолі буде таким же. (Нічого не зміниться. Звіти про огірки будуть створені, але через певний час очікування).


Що ви хочете досягти за допомогою параметра? Можливо, для цього є простіше рішення.
Майкл Кеммерцелл

Я хочу скоротити час очікування після фази збірки. Як видно з консольного виходу, між кроками збирання та після збирання існує 6-хвилинне очікування.
Mate Mrše

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

Чи можете ви бути більш конкретними щодо того, які частини трубопроводу будуть представляти інтерес, щоб я міг редагувати та ділитися ними, оскільки я не в змозі поділитися фактичним кодом?
Mate Mrše

Ви не можете просто встановити timeoutваріант у своїй трубі? Ви обов'язково повинні розмістити спрощену версію своєї труби. Важко «здогадатися», що може бути не так. Також це питання, ймовірно, краще підходить для веб-сайту devops.stackexchange.com
tftd

Відповіді:


4

Це НЕ представляється можливим , щоб вибрати значення завдання специфічного дляSoftKillWaitSeconds (значення виводиться з ядра Jenkins в точці , де ім'я завдання невідомо).

Моя рекомендація полягає в тому, щоб самостійно зафіксувати обробку абортів у вашій роботі , тому це не буде залежати від "м'якого тайм-ауту вбивства". Якщо ви працюєте в системі Unix-ish, ви можете забезпечити це, запустивши свою роботу в новій групі процесів ( set -mв bash) і (наприклад) встановивши належну пастку виходу.


Оскільки я новачок у Дженкінса, чи можете ви розширити питання про "запуск своєї роботи в новій групі процесів (встановити -m в bash) та (наприклад) встановити належну пастку виходу"?
Mate Mrše

Це не пов’язано з Дженкінсом. Ви можете використовувати цей підхід, якщо ваше завдання передбачає крок збирання "Виконати оболонку" (або якщо ви можете змінити його, щоб це було). Потім використовуйте "set -m", щоб створити нову групу процесів, і використовуйте пастку, як показано тут, щоб гарантувати, що всі процеси в групі загинуть.
Алекс О

3

Ми використовуємо плагін Build-timeout для вбивства застряглих завдань із встановленою на No Activityабо Absolute. Для мене це хороший підхід, коли ви використовуєте проекти фрістайлу. Причина, чому ваша збірка "Аборт через 0 секунд", полягає в тому, що, швидше за все, є незакінчені дочірні процеси. З документації :

Оскільки Java дозволяє переривати нитки лише у наборі фіксованих місць, залежно від того, як висить збірка, операція переривання може не набути чинності. Наприклад,

  • якщо Дженкінс чекає завершення дочірніх процесів, він може перервати відразу.
  • якщо Дженкінс застряг у нескінченному циклі, він ніколи не може бути перерваний.
  • якщо Дженкінс здійснює мережевий або файловий введення / вивід у Java VM (наприклад, тривала копія файлу або оновлення SVN), це не може бути перервано.

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

  1. Перейдіть до пункту "Керування Дженкінсом"> "Налаштування системи".
  2. Позначте "Змінні середовища" у розділі "Глобальні властивості".
  3. Додати ім’я змінної середовища = "GLOBAL_TIMEOUT_MINUTES" значення = "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


Однак, запрошений на корисну інформацію, проте не вирішує мою проблему. Я вже намагався створити плагін тайм-аута, але не мав успіху.
Mate Mrše
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.