Как продолжить конвейер jenkins после перезагрузки хоста. - PullRequest
0 голосов
/ 08 мая 2018

У меня есть задание Jenkins, которое в настоящее время используется для перезагрузки хоста, это часть конвейера и имеет несколько последующих заданий. В настоящее время задание перезагружается и спит перед началом последующей сборки. Есть ли лучший способ проверить работу резервного копирования хоста перед продолжением вместо использования режима сна?

В настоящий момент выполняется задание Reboot_host:

ssh <hostname> "sudo reboot"
sleep 90

Хост - это виртуальная машина, поэтому продолжительность сна так мала.

Ответы [ 2 ]

0 голосов
/ 15 августа 2018

Если вы используете Pipeline, я могу рассказать, что мы делаем для наших компьютеров с Windows, где мы используем задание для установки обновлений Windows и запуска перезагрузки.

Весь процесс включает в себя несколько шагов и много ошибок. Поскольку код требует доступа к API Jenkins, мы помещаем его в глобальную общую библиотеку, где все вызовы API Jenkins инкапсулированы в @NonCPS методах. Ниже приведен лишь примерный набросок того, что необходимо сделать - поместить полный код здесь было бы слишком много.

Наш процесс перезагрузки компьютера с Windows

Чтобы запустить перезагрузку на компьютере с Linux, вам могут не понадобиться все шаги. Но использовать их не вредно. Конечно, вы должны также выполнить надлежащую проверку ошибок. Я поместил бы код в какую-нибудь библиотеку, которая также может быть проверена модулем.

  1. Опрос Computer.countBusy() (для тяжеловесных исполнителей) и Computer.getOneOffExecutors() (для полутяжелых исполнителей) в некотором цикле внутри блока узлов, где вы переводите узел в автономный режим (Computer.setTemporarilyOffline()) перед опросом. Компьютер, который вы можете получить, используя getContext(hudson.FilePath).toComputer(). Когда в работе используется ровно один тяжеловесный исполнитель (это мы), а мухи-весов нет, узел готов к перезагрузке. Держите узел в автономном режиме и оставайтесь в блоке узла для второго шага.
  2. Запустить перезагрузку из блока node, открытого на первом шаге, пока Computer все еще не подключен. Обязательно покиньте блок узла сразу после запуска перезагрузки cmd. Например. в Windows: bat 'shutdown /t 2 /r'
  3. Подождите, пока аппарат больше не будет подключен, чтобы обнаружить перезагрузку. Для этого мы проверяем, можем ли мы получить действительный FilePath для этого Computer: Computer.getNode().createPath()
  4. Обязательно позвоните Computer.disconnect(). По крайней мере, для компьютеров с Windows это очень важно, поскольку Дженкинс иногда не замечает, что он потерял соединение, и попытается использовать старое соединение - что приведет к сбою.
  5. Подождите, пока ОС загрузится. Мы используем узел Linux, который отправляет эхо-запрос на компьютер с Windows, пока на эхо-запрос не будет получен ответ.
  6. Триггер Computer.connect(false). Подождите, пока соединение не будет восстановлено. Мы проверяем Computer.getChannel() != null
  7. Переведите узел в оперативный режим: Computer.setTemporarilyOffline(true, 'foo')
  8. Computer.waitUntilOnline()
  9. Готово:)
0 голосов
/ 08 мая 2018

Я предполагаю, что вы используете Jenkinsfile здесь, так как вы сказали "конвейер"; если нет, пожалуйста, предоставьте немного больше информации о вашей работе (фристайл с исполняемой оболочкой и т. д.).

Возможно, вам понадобится sleep, но вы можете использовать его вместе с retry, чтобы добиться более быстрого успеха (и более быстрого отказа). Предполагая, что вам просто нужна виртуальная машина, вы можете использовать что-то вроде:

retry(20){
    sleep time: 5 unit: 'SECONDS'
    sh 'ssh -o ConnectTimeout=1 <hostname> exit'
}

Это попытается подключиться к хосту каждые 5 секунд. Добавление ConnectTimeout означает, что ssh будет ждать только 1 секунду для завершения соединения. exit только гарантирует, что успешное соединение отключено. retry будет оценивать команды до 20 раз, пока команда sh не получит значение выхода 0 (success). Если он запускается 20 раз безуспешно, сборка завершится неудачно (что, вероятно, хорошо, поскольку это означает, что ваша ВМ недоступна для последующих заданий).

Если вы ожидаете какой-то конкретной услуги, вы можете curl или иным образом попытаться связаться с этой службой вместо использования ssh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...