2009-06-04 2 views
7

Я начал экспериментировать с Хадсоном в качестве сервера сборки. Я использую subversion и настроен на опрос каждую минуту. Проблема, которую я вижу, заключается в том, что если сборка в редакции 10 занимает 5 минут, а за это время будет 5 коммитов, Хадсон продолжит сборку ревизии 15.Может ли Хадсон настроить каждую ревизию?

Есть ли способ обеспечить, чтобы каждая ревизия была построена?

+1

Вы должны позаботиться о том, чтобы это не вызвало проблем с производительностью для Хадсона. Например, если вы совершаете фиксации каждые несколько секунд, тогда как сборка hudson занимает несколько минут. Вскоре вы наполните очередь сборки. – toolkit

+1

В моей жизни я не понимаю, почему это может понадобиться. Почему важно быть чем-то отличным от текущего состояния кодовой базы? – sal

+3

Привет, причина для этого - тестирование. Мы стремимся поставить каждую ревизию на регрессионный тест. Поэтому, если мы не строим каждую ревизию, мы не тестируем каждую ревизию. Это вызывает проблемы, если rev n работает, но rev n + 10 не является, и мы не тестировали какие-либо изменения между ними. Какое изменение вызвало регресс? – CodeBuddy

ответ

4

Хадсон пока не имеют такой возможности, но его попросили несколько раз в списке рассылки. См issue 673

+0

Я искал эту ошибку. Отслеживание ошибок движется, проблема теперь находится на http://issues.hudson-ci.org/browse/HUDSON-673, и она по-прежнему не решена. – Bluehorn

+0

Спасибо. Я обновил ссылку. –

1

В части конфигурации сборки SCM у вас должен быть раздел «Триггеры сборки» и опция «Триггер строит удаленно (например, из скриптов)». Согласно справочной информации рядом с этой опцией вы можете выполнить сценарий post-commit, чтобы каждая фиксация запускала новую сборку. Поскольку у hudson есть очередь сборки, вы должны иметь каждую ревизию.

Вот ссылка, которая может помочь вам: https://hudson.dev.java.net/build.html

Вот пример того, как начать сборки работу с параметрами (см на мой комментарий для более подробной информации): http://wiki.hudson-ci.org/display/HUDSON/Parameterized+Build

+0

Не уверен, что это будет работать напрямую - первая фиксация вызовет сборку, затем 3 commit trigger 3 далее строит до 1-го завершения. К сожалению, вторая сборка в очереди сделает обновление и построит последнюю версию - как и следующие сборки. Что нужно, чтобы иметь возможность передавать номер версии в запрос на сборку и иметь этот номер, используемый во время обновления. –

+1

Вы правы, я не думал об этом очевидном сценарии. Но, как я видел в документации hudson, можно вызвать функцию построения с параметрами, чтобы вы могли определить строковый параметр строки RevisionToBuild и установить его из сценария следующим образом: «http: // server/job/myjob/buildWithParameters? RevisionToBuild = 1234 "и, конечно, правильно изменить путь репозитория svn для использования этого параметра. – grapkulec

+0

Но вы можете сделать очередь сборки только одной заданной глубиной (для данного исполнителя сборки задано «# исполнителей»), и это даст результат, который вы после ... даже если параллельные сборки будут быстрее. – MattyT

10

Вы должны сделать несколько вещей, чтобы построить именно каждый пересмотр:

  • добавить параметр в REVISION строку в работе
  • добавить параметр ${REVISION} в хранилище URL,
    например: https://server/path/myproject${REVISION}
  • задает имя локальной папки «myproject» (см. Предыдущий пример), потому что переменная REVISION расширяется только в URL-адресе, но при создании папки Hudson не будет расширять ее, resu lting в папку с именем: myproject${REVISION}
  • спускового сконфигурированного сборки от после совершения крючок, как это: /usr/bin/wget \ --auth-no-challenge \ --no-check-certificate \ --user=me \ --password=mypasswd \ https: //server/path/job/jobname/buildWithParameters?delay=0sec\&REVISION=%40$REV \ -O /dev/null

Если вы хотите, чтобы вызвать сборку вручную, у вас есть две возможности:

  • Если вы хотите построить ревизию HEAD, вы должны оставить параметр REVISION пустым
  • , если вы хотите построить конкретную ревизию, вам нужно ввести @NNN (например: @ 1234).

@ знак очень важно, потому что все это трюк основан на том факте, что Subversion плагин интерпретирует [email protected] как get revision NNN from repository at URL. Если вы забудете @, Subversion просто скажет, что не может найти папку https://server/path/myprojectNNN. Вот почему вам нужно поставить %40 между REVISION= и $REV в команде wget, %40 - это экранированный символ для @.

0

Ключ, чтобы убедиться каждый фиксация построен в Хадсон «параметризованное Сложение» и только если триггер строить с различными значениями параметров, Hudson будет думать, что это новая сборка и должны быть проведено в очереди сборки.Или это не будет записан Хадсоном, так как его считают, что это бессмысленно строить по сравнению с предыдущим одной

например вы можете щелкнуть «Build Now» для триггера сборки три раза и просто оставить build para как «null». вы увидите, что только первые две сборки находятся в очереди Хадсона. Третий будет проигнорирован: P круто, но очень плохо, что он не найден в каком-то документе, но с моими экспериментами на время :(

0

Я принял подход fchateaus выше (спасибо человеку!) И изменил его для работы с Mercurial.

Вам нужно будет отредактировать .hg/hgrc на центральном сервере и поместить крюк changegroup. Имейте в виду, что группы изменений только устанавливают первый набор изменений в переменную среды HG_NODE, поэтому вам нужно сделать hg-отзыв для захватите реальный узел наконечника и передайте это через URL вместо этого. Немного об уловке в одном слоте, но я это понял.

Это то, что вы сделали бы для Хадсона, работающего на Windows.

[hooks] 
# this uses wget to hit the hudson url responsible for starting a build - %HG_NODE% only gets first changeset of changegroup, so use hg tip to grab changeset most recently added instead 
changegroup.hudson = for /f "tokens=*" %G IN ('hg tip --template {node}') DO "C:\Program Files (x86)\UnxUtils\usr\local\wbin\wget" --non-verbose --spider http://HudsonServer:8080/job/{Repository}/buildWithParameters?HgRevId=%G | ECHO Result of Hudson Polling Request For Node %G 
# TODO: when Hudson implements polling with parameters, change to something like this 
#changegroup.hudson = for /f "tokens=*" %G IN ('hg tip --template {node}') DO "C:\Program Files (x86)\UnxUtils\usr\local\wbin\wget" --non-verbose --spider http://HudsonServer:8080/job/{Repository}/polling?HgRevId=%G | ECHO Result of Hudson Polling Request For Node %G