Comment définir `killSoftly` pour un travail Jenkins spécifique?

11

Ma génération Jenkins se bloque entre les étapes de génération et de post-génération.

La sortie de la console montre qu'il y a une attente de 6 minutes (mais j'ai vu des attentes pouvant aller jusqu'à une heure):

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

J'ai trouvé cette et cette question qui ont des problèmes similaires, et ils disent la solution est mise -DSoftKillWaitSeconds=0en jenkins.xml.

Cependant, j'ai besoin d'un moyen de définir l'option pour des travaux particuliers uniquement, sans jouer avec les paramètres globaux de Jenkins (je ne voudrais pas jouer avec d'autres projets).

ÉDITER:

Lorsque j'interromps manuellement le travail, avant l'étape [CucumberReport], les rapports Cucumber sont toujours générés.

J'ai également coché la case Abandonner la génération si elle est bloquée dans les options de l'environnement de génération, avec la stratégie de No Activitydélai d'attente définie sur ( Délai d' expiration secondes = 2).

Lorsque je crée le projet avec ces paramètres, la génération échoue avec "Abandonné après 0 secondes" affiché dans l'historique de génération, comme précédemment, mais la sortie de la console est la même. (Rien ne change, les rapports de concombre seront générés mais après un certain délai).

Mate Mrše
la source
Que voulez-vous réaliser avec le paramètre? Il existe peut-être une solution plus simple à cela.
Michael Kemmerzell
Je veux réduire le temps d'attente après la phase de construction. Comme vous pouvez le voir sur la sortie de la console, il y a une attente de 6 minutes entre les étapes de génération et de post-génération.
Mate Mrše
Pouvez-vous fournir certaines parties de votre pipeline? Je doute que jenkins soit simplement coincé - quelque chose doit arriver ici.
Michael Kemmerzell
Pouvez-vous être plus précis sur les parties du pipeline qui pourraient vous intéresser afin que je puisse en modifier et en partager parce que je ne peux pas partager le code réel?
Mate Mrše
Ne pouvez-vous pas simplement définir une timeoutoption dans votre pipe? Vous devez absolument publier une version simplifiée de votre pipe. Il est difficile de «deviner» ce qui pourrait mal se passer. En outre, cette question est probablement mieux adaptée pour être sur devops.stackexchange.com
tftd

Réponses:

4

Il n'est pas possible de sélectionner une valeur spécifique au travail pourSoftKillWaitSeconds (la valeur est dérivée du noyau Jenkins à un point où le nom du travail n'est pas connu).

Ma recommandation est de corriger la gestion de l'abandon dans votre travail lui - même , de sorte qu'il ne dépendra pas d'un "timeout de mise à zéro progressive". Si vous exécutez sur un système Unix-ish, vous pouvez vous en assurer en exécutant votre travail dans un nouveau groupe de processus ( set -men bash) et (par exemple) en configurant un piège de sortie approprié.

Alex O
la source
Étant donné que je suis nouveau à Jenkins, pourriez-vous développer "l'exécution de votre travail dans un nouveau groupe de processus (définir -m dans bash) et (par exemple) la mise en place d'un piège de sortie approprié"?
Mate Mrše
Ceci n'est pas lié à Jenkins en soi. Vous pouvez utiliser cette approche si votre travail implique une étape de construction "Exécuter le shell" (ou si vous pouvez la modifier pour qu'elle le fasse). Utilisez ensuite "set -m" pour créer un nouveau groupe de processus, et utilisez un piège comme indiqué ici pour vous assurer que tous les processus du groupe seront tués.
Alex O
3

Nous utilisons le plugin Build-timeout pour tuer les travaux bloqués avec une stratégie de délai définie sur No Activityou Absolute. Pour moi, c'est une bonne approche lorsque vous utilisez des projets freestyle. La raison pour laquelle votre génération est "abandonnée après 0 seconde" est qu'il y a très probablement des processus enfants inachevés. De la documentation :

Étant donné que Java autorise uniquement les threads à être interrompus à un ensemble d'emplacements fixes, en fonction de la façon dont une génération se bloque, l'opération d'abandon peut ne pas prendre effet. Par exemple,

  • si Jenkins attend que les processus enfants soient terminés, il peut immédiatement s'arrêter.
  • si Jenkins est coincé dans une boucle infinie, il ne peut jamais être interrompu.
  • si Jenkins effectue un réseau ou des E / S de fichiers dans la machine virtuelle Java (comme une copie de fichier longue ou une mise à jour SVN), il ne peut pas être abandonné.

Vous pouvez essayer la stratégie de temporisation absolue. Vous pouvez définir une variable globale afin de ne pas répéter la valeur du délai d'expiration dans les travaux:

  1. Allez dans "Gérer Jenkins"> "Configurer le système".
  2. Cochez "Variables d'environnement" dans "Propriétés globales".
  3. Ajoutez une variable d'environnement name = "GLOBAL_TIMEOUT_MINUTES" value = "20".
  4. Accédez à une page de configuration d'un projet.
  5. Cochez "Abandonner la build si elle est bloquée" dans "Build Environment".
  6. Sélectionnez "Absolute" pour "Stratégie de temporisation". Bien sûr, également applicable à d'autres stratégies.
  7. Définissez "$ {GLOBAL_TIMEOUT_MINUTES}" pour "Délai d'attente".
  8. Définissez l'action d'expiration "Abandonner la génération".

Si cela ne fonctionne pas, vous pouvez essayer de regarder dans les journaux https: // your-jenkins-server / log ou dans un vidage de thread.
Le blocage peut être provoqué par une nouvelle / ancienne version d'un plugin. Essayez de trouver quels sont les processus enfants inachevés. Essayez de désactiver les actions de post-génération une par une pour trouver celle qui peut être à l'origine du problème. Vous pouvez voir /superuser/1401879/debugging-what-happens-when-a-jenkins-build-unexpectedly-pauses-or-hangs

Ko
la source
Le fait de voter pour des informations utiles, cependant, ne résout pas mon problème. J'ai déjà essayé de construire un plugin de timeout mais sans succès.
Mate Mrše