Come fermare un lavoro di zombi inarrestabile su Jenkins senza riavviare il server?

Il nostro server Jenkins ha un lavoro che è in esecuzione da tre giorni, ma non sta facendo nulla. Fare clic sulla piccola X nell’angolo non fa nulla, e il log di output della console non mostra nulla. Ho controllato i nostri server di compilazione e il lavoro in realtà non sembra funzionare affatto.

C’è un modo per dire a Jenkins che il lavoro è “finito”, modificando un file o un lucchetto o qualcosa del genere? Dato che abbiamo molti lavori, non vogliamo davvero riavviare il server.

Vai su “Manage Jenkins”> “Script Console” per eseguire uno script sul tuo server per interrompere il thread sospeso.

È ansible ottenere tutti i thread Thread.getAllStackTraces() con Thread.getAllStackTraces() e interrompere quello che si blocca.

 Thread.getAllStackTraces().keySet().each() { t -> if (t.getName()=="YOUR THREAD NAME" ) { t.interrupt(); } } 

AGGIORNARE:

La soluzione di cui sopra utilizzando thread potrebbe non funzionare su versioni più recenti di Jenkins. Per interrompere i gasdotti congelati, fare riferimento a questa soluzione (di alexandru-bantiuc ) ed eseguire:

 Jenkins.instance.getItemByFullName("JobName") .getBuildByNumber(JobNumber) .finish( hudson.model.Result.ABORTED, new java.io.IOException("Aborting build") ); 

Ho avuto anche lo stesso problema e lo aggiusto tramite la console Jenkins.

Vai su “Gestisci Jenkins”> “Console degli script” ed esegui uno script:

  Jenkins .instance.getItemByFullName("JobName") .getBuildByNumber(JobNumber) .finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build")); 

Dovrai solo specificare il tuo JobName e JobNumber.

Io uso il plugin di monitoraggio per questa attività. Dopo l’installazione del plugin

  1. Vai a Gestire Jenkins> Monitoraggio del maestro Hudson / Jenkins
  2. Espandi i dettagli dei fili, il piccolo link blu sul lato destro
  3. Cerca il nome del lavoro che è stato appeso

    Il nome del Thread inizierà così

    Executor #2 for master : executing #

  4. Fare clic sul pulsante rosso, rotondo sulla destra della tabella della linea che il lavoro desiderato ha

Una volta ho incontrato una build che non poteva essere fermata dalla “Script Console”. Finalmente ho risolto il problema con questi passaggi:

 ssh onto the jenkins server cd to .jenkins/jobs//builds/ rm -rf  restart jenkins 

La prima soluzione proposta è abbastanza vicina. Se usi stop () invece di interrupt () uccide persino i thread in fuga, che funzionano all’infinito in uno script di sistema groovy. Questo ucciderà qualsiasi build, che viene eseguita per un lavoro. Ecco il codice:

 Thread.getAllStackTraces().keySet().each() { if (it.name.contains('YOUR JOBNAME')) { println "Stopping $it.name" it.stop() } } 

Nel caso in cui tu abbia un Multibranch Pipeline -job (e tu sei un amministratore di Jenkins), usa in Jenkins Script Console questo script:

 Jenkins.instance .getItemByFullName("") .getBranch("") .getBuildByNumber() .finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build")); 

Da https://issues.jenkins-ci.org/browse/JENKINS-43020

Se hai un lavoro in Pipeline inarrestabile, prova quanto segue:

  1. Annullare il lavoro facendo clic sulla X rossa accanto alla barra di avanzamento della build
  2. Fare clic su “Pausa / Riprendi” sulla build per mettere in pausa
  3. Clicca di nuovo su “Pausa / riprendi” per riprendere la costruzione

Sospendi / riprendi il lavoro della pipeline

Jenkins si renderà conto che il lavoro dovrebbe essere interrotto e interrompe la costruzione

Build-timeout Plugin può essere utile per questi casi. Ucciderà automaticamente il lavoro se ci vorrà troppo tempo.

