Configure e reinicie um escravo Hudson / Jenkins como parte de uma compilação

Tenho uma configuração de servidor Jenkins (Hudson) que executa testes em uma variedade de máquinas escravas. O que eu quero fazer é reconfigurar o escravo (usando APIs remotas), reiniciar o escravo para que as alterações entrem em vigor e continue com o restante do teste. Existem dois obstáculos que encontrei até agora:

Uma vez que um trabalho Jenkins comece a ser executado no escravo, o escravo não poderá cair ou interromper a conexão de rede com o servidor, caso contrário, Jenkins falhará imediatamente no teste. Normalmente, eu diria que esse é um comportamento completamente desejável. Mas, neste caso, eu gostaria que Jenkins aceitasse a interrupção até que o escravo volte a ficar on-line e Jenkins possa se reconectar a ela - ou o escravo se reconectar a Jenkin Em um trabalho que foi anexado ao escravo, preciso executar algumas tarefas de construção no mestre Jenkins - não no escrav

Isso é possível? Até agora, não encontrei uma maneira de fazer isso usando o Jenkins ou qualquer um de seus plugin

EDIT - Mais explicações Eu gosto muito, muito da arquitetura de escravos Jenkins. Combinado com os plugins já disponíveis, torna muito fácil conseguir trabalhos para um escravo, executar e obter os resultados retirados. E a capacidade de escolher qualquer escravo compatível permite a distribuição automática de tarefas / teste

Na nossa situação, usamos máquinas escravas virtualizadas (VMware). Foi fácil escrever um script que faria com que Jenkins usasse o VMware PowerCLI para iniciar a VM quando necessário para executar em um escravo, depois enviar a tarefa para ela e recuperar os resultados. Tudo bom

EXCET Parte da configuração de cada teste é reconfigurar levemente a máquina virtual de alguma maneira. Desabilite o UAC, faça logon como um usuário diferente, tenha um driver diferente instalado etc. - cada uma dessas alterações exige que a VM / escrava de teste seja reinicializada antes que as alterações tenham efeito. Embora eu possa escrever scripts de escravo sob demanda (método de inicialização = iniciar escravo através da execução de comando no mestre) que manipulam essa reconfiguração e reiniciam, isso deve ser feito antes que a tarefa seja executada. É aí que o problema ocorre - não consigo configurar o escravo tão cedo, porque o tipo de alteração na configuração depende do trabalho que está sendo executado, o que ocorre somente depois que o escravo é iniciad

Soluções possívei
1) Use várias instâncias escravas em uma única VM. Isso não funcionaria - várias configurações são mutuamente exclusivas, mas Jenkins não sabe disso. Portanto, tentaria iniciar uma configuração de escravo para um trabalho, outro escravo para um trabalho diferente - e os dois escravos estariam na mesma VM. Bloqueios nos trabalhos não impedem isso, pois a inicialização do escravo não faz parte do trabalh

2) (Ótimo) Uma etapa de construção que permite que um trabalho saiba que sua conexão escrava PODE ser interrompida. A etapa de construção pode ter que incluir algumas opções para que Jenkins saiba como reconectar o escravo (o escravo se reconectará automaticamente, o Jenkins precisará executar um script, o SSH simples será suficiente). A etapa de construção lidaria com a desconexão do escravo, ignoraria a desconexão normalmente com falha no trabalho e executaria a reconexão. Depois que o escravo voltar a funcionar, a próxima etapa da compilação poderá ocorrer. Talvez um tempo limite para falhar no trabalho se o escravo não for reconectável em um determinado período de temp

** Solução atual ** - inferior ao ideal
Agora, não posso usar a função escrava de Jenkins. Em vez disso, eu uso uma série de etapas de compilação - executadas no mestre - que usam scripts do Windows e PowerShell para ligar a VM, fazer as configurações e reiniciá-la. A VM possui um servidor SSH em execução e eu o uso para fazer upload de arquivos de teste na VM de teste e executá-los remotamente. Em seguida, faça o download dos resultados de volta para Jenkins para manipulação pelo trabalho. Essa solução é funcional - mas muito mais trabalho do que a abordagem típica dos escravos Jenkins. Além disso, os scripts são direcionados para uma única VM; Não posso usar facilmente uma piscina de escravo