Дросселирование параллельного шага в скрипте конвейера Jenkins

Я использую что-то вроде этого для параллельного запуска тестов:

stage('Test') {
  steps {
    script {
      testing_closures = [one: { print("staring one"); sleep 10; print("finishing one") },
                          two: { print("staring two"); sleep 10; print("finishing two") },
                          three: { print("staring three"); sleep 10; print("finishing three") },
                          four: { print("staring four"); sleep 10; print("finishing four") },
                          five: { print("staring five"); sleep 10; print("finishing five") },
                          six: { print("staring six"); sleep 10; print("finishing six") }]
      parallel(testing_closures)
    }
  }
}

Основная цель - ограничить эти закрытия - я не хочу, чтобы все шесть из них выполнялись одновременно - только по три за раз. И я хочу иметь возможность запустить еще одну сборку этого, которая также будет запускать все эти закрытия, но только три одновременно.

Я думал об использовании для этого узлов - т.е. обертыванием каждого замыкания в блоке node {}:

one: { node { print("staring one"); sleep 10; print("finishing one") } }

Работает нормально, пока я использую главный узел и ограничиваю исполнителей до 4 (1 для основного задания, 3 для одновременных шагов узла {}).

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

Единственное решение, которое я мог придумать, - это использовать Lockable Resources следующим образом:

  1. Динамически создавать 3 блокируемых ресурса с помощью LockableResourcesManager::createResourceWithLabel() с уникальными для сборки метками

  2. Закрепите их этикеткой на всех крышках

  3. Закрытия будут ждать завершения друг друга, и на данный момент только 3 будут запущены.

  4. ... а теперь я застрял. Я не нашел способа удалить ресурсы. Я обнаружил только открытую ошибку для очень похожей проблемы. РЕДАКТИРОВАТЬ: я создал запрос на его улучшение.

Даже если существует метод удаления ресурсов, это решение выглядит грязным и добавляет ненужные ресурсы, которые могут не очиститься в случае сбоя.

Итак - как мне достичь своей цели? Есть ли способ дросселировать параллельный шаг?


person Mirek    schedule 11.08.2017    source источник
comment
Любые обновления? Я все еще ищу один.   -  person sorin    schedule 03.10.2017
comment
@sorin: я создал JENKINS-46236, который оказался дубликатом JENKINS-44085   -  person Mirek    schedule 19.10.2017
comment
решение в настоящее время не существует, все еще afaik - проще просто разделить параллельный запуск (в вашем случае ваш список при вызове parallel путем добавления ключа) на две части и выполнить их одну за другой.   -  person Onur Gokkocabas    schedule 11.09.2018
comment
JFYI: обходной путь находится в тикете issues.jenkins-ci.org/browse/   -  person kivagant    schedule 29.11.2018


Ответы (1)


Вы определенно могли бы сделать это с помощью LockableResources Plugin, просто определите 3 ресурса для заданной метки и используйте quantity, необходимый для каждого критического шага, равный 1. (в противном случае потребовались бы все ресурсы из данных меток)

node('slave') {
    def execs = [:]
    execs[1] = {
        lock(label: 'Win81x64Pool', quantity: 1, variable: "MY_VAR") {
            println "LOCKED=" + env.MY_VAR
            sleep(3)
       }
    }
    execs[2] = {
        lock(label: 'Win81x64Pool', quantity: 1, variable: "MY_VAR") {
            println "LOCKED=" + env.MY_VAR
            sleep(3)
        }
    }
    execs[3] = {
        lock(label: 'Win81x64Pool', quantity: 1, variable: "YOUR_VAR") {
            println "LOCKED=" + env.YOUR_VAR
            sleep(3)
        }
    }
    parallel execs
}
person hakamairi    schedule 10.04.2019