Notre serveur Jenkins a un travail qui dure depuis trois jours, mais ne fait rien. Cliquer sur le petit X dans le coin ne fait rien et le journal de sortie de la console ne montre rien non plus. J'ai vérifié sur nos serveurs de build et le travail ne semble pas fonctionner du tout.
Existe-t-il un moyen de dire à Jenkins que le travail est "terminé", en modifiant un fichier, un verrou ou quelque chose? Comme nous avons beaucoup de tâches, nous ne voulons pas vraiment redémarrer le serveur.
Allez dans "Manage Jenkins"> "Script Console" pour exécuter un script sur votre serveur afin d'interrompre le thread suspendu.
Vous pouvez obtenir tous les fils en direct avec Thread.getAllStackTraces()
et interrompre celui qui est en attente.
Thread.getAllStackTraces().keySet().each() {
t -> if (t.getName()=="YOUR THREAD NAME" ) { t.interrupt(); }
}
MISE À JOUR:
La solution ci-dessus utilisant des threads peut ne pas fonctionner avec les versions Jenkins les plus récentes. Pour interrompre des pipelines gelés, reportez-vous à this solution (by alexandru-bantiuc ) et exécutez la commande suivante:
Jenkins.instance.getItemByFullName("JobName")
.getBuildByNumber(JobNumber)
.finish(
hudson.model.Result.ABORTED,
new Java.io.IOException("Aborting build")
);
J'ai également eu le même problème et le réparer via la console Jenkins.
Allez dans "Manage Jenkins"> "Script Console" et lancez un script:
Jenkins .instance.getItemByFullName("JobName")
.getBuildByNumber(JobNumber)
.finish(hudson.model.Result.ABORTED, new Java.io.IOException("Aborting build"));
Vous aurez juste à spécifier votre JobName et JobNumber.
J'utilise le plugin de surveillance pour cette tâche. Après l'installation du plugin
Rechercher le nom du travail qui est bloqué
Le nom du fil va commencer comme ça
Executor #2 for master : executing <your-job-name> #<build-number>
Cliquez sur le bouton rond et rouge à l'extrême droite du tableau de la ligne correspondant à votre travail souhaité.
Une fois, j'ai rencontré une construction qui ne pouvait pas être stoppée par la "Console de script". Enfin, j'ai résolu le problème avec ces étapes:
ssh onto the jenkins server
cd to .jenkins/jobs/<job-name>/builds/
rm -rf <build-number>
restart jenkins
Si vous avez un travail Multibranch Pipelineet que vous êtes un administrateur Jenkins), utilisez-le dans --- (Jenkins Script Console ce script:
Jenkins.instance
.getItemByFullName("<JOB NAME>")
.getBranch("<BRANCH NAME>")
.getBuildByNumber(<BUILD NUMBER>)
.finish(hudson.model.Result.ABORTED, new Java.io.IOException("Aborting build"));
De https://issues.jenkins-ci.org/browse/JENKINS-4302
Si vous n'êtes pas sûr du nom complet (chemin) du travail, vous pouvez utiliser l'extrait de code suivant pour répertorier le nom complet de tous les éléments:
Jenkins.instance.getAllItems(AbstractItem.class).each {
println(it.fullName)
};
De https://support.cloudbees.com/hc/en-us/articles/226941767-Groovy-to-list-all-jobs
La première solution proposée est assez proche. Si vous utilisez stop () au lieu de interruption (), il tue même les threads emballés, qui s'exécutent sans fin dans un script système groovy. Cela supprimera toute construction exécutée pour un travail. Voici le code:
Thread.getAllStackTraces().keySet().each() {
if (it.name.contains('YOUR JOBNAME')) {
println "Stopping $it.name"
it.stop()
}
}
Si vous avez un travail Pipeline imparable, essayez les solutions suivantes:
Jenkins réalisera que le travail doit être terminé et arrête la construction
Plug-in de délai de construction peut être utile dans de tels cas. Si le travail prend trop de temps, le travail sera automatiquement supprimé.
Le réponse maximale a presque fonctionné pour moi, mais j'ai eu un problème majeur: j'ai eu un très grand nombre (~ 100) de travaux de zombies en raison d'un redémarrage de Jenkins particulièrement médiocre, ce qui a permis de rechercher manuellement le travail. nom et numéro de construction de chaque travail de zombie et ensuite les tuer manuellement était infaisable. Voici comment j'ai automatiquement trouvé et tué les jobs zombie:
Jenkins.instance.getItemByFullName(multibranchPipelineProjectName).getItems().each { repository->
repository.getItems().each { branch->
branch.builds.each { build->
if (build.getResult().equals(null)) {
build.doKill()
}
}
}
}
Ce script parcourt toutes les versions de tous les travaux et utilise getResult().equals(null)
pour déterminer si le travail est terminé ou non. Une génération qui est dans la file d'attente mais qui n'a pas encore commencé ne sera pas itérée (car cette construction ne sera pas dans job.builds
), et une version terminée retournera autre chose que null
pour build.getResult()
. Un travail en cours d'exécution légitime aura également un résultat de construction de null
, alors assurez-vous que vous n'avez aucun travail en cours 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 référentiel dans un projet de pipeline multibranches; Si vous n'utilisez pas de pipelines multibranches, vous pouvez simplement relier tous vos travaux directement avec quelque chose comme Jenkins.instance.getItems().each
.
Je suppose qu'il est trop tard pour répondre mais aidez certaines personnes.
Je n'ai pas assez de réputation pour poster des images désolé.
J'espère que ça peut aider
J'ai consulté la source Jenkins et il semble que ce que j'essaie de faire soit impossible, car arrêter un travail semble s'effectuer via une interruption Thread. Je n'ai aucune idée pourquoi le travail est suspendu bien ..
Modifier:
Raisons possibles pour des tâches imparables:
J'utilise habituellement jenkins-cli dans de tels cas. Vous pouvez télécharger le fichier depuis une page http://your-jenkins-Host:PORT/cli
. Puis courir
Java -jar jenkins-cli.jar delete-builds name_of_job_to_delete hanging_job_number
Info auxiliaire:
Vous pouvez également transmettre une série de builds comme 350:400
. Aide générale disponible en cours d'exécution
Java -jar jenkins-cli.jar help
Aide sur la commande contextuelle pour delete-builds
par
Java -jar jenkins-cli.jar delete-builds
Récemment, je suis tombé sur un noeud/agent dont un exécuteur était occupé pendant plusieurs jours par la construction "X" d'un travail de pipeline, bien que la page "travaux" prétendait que la construction "X" n'existait plus (abandonnée après 10 générations ultérieures (!), configuré dans le travail de pipeline). Vérifié que sur le disque: construire "X" était vraiment parti.
La solution: c’est l’agent/le noeud qui a signalé à tort que l’exécuteur occupé était occupé à exécuter la version "X". Interrompre le fil de cet exécuteur l'a immédiatement publié.
def executor = Jenkins.instance.getNode('NODENAME').computer.executors.find {
it.isBusy() && it.name.contains('JOBNAME')
}
println executor?.name
if (executor?.isBusy()) executor.interrupt()
Autres réponses envisagées:
Thread.getAllStackTraces()
: pas de thread correspondant.getBuildByNumber()
: ne s'appliquaient pas car la construction n'était plus vraiment là!Mise à jour:
J'ai de nouveau vécu une situation similaire, dans laquelle un exécuteur testamentaire a été occupé pendant plusieurs jours par la construction d'un pipeline fini (toujours existant). Cet extrait de code était la seule solution efficace.
J'ai eu le même problème à la dernière demi-heure ...
N'a pas été en mesure de supprimer une construction zombie en cours d'exécution dans mon pipeline multi-branches. Même le serveur redémarre par l'interface utilisateur ou même à partir de la ligne de commande via Sudo service jenkins restart
bloquait l'exécution ... La construction n'était pas stoppable ... Elle était toujours réapparue.
Version utilisée: Jenkins ver 2.150.2
J'étais très ennuyé, mais ... en regardant dans le journal de la construction, j'ai trouvé quelque chose d'intéressant à la fin du journal:
Les parties marquées en rouge sont les "parties frustrantes" ... Comme vous pouvez le constater, j'ai toujours voulu abandonner la construction de l'interface utilisateur, mais cela n'a pas fonctionné ...
Mais il y a un lien hypertexte avec le texte Click here to forcibly terminate running steps
... (premier vert) Maintenant, j'ai appuyé sur le lien ...) Après l'exécution du lien, un message concernant Still paused
est apparu avec un autre lien Click here to forcibily kill entire build
(deuxième vert) Après avoir appuyé sur ce lien, la construction a finalement été mise à mort….
Cela semble donc fonctionner sans plug-in spécial (à l'exception du plug-in multibranch-pipeline build lui-même).
La réponse d'Alexandru Bantiuc a bien fonctionné pour moi, mais les exécuteurs testamentaires étaient toujours aussi occupés. J'ai pu effacer le statut de l'exécuteur occupé en utilisant ce qui suit
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()
}
}
}
}
J'avais beaucoup de zombi-jobs, alors j'ai utilisé le script suivant:
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"))
}
Avait ce même problème, mais il n'y avait pas de thread de pile. Nous avons supprimé le travail en utilisant cet extrait de code dans la console Jenkins. Remplacez le nom du travail et construisez-le avec le vôtre.
def jobname = "Main/FolderName/BuildDefinition"
def buildnum = 6
Jenkins.instance.getItemByFullName(jobname).getBuildByNumber(buildnum).delete();
Utilisation de la console de script sous https: // my-jenkins/script
import hudson.model.Job
import org.jenkinsci.plugins.workflow.job.WorkflowRun
Collection<Job> jobs = Jenkins.instance.getItem('My-Folder').getAllJobs()
for (int i = 0; i < jobs.size(); i++) {
def job = jobs[i]
for (int j = 0; j < job.builds.size(); j++) {
WorkflowRun build = job.builds[j]
if (build.isBuilding()) {
println("Stopping $job ${build.number}")
build.setResult(Result.FAILURE)
}
}
}
Si le même problème m’est arrivé deux fois maintenant, le seul problème est de redémarrer le serveur Tomcat et de relancer la construction.
Si vous ne souhaitez pas utiliser la console de script ou des plug-ins supplémentaires, essayez ces solutions simples comme indiqué dans la section https://wiki.jenkins.io/plugins/servlet/mobile?contentId=36603009#content/view/36603009
Les travaux de pipeline peuvent être arrêtés en envoyant une demande HTTP POST aux points de terminaison d'URL d'une construction.
Un utilitaire que j'ai écrit et qui s'appelle jkillthread peut être utilisé pour arrêter n'importe quel thread dans n'importe quel processus Java, tant que vous pouvez vous connecter à la machine qui exécute le service sous le même compte.
La raison pour laquelle je voyais ce problème était un lien incorrect http
sur la page au lieu de https
qui devrait arrêter le travail. Tout ce que vous avez à faire est de modifier l'attribut onclick
de la page html, en suivant
onclick
pour modifier sa valeur.s
à http
pour avoir https