Immagino sia troppo tardi per rispondere, ma il mio aiuto è di alcune persone.

  1. Installa il plugin di monitoraggio. ( http://wiki.jenkins-ci.org/display/JENKINS/Monitoring )
  2. Vai a jenkinsUrl / monitoring / nodes
  3. Vai alla sezione Thread in basso
  4. Fare clic sul pulsante dettagli a sinistra del master
  5. Ordina per Tempo utente (ms)
  6. Quindi guarda il nome del thread, avrai il nome e il numero della build
  7. Uccidilo

Non ho abbastanza reputazione per pubblicare immagini mi dispiace.

Spero che possa aiutare

Ho esaminato la fonte Jenkins e sembra che ciò che sto cercando di fare sia imansible, perché l’interruzione di un lavoro sembra essere eseguita tramite un’interruzione del thread. Non ho idea del perché il lavoro sia sospeso …

Modificare:

Possibili ragioni per lavori inarrestabili:

  • se Jenkins è bloccato in un ciclo infinito, non può mai essere interrotto.
  • se Jenkins sta eseguendo un I / O di rete o file all’interno della Java VM (come una copia di file estesa o un aggiornamento SVN), non può essere interrotto.

La risposta migliore ha quasi funzionato per me, ma ho avuto un grosso problema: ho avuto un numero molto elevato (~ 100) di lavori zombie a causa di un riavvio di Jenkins particolarmente scadente, in modo da trovare manualmente il nome del lavoro e il numero di build di ciascuno e ogni lavoro di zombi e poi ucciderli manualmente era imansible. Ecco come ho trovato e ucciso automaticamente i lavori degli zombi:

 Jenkins.instance.getItemByFullName(multibranchPipelineProjectName).getItems().each { repository-> repository.getItems().each { branch-> branch.builds.each { build-> if (build.getResult().equals(null)) { build.doKill() } } } } 

Questo script esegue il ciclo su tutte le build di tutti i lavori e utilizza getResult().equals(null) per determinare se il lavoro è stato completato o meno. Una build che è nella coda ma non ancora avviata non verrà iterata (dal momento che quella build non sarà in job.builds ) e una build che è già stata completata restituirà qualcosa di diverso da null per build.getResult() . Un lavoro in esecuzione legittima avrà anche un risultato di compilazione null , quindi assicurati di non avere lavori in esecuzione che non vuoi uccidere prima di eseguirlo.

I loop multipli annidati sono principalmente necessari per scoprire ogni ramo / PR per ogni repository in un progetto Multibranch Pipeline; se non stai usando Pipeline Multibranch puoi semplicemente eseguire il loop su tutti i tuoi lavori direttamente con qualcosa come Jenkins.instance.getItems().each .

Di solito uso jenkins-cli in questi casi. Puoi scaricare il jar da una pagina http://your-jenkins-host:PORT/cli . Quindi corri

 java -jar jenkins-cli.jar delete-builds name_of_job_to_delete hanging_job_number 

Informazioni ausiliarie:

Puoi anche passare una serie di build come 350:400 . Aiuto generale disponibile eseguendo

 java -jar jenkins-cli.jar help 

Aiuto del comando contestuale per delete-builds di

 java -jar jenkins-cli.jar delete-builds 

La risposta di Alexandru Bantiuc ha funzionato bene per me per fermare la costruzione, ma i miei esecutori erano ancora impegnati. Sono stato in grado di cancellare lo stato occupato del executor usando quanto segue

 server_name_pattern = /your-servers-[1-5]/ jenkins.model.Jenkins.instance.getComputers().each { computer -> if (computer.getName().find(server_name_pattern)) { println computer.getName() execList = computer.getExecutors() for( exec in execList ) { busyState = exec.isBusy() ? ' busy' : ' idle' println '--' + exec.getDisplayName() + busyState if (exec.isBusy()) { exec.interrupt() } } } } 

Ho avuto lo stesso problema per me due volte ora, l’unico sofà fisso è stato quello di riavviare il server tomcat e riavviare la build.

Un’utilità che ho scritto chiamata jkillthread può essere utilizzata per interrompere qualsiasi thread in qualsiasi processo Java, a condizione che sia ansible accedere alla macchina che esegue il servizio con lo stesso account.

Aveva lo stesso problema ma non c’era lo stack thread. Abbiamo eliminato il lavoro utilizzando questo snippet nella console di Jenkins. Sostituisci jobname e builumber con il tuo.

 def jobname = "Main/FolderName/BuildDefinition" def buildnum = 6 Jenkins.instance.getItemByFullName(jobname).getBuildByNumber(buildnum).delete(); 

Ho avuto molti lavori zombi, quindi ho usato il seguente script:

 for(int x = 1000; x < 1813; x = x + 1) { Jenkins .instance.getItemByFullName("JOBNAME/BRANCH") .getBuildByNumber(x) .finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build")) } 

Puoi semplicemente copiare il lavoro ed eliminare quello vecchio. Se non importa che hai perso i vecchi log di compilazione.

Ecco come ho risolto questo problema nella versione 2.100 con Blue Ocean

  • Gli unici plugin che ho installato sono per bitbucket.
  • Ho solo un singolo nodo.

ssh nella mia scatola di Jenkins
cd ~/.jenkins (dove tengo jenkins)
cd job//branches//builds
rm -rf

Dopodiché puoi cambiare il numero in nextBuildNumber (l’ho fatto)

Infine, ho riavviato jenkins (i brew services restart jenkins ) Questo passaggio sarà ovviamente diverso a seconda di come gestisci e installa Jenkins.

Inserisci l’interfaccia utente blu-oceano. Prova a interrompere il lavoro da lì.