tutorial significado logo jenkins

logo - jenkins significado



¿Cómo detener un trabajo zombie imparable en Jenkins sin reiniciar el servidor? (18)

Nuestro servidor Jenkins tiene un trabajo que ha estado funcionando durante tres días, pero no está haciendo nada. Al hacer clic en la pequeña X en la esquina no se hace nada, y el registro de salida de la consola tampoco muestra nada. Revisé nuestros servidores de compilación y el trabajo en realidad no parece funcionar.

¿Hay alguna manera de decirle a Jenkins que el trabajo está "terminado", editando algún archivo, bloqueo o algo así? Dado que tenemos muchos trabajos, realmente no queremos reiniciar el servidor.


Aquí es cómo resolví este problema en la versión 2.100 con Blue Ocean

  • Los únicos complementos que he instalado son para bitbucket.
  • Solo tengo un solo nodo.

ssh en mi caja de Jenkins
cd ~/.jenkins (donde guardo jenkins)
cd job/<job_name>/branches/<problem_branch_name>/builds
rm -rf <build_number>

Después de esto, puede opcionalmente cambiar el número en nextBuildNumber (lo hice)

Finalmente, reinicié jenkins (los brew services restart jenkins ) Este paso obviamente será diferente dependiendo de cómo administre e instale Jenkins.



La primera solución propuesta es bastante cercana. Si usas stop () en lugar de interrupt (), incluso mata a los hilos fugitivos, que se ejecutan infinitamente en una secuencia de comandos groovy del sistema. Esto matará cualquier compilación que se ejecute para un trabajo. Aquí está el código:

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


La respuesta de Alexandru Bantiuc funcionó bien para detener la compilación, pero mis ejecutores seguían apareciendo como ocupados. Pude borrar el estado ocupado del ejecutor usando lo siguiente

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() } } } }


La respuesta principal casi funcionó para mí, pero tuve un problema importante: tenía un gran número (~ 100) de trabajos zombies debido a un reinicio de Jenkins particularmente mal sincronizado, por lo que encontrar manualmente el nombre del trabajo y el número de compilación de cada uno cada trabajo zombie y luego matarlos manualmente era inviable. Así es como encontré y maté automáticamente los trabajos de zombies:

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

Este script realiza un ciclo sobre todas las compilaciones de todos los trabajos y usa getResult().equals(null) para determinar si el trabajo ha finalizado o no. Una compilación que está en la cola pero aún no se ha iniciado no se repetirá (ya que esa compilación no estará en job.builds ), y una compilación que ya haya finalizado devolverá algo distinto de null para build.getResult() . Un trabajo legítimamente en ejecución también tendrá un resultado de compilación de null , por lo tanto, asegúrese de no tener trabajos en ejecución que no quiera matar antes de ejecutar esto.

Los múltiples bucles anidados son principalmente necesarios para descubrir cada sucursal / PR para cada repositorio en un proyecto de Tubería Multibranqueo; si no está utilizando las tuberías multibranch, puede recorrer todos sus trabajos directamente con algo como Jenkins.instance.getItems().each .


Me ha sucedido el mismo problema dos veces, el único sofá fijo ha sido reiniciar el servidor Tomcat y reiniciar la compilación.


Miré la fuente de Jenkins y parece que lo que estoy tratando de hacer es imposible, porque parece que detener un trabajo se realiza a través de una interrupción de subprocesos. No tengo idea de por qué el trabajo está esperando ...

Editar:

Posibles razones para trabajos imparables:

  • si Jenkins está atrapado en un ciclo infinito, nunca puede ser abortado.
  • si Jenkins está haciendo una red o archivo de E / S dentro de la máquina virtual Java (como la copia larga de archivos o la actualización SVN), no se puede anular.

Puede copiar el trabajo y eliminar el anterior. Si no importa, has perdido los registros de compilación anteriores.


Si tiene un trabajo Pipeline imparable, intente lo siguiente:

  1. Anule el trabajo haciendo clic en la X roja al lado de la barra de progreso de compilación
  2. Haga clic en "Pausar / reanudar" en la compilación para pausar
  3. Haga clic en "Pausar / reanudar" nuevamente para reanudar la construcción

Jenkins se dará cuenta de que el trabajo debe finalizar y detiene la construcción


Supongo que es demasiado tarde para responder, pero puedo ayudar a algunas personas.

  1. Instala el plugin de monitoreo. ( http://wiki.jenkins-ci.org/display/JENKINS/Monitoring )
  2. Ir a jenkinsUrl / monitoring / nodes
  3. Ve a la sección de Subprocesos en la parte inferior
  4. Haga clic en el botón de detalles a la izquierda del maestro
  5. Ordenar por tiempo de usuario (ms)
  6. Luego mira el nombre del hilo, tendrás el nombre y el número de la construcción
  7. Mátalo

No tengo suficiente reputación para publicar imágenes lo siento.

Espero que pueda ayudar


También tuve el mismo problema y lo solucioné a través de Jenkins Console.

Ve a "Gestionar Jenkins"> "Consola de scripts" y ejecuta un script:

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

Simplemente habrá especificado su JobName y JobNumber.


Tenía este mismo problema, pero no había hilo de la pila. Eliminamos el trabajo al usar este fragmento en la consola de Jenkins. Reemplace jobname y buil dnumber con el suyo.

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


Una utilidad que escribí llamada jkillthread se puede usar para detener cualquier hilo en cualquier proceso de Java, siempre que pueda iniciar sesión en la máquina que ejecuta el servicio bajo la misma cuenta.


Una vez que encontré una compilación que no pudo ser detenida por la "Consola de Script". Finalmente resolví el problema con estos pasos:

ssh onto the jenkins server cd to .jenkins/jobs/<job-name>/builds/ rm -rf <build-number> restart jenkins


Uso el complemento de supervisión para esta tarea. Después de la instalación del complemento

  1. Vaya a Administrar Jenkins> Monitoreo del maestro Hudson / Jenkins
  2. Expande los Detalles de los hilos, el pequeño enlace azul en el lado derecho
  3. Buscar el nombre del trabajo que está colgado

    El nombre del hilo comenzará así

    Executor #2 for master : executing <your-job-name> #<build-number>

  4. Haga clic en el botón redondo rojo que se encuentra a la derecha de la tabla de la línea que su trabajo deseado tiene


Usualmente uso jenkins-cli en tales casos. Puede descargar el jar desde una página http://your-jenkins-host:PORT/cli . Entonces corre

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

Información auxiliar:

También puede pasar un rango de compilaciones como 350:400 . Ayuda general disponible ejecutando

java -jar jenkins-cli.jar help

Ayuda contextual del comando para delete-builds

java -jar jenkins-cli.jar delete-builds


Vaya a "Gestionar Jenkins"> "Consola de scripts" para ejecutar un script en su servidor para interrumpir el hilo colgante.

Puede obtener todos los hilos en vivo con Thread.getAllStackTraces() e interrumpir el que está colgado.

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

ACTUALIZAR:

La solución anterior que usa subprocesos puede no funcionar en las versiones más recientes de Jenkins. Para interrumpir las tuberías congeladas, consulte this solución (por alexandru-bantiuc ) en su lugar y ejecute:

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


El plugin Build-timeout puede ser útil para estos casos. Matará el trabajo automáticamente si lleva demasiado tiempo.