2016-10-03 4 views
3

Это расширение или вариант How to configure Git post commit hookКак удаленно запускать только одну сборку за раз в Дженкинсе?

У меня есть проблема в том, что я не хочу один билд за совершение. Вместо этого я хочу запускать один экземпляр сборки за раз. Пока этот единственный экземпляр работает, новые запросы могут накапливаться, но после завершения текущей сборки они должны быть объединены в одну новую сборку.

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

Итак, ради этого вопроса, предположим, что каждый нажимает на мастер, и я помещаю git hook для запуска сборки. Как сделать так, чтобы ожидающие запросы были объединены в единичные запросы вместо очередей в виде отдельных сборок?

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

Jenkins parameterized job that only queues one build предлагает одну из следующих возможностей: использовать «запускающее» задание, которое быстро заканчивается и запускает фактическое рабочее задание с помощью «Объединенные очереди git хэшей». Проблема с этим подходом заключается в том, что задача запуска должна проверять репо до запуска рабочего задания. Учитывая большое git-репо, это приводит к неприемлемой задержке.

+0

Одна мысль, которая пришла мне в голову, заключается в том, что я разрешаю задания накапливаться в очереди, и всякий раз, когда выполняется задание, он полностью игнорирует git commit, запускающий запуск, и просто проверяет HEAD, а затем я запускаю небольшую систему groovy скрипт, который очищает очередь всех запросов старше времени запуска задания, тем самым оставляя любые новые запросы, которые приходили после запуска сборки, но перед запуском сценария в очереди, поэтому мы не пропускаем прогон, даже если больше новых запросов не приходит ... –

+0

Проблема с очисткой очереди заключается в том, что до запуска нового запуска сотни новых запросов могут накапливаться, что делает историю работы слева совершенно бесполезной. –

+0

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

ответ

1

У вас есть требование запускать сборки через git-крючки?

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

Также вы можете использовать Throttle Concurrent Builds plugin и добавить ограничения, которые предотвращают параллельные сборки.

EDIT: Там также возможность хранения ваших GIT крюки, но добавление Quiet Period. Который является основной функцией Jenkins, доступной через раздел Управление секциями Jenkins.

EDIT2: Когда я прочитал свои новые комментарии, я думал о Parametrized Scheduler Plugin и добавив параметр, чтобы указать URL хранилища, но это не опрашивают изменения этого планирование создает периодически, который не то, что вы хотите.

В свете новых требований, я хотел бы сделать что-то, что звучит немного как Rig Джерри: Я хотел бы создать другую работу под названием ваш-проект-исполнитель этот парень будет строить периодически (каждые 2 минуты или так) и запустить сценарий оболочки, который будет иметь большой блок if-else, это приведет к извлечению и проверке изменений в разных предопределенных репозиториях, если данный репозиторий имеет изменения, тогда это вызовет ваше текущее задание с требуемыми параметрами (REPO_URL и т. Д.).

Для проверки изменений вы можете сохранить хеш текущей ревизии HEAD в файле свойств в рабочей области задания исполнителя, а затем сравнить это с выходом git rev-parse HEAD.

EDIT3: Пример установки скорости сборки: enter image description here Это будет потреблять вашу очередь один раз в час.

+0

Основная проблема заключается в том, что мне нужно опросить несколько репозиториев, поскольку в задании используется несколько репозиториев. –

+0

Другой вариант использования - это работа, которая запускается после другого задания. Я знаю, что для этого случая есть флажок «Combine Queued git hashes», который делает то, что я хочу, но реализация этого для удаленно запущенной сборки означает выполнение двух проверок (один для задания, выполняющего фактическое задание с помощью Combined Queued git хешей, затем один для фактической работы). Подумайте, нужно проверить 15G git repo .... –

+0

Следует иметь в виду, что вам не нужно клонировать репо, чтобы проверить, есть ли в нем новые изменения. Вам просто нужно получить индексы ... –

Смежные вопросы