Как перевести узел Дженкинса в автономный режим в сценарии конвейера - PullRequest
0 голосов
/ 03 июля 2018

Мы хотим проверить работоспособность узла Дженкинса, прежде чем начинать трудоемкие интеграционные тесты. Если узел не исправен, мы хотим перевести его в автономный режим, чтобы кто-то мог подключиться и исправить его.

1 Ответ

0 голосов
/ 03 июля 2018

После долгих проб и ошибок я получил следующее решение:

def ExecuteTestsOnSelectedNode() {
     stage("integrationtests") {
         testSystemVerified = false
         while(!testSystemVerified) { // Retry if test system verification failed -  hopefully another node can execute this test...    
             node("nodelabel") {
                 // ... code for unstashing test assemblies omitted
                 try {
                     testSystemVerified = checkTestSystem(info, testSetup, testAssemblies);
                 }
                 catch (Exception e) {
                     echo "!!!!!!!!!!!!!!!!!! Test system verification failed !!!!!!!!!!!!!!!!!!!!!!!!\n" + e
                     throw e
                 }
                 if (testSystemVerified) {
                     // Then it is safe to execute the actual tests
                 }                  
             }
         }
     }
}

def checkTestSystem(info, testSetup, testAssemblies) {
    try {            
        // Execute some command that (quickly) verifies the health of the node
        bat "$info.test_runner $test_args"
        return true // If we get here the test system is OK
    }
    catch (hudson.AbortException e) {
        message = "!!!!!!!!!!!!!!!!!! Test system verification aborted !!!!!!!!!!!!!!!!!!!!!!!!\n" + e
        echo message
        throw e
    }
    catch (Exception e) {
        message = "!!!!!!!!!!!!!!!!!! Test system verification failed !!!!!!!!!!!!!!!!!!!!!!!!\n" + e
        echo message
        markNodeOffline(message)
        return false
    }
}

@NonCPS
def markNodeOffline(message) {
    node = getCurrentNode(env.NODE_NAME)
    computer = node.toComputer()
    computer.setTemporarilyOffline(true)
    computer.doChangeOfflineCause(message)
    computer = null
    node = null
}

@NonCPS
def getCurrentNode(nodeName) {
  for (node in Jenkins.instance.nodes) {
      if (node.getNodeName() == nodeName) {
        echo "Found node for $nodeName"
        return node
    }
  }
  throw new Exception("No node for $nodeName")
}
...