Reconfigurer et de redémarrage d'Hudson/Jenkins esclave dans le cadre d'une construction

J'ai un Jenkins (Hudson) installation du serveur qui exécute les tests sur une variété d'esclave des machines. Ce que je veux faire est de reconfigurer l'esclave (à l'aide de remote Api), le redémarrage de l'esclave afin qu'il les changements prennent effet, puis continuer avec le reste de l'épreuve. Il y a deux obstacles que j'ai rencontrés jusqu'à présent:

  1. Une fois par Jenkins travail commence à courir à l'esclave, l'esclave ne peut pas aller vers le bas ou briser la connexion réseau au serveur sinon Jenkins immédiatement échoue le test. Normalement, je dirais que c'est complètement comportement souhaitable. Mais dans ce cas, je voudrais Jenkins pour accepter la perturbation jusqu'à ce que l'esclave revient en ligne et Jenkins peut se reconnecter à elle - ou l'esclave se reconnecte à Jenkins.
  2. Dans un travail qui a été attaché à l'esclave, j'ai besoin d'exécuter certaines construire des tâches sur le Jenkins maître - pas sur l'esclave.

Est-ce possible? Jusqu'à présent, je n'ai pas trouvé le moyen de le faire à l'aide de Jenkins ou l'un de ses plugins.

MODIFIER - pour de Plus amples Explications
J'ai vraiment, vraiment comme le Jenkins esclave de l'architecture. Combiné avec les plugins déjà disponible, il devient très facile d'obtenir des emplois à un esclave, exécuter, et les résultats tirés en arrière. Et la possibilité de choisir n'importe quel correspondant esclave permet d'emploi automatique/test de distribution.

Dans notre situation, nous utilisons virtualisés (VMware) esclave des machines. Il était assez facile d'écrire un script qui serait la cause de Jenkins pour utiliser VMware PowerCLI pour démarrer la machine virtuelle quand elle a besoin pour s'exécuter sur un esclave, puis expédier le travail et tirez sur les résultats. Du tout bon.

SAUF le Cadre de la configuration de chaque test est légèrement reconfigurer la machine virtuelle d'une certaine façon. Désactiver le contrôle de compte d'ouverture de session en tant qu'utilisateur différent, disposent d'un autre pilote installé, etc - uns de ces changements nécessite que le test VM/slave être redémarré pour que les modifications prennent effet. Bien que je peux écrire esclave à la demande des scripts (Méthode de Lancement=Lancement de l'esclave via l'exécution de la commande sur le maître) qui gèrent cette option reconfigurer et de redémarrer, il doit être fait AVANT que le travail est exécuté. C'est là que le problème se produit - je ne peut pas configurer l'esclave que le début, car le type de modifications de configuration dépendent de la tâche en cours d'exécution, ce qui ne se produit qu'après que l'esclave est commencé.

Solutions Possibles

1) Utiliser plusieurs esclaves cas sur une machine virtuelle. Ce ne serait pas de travail - plusieurs configurations sont mutuellement exclusifs, mais Jenkins ne sais pas. Alors qu'il allait essayer de démarrer un esclave de configuration pour un emploi, un autre esclave pour un travail différent - et les deux esclaves seraient sur la même VM. Verrous sur les travaux n'empêche pas cela, car l'esclave de départ n'est pas une partie du travail.

2) (Optimal) Une étape de génération qui permet un travail à savoir qu'il est esclave de la connexion PEUT être interrompue. L'étape de génération peut inclure certaines options afin que Jenkins sait comment reconnecter l'esclave (l'esclave se reconnecter automatiquement, sera Jenkins ont pour exécuter un script, sera simple SSH suffit). L'étape de génération serait en mesure de gérer la déconnexion de l'esclave, ignorer l'habitude du travail-ne pas débrancher, puis procéder à la reconnexion. Une fois que l'esclave est de retour, et en cours d'exécution, la prochaine étape de génération peut se produire. Peut-être un délai d'attente à l'échec de la tâche si l'esclave n'est pas reconnectable dans un certain laps de temps.

* * * * - Moins optimale

Maintenant, je ne peux pas utiliser la fonction esclave de Jenkins. Au lieu de cela, j'utilise une série d'étapes de génération - run sur le maître - que l'utilisation de Windows PowerShell et les scripts d'alimentation sur la machine virtuelle, faire les configurations, et de le redémarrer. La machine virtuelle a un serveur SSH qui tourne sur elle et je l'utiliser pour télécharger des fichiers de test pour le test de la VM, puis d'exécution à distance. Puis téléchargez les résultats de Jenkins pour la manipulation par le travail. Cette solution est fonctionnelle, mais beaucoup plus de travail que la typique Jenkins esclave approche. Aussi, les scripts sont ciblées sur une seule VM; je ne peut pas utiliser un pool d'esclaves.

Si vous nous avez donné plus de détails sur ce que vous essayez d'accomplir. Je voudrais être mieux outillés pour aider.
Je suis curieux de savoir si il existe une solution à cela aussi. Nous aimerions faire quelques tests qui permettront de prendre vers le bas de toutes les connexions réseau temporairement. Toutefois, cela tue le Jenkins esclave et donc le maître pense que la connexion a été perdue.
Mise à jour originale de la question avec plus de détails - des idées sur les solutions possibles - et le courant de moins-que-optimale de la solution.

OriginalL'auteur Jason Swager | 2011-04-04