Jenkins - одновременное выполнение экземпляров одной сборки - PullRequest
17 голосов
/ 27 мая 2011

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

Пример:

  1. Build [* jenkins_job_1 *]: вызывает скрипт ant спараметр 'A'
  2. Build [* jenkins_job_1 *]: вызывает сценарий ant с параметром 'B'
  3. , повторяя при необходимости
  4. , каждый экземпляр задания выполняется одновременно, скореечем через очередь.

Причина, по которой я хотел бы сделать это, состоит в том, чтобы избежать необходимости создавать несколько почти идентичных заданий, все из которых необходимо поддерживать.

Есть ли способчтобы сделать это, или, может быть, другое решение (т.е. - динамически создать задание из базового задания и удалить его после его завершения)?

Ответы [ 5 ]

31 голосов
/ 22 июля 2013

У Дженкинса есть флажок: «Выполнять параллельные сборки, если это необходимо»

Если вы проверите это, то он запустит несколько сборок для задания.

Это работает с «Этофлажок "builded параметризован".

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

9 голосов
/ 27 мая 2011

Вы можете выбрать Построить мультиконфигурационный проект (Матричная сборка) при создании задания. Затем в конфигурации задания вы можете определить Матрицу конфигурации , которая позволит вам указать один или несколько параметров (осей) для разных сборок. Что касается одновременного запуска, вы должны иметь возможность запускать столько сборок одновременно, сколько у вас есть исполнителей (с соответствующей меткой).

К сожалению, на Jenkins wiki нет документации об этой настройке. Есть пара предыдущих вопросов SO, здесь и здесь , которые могут дать небольшое руководство. В недавнем блоге было опубликовано сообщение о настройке работы с несколькими конфигурациями для выполнения сборок на различных платформах.

4 голосов
/ 22 февраля 2014

Более новым (и лучшим) решением является плагин Jenkins Job DSL .

Мы использовали его с большим успехом.Наши конфигурации заданий теперь одноразовые ... мы можем создать огромный стек сложных заданий из некоторых отличных файлов и нескольких шаблонных заданий.Это здорово.

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

1 голос
/ 10 апреля 2018

Ничто не мешает вам сделать это с помощью конвейера Jenkins DSL .

У нас один и тот же конвейер работает параллельно, чтобы смоделировать комбинированные нагрузки для приложения, которое предоставляет веб-службы, предоставляет базу данных нескольким внешним приложениям, получает данные через несколько рабочих очередей и имеет интерфейс GUI. Бизнес предъявляет нам нефункциональные требования (NFR), которым должно удовлетворять наше приложение, что гарантирует его отзывчивость даже в напряженное время.

Различные экземпляры конвейера запускаются с разными параметрами. Первый экземпляр может быть WS_Load, второй GUI_Load и третий Daily_Update_Load, моделирующий большую очередь данных, которая требует обработки в течение определенного периода времени. Можно добавить больше, в зависимости от того, какую комбинацию нагрузок мы хотим протестировать.

В других ответах говорилось о флажках для параллельных сборок, но я хотел упомянуть еще одну проблему: конфликт ресурсов.

Если ваш конвейер использует временные файлы или хранит файлы между стадиями конвейера, экземпляры могут в конечном итоге вытащить коврик из-под ног друг друга. Например, вы можете в конечном итоге удалить файл в одном параллельном экземпляре, пытаясь прочитать тот же файл в другом. Мы используем следующий код, чтобы гарантировать, что таймеры и временные имена файлов уникальны для каждого параллельного экземпляра:

def concurrentStash(stashName, String includes) {
    /* make a stash unique to this pipeline and build
       that can be unstashed using concurrentUnstash() */
    echo "Safe stashing $includes in ${concurrentSafeName(stashName)}..."
    stash name: concurrentSafeName(stashName), includes: includes
}

def concurrentSafeName(name) {
    /* make a name or name component unique to this pipeline and build
     * guards against contention caused by two or more builds from the same
     * Jenkinsfile trying to:
     *   - read/write/delete the same file
     *   - stash/unstash under the same name
     */
    "${name}-${BUILD_NUMBER}-${JOB_NAME}"
}

def concurrentUnstash(stashName) {
    echo "Safe unstashing ${concurrentSafeName(stashName)}..."
    unstash name: concurrentSafeName(stashName)
}

Затем мы можем использовать concurrentStash stashName и concurrentUnstash stashName, и у параллельных экземпляров не будет конфликта.

Если, скажем, оба конвейера должны хранить статистику, мы можем сделать что-то подобное для имен файлов:

def statsDir = concurrentSafeName('stats')

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

0 голосов
/ 27 мая 2011

Вы можете создать сборку и настроить ее с параметрами.Установите флажок This build is parameterized и добавьте нужные параметры в конфигурацию сборки.Затем вы можете запустить одновременную сборку, используя разные параметры.

Примечание: «Bulk Builder» в Jenkins может поместить его в очередь, но есть также флажок This bulk build is parameterized.

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