Дженкинс сложный сборочный процесс, это возможно?

введите описание изображения здесь

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

  • После запуска сборки все ведомые устройства выполняют одно и то же задание параллельно (задание настройки).
  • Если какие-либо рабы терпят неудачу в этой работе, они не должны продолжать.
  • Для всех рабов, которые пройдут эту работу, они должны получить работу из пула работ, которые необходимо выполнить. И как только раб завершает работу, он должен вернуться, чтобы завершить другую работу в пуле.

Я начал работать с Дженкинсом всего несколько недель назад, и теперь у меня все настроено так, как будто каждое задание выбирается подчиненным, которому нужно сначала запустить задание установки. Это действительно замедляет время сборки, потому что у меня около 30 заданий, а настройка занимает ~2 минуты.

Я использую Jenkins в качестве платформы для автоматического тестирования, и все задания в пуле заданий могут выполняться независимо друг от друга. У меня сейчас 5 рабов и ~30 рабочих мест.

2 ответа

Следующее должно сделать трюк:

def jobPool = new ArrayDeque()
jobPool.add({
    echo "Doing stuff on ${env.NODE_NAME}"
});
jobPool.add({
    echo "Doing other stuff on ${env.NODE_NAME}, a little slower"
    sleep 4
});
jobPool.add({
    echo "Doing more stuff on ${env.NODE_NAME}, even slower"
    sleep 10
});
jobPool.add({
    echo "Doing stuff quick on ${env.NODE_NAME}"
});
jobPool.add({
    echo "Doing stuff quicker on ${env.NODE_NAME}"
});


def par = [:]

for (x in ["master", "urban"]) {
    def nodeName = x; // needed due to variable scoping
    par[nodeName] = {
        node (nodeName) {
            try {
               echo "Doing setup on ${env.NODE_NAME}!"
               // Do you're setup
               echo "Done with setup"
            } catch (Exception e) {
               echo "Will not use this node as it failed setup!"
               return;
            }
            while (true) {
               // echo "${jobPool.size()}"
                def subTask = jobPool.poll()
                //echo "${jobPool.size()} ${subTask}"
                if (subTask == null) {
                    break;
                }
                // Might wan't try catch around the next line if you wan't to continue if a job fails
                subTask()
            }
        }
    }
}
parallel par
if (!jobPool.isEmpty()) {
  error "Not all tasks was done!"
}

Просто добавьте свои "задания из пула заданий" в jobPool изменить и изменить часть установки.

Кажется, вы хотите отдельные этапы в одной и той же работе. Это значительно упрощается в конвейерах jenkins 2. Здесь есть несколько фотографий: https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+View+Plugin

[groovy] код в итоге выглядит так:

node {
  stage 'Checkout'
  svn 'https://svn.mycorp/trunk/'
  stage 'Build'
  sh 'make all'
  stage 'Test'
  sh 'make test'
}
Другие вопросы по тегам