Применение одной сборки для одного коммита в Дженкинс / Хадсон
Мы используем Jenkins для создания инкрементных сборок нашего проекта на каждом коммите в SCM. Мы хотели бы получить отдельные сборки для каждого коммита. Однако наивный подход (настройка SCM и использование перехватов после фиксации для запуска сборки) создает проблему в следующем сценарии:
- Сборка запущена.
- Во время сборки (это может занять до нескольких минут) два отдельных коммита в SCM делаются двумя разработчиками.
- Одна новая сборка запущена. Он получает изменения от обоих коммитов, сделанных во время предыдущей сборки.
Это "состояние гонки" усложняет поиск того, какой из коммитов нарушил сборку / введенные предупреждения.
Используемое в настоящее время решение проверяет изменения в одном задании ("задание планировщика") и запускает другое задание для фактической проверки и сборки.
Есть ли правильные решения этой проблемы?
6 ответов
Пока нет, есть запрос на добавление функций, охватывающий этот тип сборки, но он все еще открыт: выпуск 673
Возможно, это упускает из виду, но у нас здесь работает довольно хороший процесс сборки.
- Мы используем Git в качестве нашей системы контроля версий
- Мы используем Gerrit в качестве нашего инструмента обзора
- Мы используем триггер gerrit для запуска сборок на нашем сервере jenkins
- Мы проверяем изменения в ветви разработки для запуска jenkins при объединении изменений
Короче идеальный день разработчика таков
- Разработчик 1 звезды новой ветви, чтобы сделать свои изменения, на основе нашей основной ветви разработки
- Разработчик 1 совершает так часто, как ему нравится
- Разработчик 1 думает, что он закончил свою работу, он объединяет свои изменения в одно изменение и подталкивает его к желанию
- Новое изменение геррита создано, и Дженкинс пытается построить именно это изменение
- Если при сборке нет ошибок, выполняется проверка этого изменения.
- Когда рецензия отправляется, ревизия объединяется с ветвью разработки основного репозитория (без слияния в ветку разработки без рецензирования)
- Jenkins создает объединенную версию, чтобы убедиться, что ошибок слияния нет
ни один разработчик 2 не вступает в партию и не пытается сделать какую-то работу
процесс точно такой же, и оба начинают работать, там есть ветки. Разработчик 1 работает быстрее, и его изменения объединяются в ветке разработки. Теперь, прежде чем разработчик 2 сможет опубликовать свои изменения, он должен отменить свои изменения поверх изменений, внесенных разработчиком 1.
Поэтому мы уверены, что процесс сборки запускается для каждого изменения, внесенного в нашу кодовую базу.
Мы используем это для нашей разработки на C# - на Windows, а не на Linux
Как указано кем-то в Выпуске 673, вы можете попробовать запустить параметризованную сборку с параметром, являющимся фактическим git commit, который вы хотите собрать. Это в сочетании с крюком фиксации VCS.
Я не верю, что ты хотел бы сделать это возможно. "Тихий период", упомянутый Даниэлем Кутиком, фактически используется, чтобы сообщить Хадсону / Дженкинсу, сколько времени ждать, чтобы позволить другим коммитам в том же проекте быть взятым. Значение: если вы установите это значение равным 60 секундам, и вы сделали коммит, он будет ждать минуту, прежде чем начинать новую сборку, что также даст время для других коммитов (в течение этой одной минуты).
Я думаю, что может помочь, это установить Тихий период (Jenkins > Manage Jenkins > Configure System) в 0
и опрос СКМ на очень короткое время. Но даже в течение этого короткого интервала может быть два коммита. На данный момент Jenkins не имеет возможности разбивать сборку на отдельные сборки на нескольких SVN коммитах.
Вот учебник по этой теме: Функция тихого периода.
Если вы используете правило " НЕТ КОМИТЕТА на неработающей сборке" и доводите его до логического завершения, на самом деле вы получите "Нет коммита на сломанной сборке или в процессе сборки", и в этом случае описанная вами проблема исчезнет.,
Позволь мне объяснить. Если у вас есть два разработчика, работающих над одним проектом, и оба они пытаются зафиксировать (или нажать, если вы используете DVCS). Один из них будет успешным, а другие потерпят неудачу и должны будут обновить перед фиксацией.
Разработчик, который должен был сделать обновление, знает из истории коммитов, что другой коммит был недавним и, следовательно, в процессе сборки (даже если он еще не проверен). Они не знают, сломана ли эта сборка или нет, поэтому единственный безопасный вариант - подождать и посмотреть.
Единственное, что может помешать вам использовать вышеупомянутый подход, - это если сборка занимает так много времени, и в этом случае вы можете обнаружить, что ваши разработчики никогда не получат шанса на фиксацию (это всегда сборка). Затем это драйвер для разделения вашей сборки на конвейер, состоящий из нескольких шагов, так что задание Post Commit занимает не более 5 минут, но в идеале - 1 минуту.