Come impostare `killSoftly` per uno specifico lavoro Jenkins?


11

La mia build Jenkins si blocca tra i passaggi build e post-build.

L'output della console mostra che c'è un'attesa di 6 minuti (ma ho visto attendere fino a un'ora):

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

Ho trovato questo e questi quesiti che presentano problemi simili e dicono che la soluzione è -DSoftKillWaitSeconds=0in atto jenkins.xml.

Tuttavia, ho bisogno di un modo per impostare l'opzione solo per lavori particolari, senza fare confusione con le impostazioni globali di Jenkins (non vorrei fare confusione con altri progetti).

MODIFICARE:

Quando interrompo manualmente il lavoro, prima del passaggio [CucumberReport], i rapporti di Cucumber vengono comunque generati.

Ho anche selezionato Interrompi la build se è selezionata la casella di controllo nelle opzioni Ambiente di creazione, con la strategia di No Activitytimeout impostata su (Timeout secondi = 2).

Quando creo il progetto con queste impostazioni, la compilazione fallirà con "Interrotto dopo 0 secondi" mostrato nella Cronologia build, come in precedenza, ma l'output della console sarà lo stesso. (Non cambia nulla, i rapporti sui cetrioli verranno generati ma dopo un certo timeout).


Cosa vuoi ottenere con il parametro? Forse esiste una soluzione più semplice per questo.
Michael Kemmerzell,

Voglio ridurre i tempi di attesa dopo la fase di compilazione. Come si può vedere dall'output della console, è necessario attendere 6 minuti tra i passaggi build e post-build.
Compagna Mrše il

Potete fornire alcune parti della vostra pipeline? Dubito che Jenkins sia semplicemente bloccato: qualcosa deve succedere qui.
Michael Kemmerzell,

Puoi essere più specifico su quali parti della pipeline sarebbero di interesse in modo che io possa modificarne e condividerne alcune perché non riesco a condividere il codice effettivo?
Mate Mrše

Non puoi semplicemente impostare timeoutun'opzione nella tua pipa? Dovresti assolutamente pubblicare una versione semplificata della tua pipe. È difficile "indovinare" cosa potrebbe esserci di sbagliato. Inoltre, questa domanda è probabilmente più adatta per essere su devops.stackexchange.com
tftd

Risposte:


4

Non è possibile selezionare un valore specifico del lavoro perSoftKillWaitSeconds (il valore è derivato dal core Jenkins in un punto in cui il nome del lavoro non è noto).

La mia raccomandazione è quella di correggere la gestione degli interruzioni nel proprio lavoro stesso , quindi non dipenderà da un "timeout di soft kill". Se stai eseguendo un sistema Unix-ish, puoi assicurarlo eseguendo il tuo lavoro in un nuovo gruppo di processi ( set -min bash) e (ad esempio) impostando una trappola di uscita appropriata.


Dato che sono nuovo di Jenkins, potresti espandere "l'esecuzione del tuo lavoro in un nuovo gruppo di processi (imposta -m in bash) e (ad esempio) la creazione di una trappola di uscita corretta"?
Mate Mrše

Questo non è correlato a Jenkins di per sé. È possibile utilizzare questo approccio se il proprio lavoro prevede un passaggio di costruzione "Esegui shell" (o se è possibile modificarlo in tal modo). Quindi usa "set -m" per creare un nuovo gruppo di processi e usa una trap come quella mostrata qui per assicurarti che tutti i processi nel gruppo vengano uccisi.
Alex O

3

Stiamo usando il plug-in Build-timeout per terminare i processi bloccati con la strategia di timeout impostata su No Activityo Absolute. Per me, questo è un buon approccio quando si utilizzano progetti freestyle. Il motivo per cui la tua build è "Interrotta dopo 0 secondi" è che molto probabilmente ci sono processi figlio incompiuti. Dalla documentazione :

Poiché Java consente l'interruzione dei thread solo in un set di posizioni fisse, a seconda di come si blocca una build, l'operazione di interruzione potrebbe non avere effetto. Per esempio,

  • se Jenkins è in attesa del completamento dei processi figlio, può interrompere immediatamente.
  • se Jenkins è bloccato in un ciclo infinito, non può mai essere interrotto.
  • se Jenkins sta eseguendo una I / O di rete o di file all'interno della VM Java (come una copia di file prolungata o un aggiornamento SVN), non può essere interrotto.

Potresti provare la strategia di timeout assoluto. È possibile definire una variabile globale, in modo da non ripetere il valore di timeout nei lavori:

  1. Vai su "Gestisci Jenkins"> "Configura sistema".
  2. Seleziona "Variabili d'ambiente" in "Proprietà globali".
  3. Aggiungi un nome di variabile d'ambiente = "GLOBAL_TIMEOUT_MINUTES" valore = "20".
  4. Vai a una pagina di configurazione di un progetto.
  5. Seleziona "Annulla la build se è bloccata" in "Build Environment".
  6. Selezionare "Assoluto" per "Strategia di timeout". Naturalmente, applicabile anche ad altre strategie.
  7. Impostare "$ {GLOBAL_TIMEOUT_MINUTES}" per "Timeout".
  8. Imposta l'azione di timeout "Interrompi build".

Se non funziona, puoi provare a cercare nei log https: // your-jenkins-server / log o in un dump del thread.
L'impiccagione potrebbe essere causata dalla nuova / vecchia versione di un plugin. Prova a trovare quali sono i processi figlio incompiuti. Prova a disabilitare le azioni post-build una per una per trovare quella che potrebbe essere la causa del problema. Puoi vedere /superuser/1401879/debugging-what-happens-when-a-jenkins-build-unexpectedly-pauses-or-hangs


Eseguito l'upgrade per informazioni utili, tuttavia, non risolve il mio problema. Ho già provato a creare plug-in timeout ma senza successo.
Compagna Mrše il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.