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:
- 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.
- 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.
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
Vous devez vous connecter pour publier un commentaire.
Très facile. Vous créez un Maître d'emploi qui s'exécute sur le Maître, du maître d'emploi que vous appelez le client de l'emploi comme une étape de génération (c'est un nouveau type de l'étape de génération et j'adore ça). Vous devez vérifier que la tâche principale doit attendre pour le client d'emploi à la fin. Ensuite, vous pouvez exécuter votre script pour changer la configuration de votre client et d'exécuter la deuxième test sur le client.
Une bien meilleure stratégie consiste à avoir deux nœuds en cours d'exécution sur votre esclave des machines. Vous devez configurer deux nœuds dans Jenkins. J'ai utilisé cette stratégie avec succès avec un unix esclave. La raison était que j'avais besoin de différentes variables d'environnement pour être mis en place et je n'ai pas envie de pousser que dans les travaux. J'ai utilisé des clients ssh, donc je ne sais pas si c'est possible avec différents types de clients. Que vous pourriez être en mesure d'exécuter les tests en même temps ou vous enchaînez les emplois ou utiliser la stratégie mentionnée ci-dessus.
Je suppose que vous êtes en droit. Ne me souviens pas d'où il vient (j'ai mis à jour quelques plugins et le serveur en même temps).
OriginalL'auteur Peter Schuetze
Ne sais pas si cela fonctionnera pour vous, mais vous pourriez essayer de faire le Jenkins nœud de l'agent par programme dire le nœud maître qu'il est hors ligne.
J'ai eu une situation où je devais faire un Jenkins travail qui effectue ces étapes, (tout en cours d'exécution sur le nœud maître):
Je exécuter l'agent de déconnecter l'étape avec une boucle d'une requête POST, mais il pourrait y avoir une manière plus propre de le faire:
Puis, quand je boot le nœud de l'agent, l'agent se lance et se connecte automatiquement, et le maître des avis de l'agent est de retour en ligne (et ensuite l'envoyer emplois).
J'ai aussi été en mesure de basculer d'un nœud en disponibilité sur et en dehors avec cette commande (en utilisant 'toggleOffline' au lieu de 'doDisconnect'):
(Exécuter la même commande met de nouveau l'état du nœud de retour à la normale.)
Ci-dessus peuvent ne pas s'appliquer à vous car il semble que vous voulez tout faire à partir d'un jenkins travail en cours d'exécution sur le nœud de l'agent. Et je ne suis pas sûr de ce qui se passe si un nœud de l'agent se déconnecte de marques ou de lui-même en mode hors connexion dans le milieu de l'exécution d'un travail. 🙂
Encore, vous pouvez fouiner dans ce Accès à distance doc API un peu pour voir ce qui est possible avec ce genre d'approche.
Après réflexion sur le sujet, on dirait que nous sommes dans le même bateau pour le scénario que j'ai décrit (coup d'envoi d'un travail sur une nouvelle VMware instantané) j'ai actuellement au moins deux emplois: Un coup d'envoi/de l'installation de l'exécution du travail sur le maître qui ne l'instantané querelles, et un deuxième emploi, enchaîné à la première qui lance un processus sur l'esclave. Il serait intéressant de voir s'il est possible d'écrire un plugin pour mettre en œuvre la "pause" étape de génération que vous avez mentionné...je n'ai pas regardé de quoi que ce soit encore, cependant.
OriginalL'auteur Bill Agee