Eu gerencio um servidor Jenkins (executando 2.89.4) com cerca de 40 nós conectados, cada um executando Centos7, OSX ou Windows (7, 8, 10). Recentemente, sofremos alguns cortes de energia e muitos escravos perderam a conexão com o mestre. Isso exigiu muita comunicação remota manual e ssh para reconectar todos eles. Desde então, certifiquei-me de que cada processo escravo esteja executando um servidor, no entanto, gostaria de ter uma rede de segurança adicional para poder reiniciar automaticamente cada VM e/ou caixa em que esses escravos estão sendo executados. O problema é que, como existem vários tipos diferentes de sistemas operacionais, não existe uma maneira simples de fazer isso (que eu conheça ainda).
Eu tentei usar um script Groovy, mas ele pode ser usado principalmente para reiniciar o serviço escravo, não a máquina em si. Esta foi minha referência: https://wiki.jenkins.io/display/JENKINS/Monitor+and+Restart+Offline+Slaves
Também examinei uma abordagem Ansible, mas muitas máquinas são inacessíveis e o Ansible requer diferentes tipos de scripts para Windows versus Unix.
A melhor abordagem que vi até agora está aqui: https://stackoverflow.com/questions/29165080/restart-jenkins-slave-from-master
Mas não explica como executar isso em cada escravo, apenas parece que é executado em um escravo. Alguém mais fez algo assim antes? Eu adoraria criar um único trabalho ou script único que pudesse ser executado e reiniciasse cada nó (usando um comando como shutdown -r -f
) conectado ao Jenkins, independentemente da plataforma.
Responder1
Resolvi isso criando um trabalho de configuração múltipla e selecionando todos os escravos por nome. Em seguida, adicionei duas etapas condicionais baseadas no "Nó de execução". Selecionei apenas os escravos do Windows para o primeiro e apenas os escravos do Mac/Centos para o segundo. Para cada etapa condicional, adicionei uma única etapa: Executar comando em lote do Windows para a condição do Windows e Executar Shell para a seção unix. Aqui está o conteúdo das minhas caixas Batch e Shell, respectivamente:
Lote:
echo "Restarting Windows Machine...."
hostname
shutdown -r -f
Concha:
echo "Restarting Unix Machine...."
hostname
sudo shutdown -r now
Comentei as etapas de desligamento por enquanto em meu trabalho para não reiniciar tudo acidentalmente antes do teste. Certifique-se de descomentá-los antes de tentar executar isso.