Перезапустите работу Дженкинса на другом рабе в случае неудачи - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть работа, которая совместима с 2 ведомыми (настроенными в разных местах).У меня часто возникают проблемы с подключением из-за тайм-аута сеанса VPN, поэтому я пытаюсь найти способ автоматического запуска задания на ведомом устройстве 2, если задание не выполняется на ведомом устройстве 1. Пожалуйста, дайте мне знать, есть ли какой-либо плагин или какой-либо способвыполнить это.

1 Ответ

0 голосов
/ 04 декабря 2018

Я думаю, что в проекте со свободным стилем было бы трудно реализовать ваше требование.

Конвейерный скрипт

Установите это, если вы не знаете этот плагин: Как создатьсценарий конвейера

В соответствии с этим ответом плагин конвейера позволяет писать задания, которые выполняются на нескольких подчиненных узлах, используя метки :

node('linux') {
  git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'
  sh "make"
  step([$class: 'ArtifactArchiver', artifacts: 'build/program', fingerprint: true])
}
node('windows && amd64') {
  git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'
  sh "mytest.exe"
}

Я создал этот простой конвейерный сценарий и работаю (в этом примере нет метки, но вы можете его использовать):

def exitStatusInMasterNode = 'success';

node {
   echo 'Hello World in node master'
   echo 'status:'+exitStatusInMasterNode
   exitStatusInMasterNode = 'failure'
}

node {
   echo 'Hello World in node slave'
   echo 'master status:'+exitStatusInMasterNode
}

переменная exitStatusInMasterNode может быть общей для всех узлов.

Таким образом, если ваш slave1 выходит из строя, вы можете установить exitStatusInMasterNode на сбой.И в начале вашего slave2 вы могли бы проверить, если exitStatusInMasterNode не выполнен, чтобы выполнить ту же сборку, но в этом ведомом устройстве.

Пример:

def exitStatusInMasterNode = 'none';

node {
  try{
    echo 'Hello World in Slave-1'
    throw new Exception('Simulating an error')
    exitStatusInMasterNode = 'success'    
  } catch (err) {
    echo err.message
    exitStatusInMasterNode = 'failure'
  }
}

node {
   if(exitStatusInMasterNode == 'success'){
     echo 'Job in slave 1 was success. Slave-2 will not be executed'
     currentBuild.result = 'SUCCESS'
     return;

   }

   echo 'Re launch the build in Slave-2 due to failure on Slave-1'
   // exec simple tasks or stages
}

Журнал смоделированной ошибки в slave1

Running on Jenkins in .../multiple_nodes
Hello World in Slave-1
Simulating an error

Running on Jenkins in .../multiple_nodes
Re launch the build in Slave-2 due to failure on Slave-1

Finished: SUCCESS

Журнал, когда в slave1 нет ошибки (прокомментируйте эту строку: выбросить новое исключение)

Running on Jenkins in .../multiple_nodes
Hello World in Slave-1

Running on Jenkins in .../multiple_nodes
Job in slave 1 was success. Slave-2 will not be executed

Finished: SUCCESS
...