Size: a a a

2021 April 06

JR

Jürgen Romins in jenkins_ru
Я поищу если найду как сделано но этим проектом я уже не руковожу и не факт что найду как делали
источник

Z

Zlokot in jenkins_ru
чет под вечер меня клинит уже

как в пайплайне сделать луп while:
while ( (status != 'true') || (count < 100) ) {...}


никак не выйдет из лупа по count > 100 при status == false

то есть  false || true всегда == true и луп продолжается
источник

II

Igor Ivanov in jenkins_ru
&& же
источник

Z

Zlokot in jenkins_ru
Так мне надо чтобы выходило или по первому или по второму
источник

II

Igor Ivanov in jenkins_ru
ну вот оно и выйдет :)
пока И статус!=, И счётчик< — ходим по кругу
как только одно из них перестанет выполняться — вываливаемся
источник

Z

Zlokot in jenkins_ru
Хм.. вот епт. Спасибо, проверю
источник

t

tsla in jenkins_ru
народ, а как сделать что бы из массива брала по 5 штук ?
желательно с parameter {choice}, типа по умолчанию по 5 серверов делал выборку , и если захотели , то когда пайплайн спрашивает  вы указываете какое количество серверов выирать из массива за раз

def servers = ["192.168.1.67", "192.168.1.106", "192.168.1.212"  и т.д. = 30 серверов]
источник

t

tsla in jenkins_ru
def servers = ["192.168.1.67", "192.168.1.106", "192.168.1.212"  .... = 30 серверов]

def parallelStagesMap = servers.collectEntries {
   ["${it}" : generateStage(it)]
}


def generateStage(servers) {
   return {
       stage("stage: ${servers}") {
               echo "This is ${servers}."
               sh "bla-bla-bla'"  
       }
   }
}

pipeline {
   agent any
   options {
      parallelsAlwaysFailFast()
   }
     stages {
       stage('parallel stage') {
           steps {
               script {
                   parallel parallelStagesMap
               }
           }
       }
     }
}
источник

t

tsla in jenkins_ru
то есть я хочу в параллеле по 5 серверов с выбором ввода количества серверов в паралелле, вплоть all, когда на всех серверах за рах выполнить ?
заранее спасибо
источник

II

Igor Ivanov in jenkins_ru
Т.е. чтобы это было как пул на 5 потоков, который постепенно разгребает 30 задач? Такого parallel не умеет, насколько мне известно(
источник

t

tsla in jenkins_ru
да!
источник

t

tsla in jenkins_ru
плиз, ну подскажи, я чую что точно можно реализовать
источник

II

Igor Ivanov in jenkins_ru
Только если разбить массив на куски по 5, и обрабатывать эти блоки по очереди. Будет провисать на случаях, когда 4 задачи завершилось, и ждёт оставшуюся
источник

u

unixshaman in jenkins_ru
Реализовать можно, у меня есть. Для этого нужно объект локер сделать, и критическую секцию. И из 5 параллельных потоков из функции запрашивать типо дай мне 1 сервер, и если есть - то отдавать
источник

u

unixshaman in jenkins_ru
По сути выглядит как 5 потоков разгребающих кучу из 30 серверов
источник

t

tsla in jenkins_ru
ого, круто (правда я не совсем понял, точнее совсем не понял)
буду благодарен за кусок код, что б тупо воткнуть к себе в дженкинсфайл
источник

u

unixshaman in jenkins_ru
На примере автотестов:
class ShareObj{
   def testsForExecution // ArrayList<Autotest>
   Object listLock

   ShareObj() {
       testsForExecution = []
       listLock = new Object[0]
   }
}

@NonCPS
def getTestForExecution(def so) {
   synchronized(so.listLock) {
       def tests = so.testsForExecution.findAll{t -> t.used == false} // ArrayList<Autotest>
       if (tests.size() > 0) {
           // Тут можно всякие опции использовать
           //def test = tests.find {t -> t.option == option} // Autotest
           //test = test != null ? test : tests.find {t -> return true}
           def test = tests.find {t -> return true}

           if (test != null) {
               test.used = true
               return test
           }
       }

       return null
   }
}

@NonCPS
def sortAutotestsArr(def arr) {
   return arr.sort{-it.weight}
}
источник

u

unixshaman in jenkins_ru
        echo 'Выполнение автотестов'
       echo("Список тестов для исполнения: ${tests}")

       ShareObj so = new ShareObj()

       def testsForExecutionList = [тут ваш список]
       so.testsForExecution = sortAutotestsArr(so.testsForExecution)

       def parallelTasks = [:]
       def testDistribution = [:]

       for (int i = 0; i < reservedAgents.size(); i++) {
           def agent = reservedAgents[i]

           parallelTasks["Выполнение тестов на агенте ${agent.name}"] = {
               while (true) {
                   testDistribution["${agent.name}"] = getTestForExecution(so)

                   if (testDistribution["${agent.name}"] == null) break
                   println("Выдаем на выполнение тест ${testDistribution["${agent.name}"].name}")

                   runTestOnHost(cerediraTessUrl, cerediraTessCreds, agent, project, testDistribution["${agent.name}"],
                       testsPath, testStand, pathToJenkinsShare, influxEnabled, runType
                   )
               }
               agentsUnlock(cerediraTessUrl, cerediraTessCreds, reservedAgents, BUILD_URL)
               reservedAgents.remove(agent)
           }
       }
       parallel parallelTasks
источник

u

unixshaman in jenkins_ru
Тут есть много лишнего, и поэтому просто вставить не получится, надо ознакомиться, осознать, и по примеру полностью написать свое
источник

t

tsla in jenkins_ru
чувак, ты походу Верховный Жрец Дженкинса
источник