El meilleure réponse a presque fonctionné pour moi, mais j'avais un problème majeur : j'avais un très grand nombre (~100) de tâches zombies en raison d'un redémarrage de Jenkins particulièrement mal à propos, donc trouver manuellement le nom de la tâche et le numéro de construction de chaque tâche zombie et ensuite les tuer manuellement était infaisable. Voici comment j'ai trouvé et tué automatiquement les travaux zombies :
Jenkins.instance.getItemByFullName(multibranchPipelineProjectName).getItems().each { repository->
repository.getItems().each { branch->
branch.builds.each { build->
if (build.getResult().equals(null)) {
build.doKill()
}
}
}
}
Ce script boucle sur tous les builds de tous les jobs et utilise getResult().equals(null)
pour déterminer si le travail est terminé ou non. Un build qui est dans la file d'attente mais qui n'a pas encore été lancé ne sera pas itéré (puisque ce build ne sera pas dans la liste des projets de l job.builds
), et un build qui est déjà terminé retournera autre chose que null
pour build.getResult()
. Un travail légitimement exécuté aura également un résultat de construction de null
Il faut donc s'assurer qu'il n'y a pas de tâches en cours d'exécution que vous ne voulez pas tuer avant de l'exécuter.
Les multiples boucles imbriquées sont principalement nécessaires pour découvrir chaque branche/PR pour chaque dépôt dans un projet Multibranch Pipeline ; si vous n'utilisez pas Multibranch Pipelines vous pouvez simplement boucler sur tous vos travaux directement avec quelque chose comme Jenkins.instance.getItems().each
.