web-dev-qa-db-fra.com

Redémarrez l'esclave Jenkins du maître

J'utilise la configuration maître-esclave jenkins pour capturer les métriques de performance d'un produit. Nous avons observé que jenkins-slave a tendance à accumuler de la mémoire et influence donc les mesures de performance capturées.

Pour assurer la cohérence des mesures en cours de capture, nous envisageons de redémarrer jenkins slave tous les jours à partir du maître, lorsqu'il n'y a pas de tâches en cours d'exécution sur l'esclave. Est-ce faisable?

Comment pouvons-nous l'accomplir?

Remarque: l'utilisation de jenkins-slave en tant que service n'est pas une option car nous rencontrons d'autres problèmes d'accès de sécurité.

10
Praneeth

Je sais que cette réponse arrive un peu en retard:

C’est ainsi que j’ai fait la même chose pour les mêmes raisons, sans savoir si c’est le meilleur moyen d’y parvenir, mais cela a résolu nombre de nos problèmes:

Pour les machines Windows:

  1. Créez un travail qui exécute simplement "shutdown -r -f" sur les ordinateurs Windows . Il redémarrera les ordinateurs.
  2. Maintenant, ramenant la partie en ligne. Pour des raisons similaires aux vôtres, je n'ai pas utilisé "jenkins-slave en tant que service". Au lieu de cela, j'ai configuré les nœuds Pour qu'ils se connectent via le client JNLP, puis j'ai ajouté la commande slave.jar Pour chaque nœud du planificateur de tâches de Windows (à exécuter au démarrage ).
  3. Maintenant, le travail redémarre la machine et la machine Windows met Elle-même en ligne sur Jenkins même après le redémarrage.

Pour les machines Mac:

  1. Le processus est comparativement plus facile sur mac. Commencez par créer un travail à exécuter "Shutdown -r now" sur le noeud Mac

  2. Le nœud doit simplement être configuré pour se connecter via ssh. Cela prendra soin de l’afficher en ligne sur Jenkins.

C'était la partie "execute Shell" de mon script pour redémarrer toutes les machines utilisées pour notre automatisation:

distro=`uname`
if [ "$distro" = "Windows_NT" ] || [ "$distro" = "WindowsNT" ] ;then
echo "Restarting Windows Machine...."
shutdown -r -f
else
echo "Restarting Mac Machine...."
Sudo shutdown -r now
fi

PS:

Ce n'est pas exactement lié à la question, mais peut être utile pour la situation que vous avez spécifiée. Il peut être judicieux d’ajouter un script de traitement par lots pour nettoyer les fichiers temporaires au démarrage des ordinateurs Windows . Ajouter le suivi d’un script de traitement par lots (Dites, cleanTemp.bat) dans le dossier de démarrage de votre ordinateur Windows . Pour Windows 10, C:\Utilisateurs \\ AppData\Roaming\Microsoft\Windows\Menu Démarrer\Programmes\Démarrage)

rmdir %temp% /s /q

md %temp%
8
Tushar Dwivedi

Si vous avez toujours besoin d'une réponse: https://wiki.Apache.org/general/Jenkins#How_do_I_restart_a_Jenkins_Unix_Slave.3F

Bien que je viens de faire une déconnexion et puis j'ai vu que les processus sont morts dans l'esclave. Je n'ai pas eu à les tuer manuellement . Puis relancez l'esclave et c'est tout.

C'est bien de l'interface utilisateur Web. Je n'ai pas encore recherché CLI pour cela.

4
Doron Veeder
  1. Créer un emploi, par exemple "Reboot-Slave", et définissez-le avec Shell "shutdown -r -t 0", et prenez le nom de l'esclave cible en tant que paramètre. (de cette manière, la commande de redémarrage sera exécutée directement sur l'esclave cible que vous souhaitez redémarrer.)

  2. Créez un autre travail, par exemple "Reboot-Check-Slave-Online", dans ce travail, vous devez appeler le premier travail et transmettre le nom de l'esclave cible en tant que paramètre. En outre, il est préférable d'écrire une logique pour déterminer si votre esclave a terminé le redémarrage et est connecté à Jenkins serveur, vous pouvez le mettre en œuvre en ajoutant une étape "Exécuter le script groovy du système" dans votre travail et en écrivant le code ci-dessous:

    import hudson.model.*
    
    def target_slave_param = "target_slave"
    def resolver = build.buildVariableResolver
    def target_slave = resolver.resolve(target_slave_param)
    
    println "target_slave is: ${target_slave}"
    
    def status = 0;
    
    //do{
    println "Searching for ${target_slave}";
    slave = Hudson.instance.slaves.find({it.name == target_slave});
    
    if (slave != null)
    {
      computer = slave.getComputer();
      if (computer.isOffline())
     {
        println "Error! $target_slave is offline.";
        status = 1;
      }
      else 
      {
        println "OK: $target_slave is online";
      }
    }
    else 
    {
      println "Slave $target_slave not found!";
      status = 1;
    }
    //}
    
0
ppokyou