Jenkins CI: как запускать сборки на основе коммита SVN

79

Какие плагины и функции плагинов мне нужно установить, чтобы моя работа Jenkins запускала сборку в любое время, когда код привязан к проекту SVN?

Я установил как стандартный плагин SVN, так и плагин тегов SVN, но я не вижу никаких новых функций, позволяющих настраивать триггер.

IAmYourFaja
источник
1
возможный дубликат сборки Trigger hudson при фиксации svn
высоким содержанием кофеина

Ответы:

86

Есть два способа сделать это:

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

  1. Опросите репозиторий, чтобы узнать, произошли ли изменения. Это может «пропустить» фиксацию, если две фиксации происходят в пределах одного интервала опроса. Описание того, как это сделать, здесь. Обратите внимание на четвертый снимок экрана, на котором вы настраиваете для задания «триггер сборки» на основе опроса репозитория (с конфигурацией, подобной crontab).

  2. Настройте свой репозиторий так, чтобы в нем был обработчик после фиксации, который уведомляет Дженкинса о необходимости запуска сборки. Описание того, как это сделать, здесь , в разделе «хуки после фиксации».

Функция SVN Tag не является частью опроса, она является частью продвижения текущей «головы» исходного кода в тег для создания моментального снимка сборки. Это позволяет вам ссылаться на сборку Jenkins # 32 как на SVN tag / tags / build-32 (или что-то подобное).

Эдвин Бак
источник
после фиксации крючки рок. Более быстрое время отклика и (в масштабе) ваша CI-система не сокрушает исходное репозиторий сотнями запросов журнала изменений.
EricMinick 05
5
@EricMinick Они великолепны, но иногда они могут растопить CI-сервер, если вы получите много мелких коммитов за короткий период времени. Это все лошади для курсов, и трудно понять, какой метод подходит, без анализа того, как ваш процесс разработки в настоящее время работает.
Эдвин Бак
1
@EdwinBuck: Вы знаете, есть ли способ настроить Jenkins для создания только выборочных коммитов? Я объясню, у меня есть tortoiseSVN и проект Jenkins, который продолжает опрашивать репозиторий. Теперь, если я хочу, чтобы сделанная мной фиксация не запускала Дженкинса, есть ли способ сделать это?
SandBag_1996 05
@UnderDog Если вы достигли точки, в которой у вас есть триггер после фиксации в maven, то я предпочитаю решение, которое ищет специальные «ключевые слова» в триггере после фиксации и при их обнаружении НЕ сообщает Дженкинсу сервер для запуска новой сборки. Например, «^ DONTBUILD -. *» Может использоваться как флаг «не строить», если он указан в первой строке коммита.
Эдвин Бак
@mxdsp Обновил ссылку. Он не такой красивый, как старый wandisco, но со своей работой справится. Спасибо!
Эдвин Бак
2

Вам нужен только один плагин - плагин Subversion.

Затем просто перейдите в Jenkins → job_name → Build Trigger section → (i) Триггерная сборка удаленно (то есть из скриптов). Токен аутентификации: Token_name

Перейдите в каталог хуков сервера SVN, а затем после выполнения следующих команд:

  1. cp post-commit.tmpl post-commit
  2. chmod 777 post-commit
  3. chown -R www-data:www-data post-commit
  4. vi post-commit

    Примечание: все строки должны быть прокомментированы. Добавьте последнюю строку ниже.

Синтаксис (для пользователей Linux):

/usr/bin/curl http://username:API_token@localhost:8081/job/job_name/build?token=Token_name

Синтаксис (для пользователя Windows):

C:/curl_for_win/curl http://username:API_token@localhost:8081/job/job_name/build?token=Token_name
Хемин Патель
источник
Этот ответ более или менее идентичен этому ответу .
Питер Мортенсен
1

Я сделал инструмент с использованием Python с некоторым bash для запуска сборки Jenkins. По сути, вам нужно собрать эти два значения из пост-фиксации, когда фиксация попадает на сервер SVN:

REPOS="$1"
REV="$2"

Затем вы используете «svnlook dirs-changed $ 1 -r $ 2», чтобы получить путь, который только что зафиксирован. Затем вы можете проверить, какой репозиторий вы хотите создать. Представьте, что у вас есть сотни тысяч проектов. Вы не можете проверить весь репозиторий, верно?

Вы можете проверить мой скрипт на GitHub .

Фан Долфи
источник
-1

Вы можете использовать ловушку после фиксации.

Поместите скрипт перехвата после фиксации в hooksпапку, создайте на wget_folderвашем диске C: \ и поместите wget.exeфайл в эту папку. Добавьте следующий код в файл с именемpost-commit.bat

SET REPOS=%1   
SET REV=%2

FOR /f "tokens=*" %%a IN (  
'svnlook uuid %REPOS%'  
) DO (  
SET UUID=%%a  
)  

FOR /f "tokens=*" %%b IN (  
'svnlook changed --revision %REV% %REPOS%'  
) DO (  
SET POST=%%b   
)

echo %REPOS% ----- 1>&2

echo %REV% -- 1>&2

echo %UUID% --1>&2

echo %POST% --1>&2

C:\wget_folder\wget ^   
    --header="Content-Type:text/plain" ^   
    --post-data="%POST%" ^   
    --output-document="-" ^   
    --timeout=2 ^     
    http://localhost:9090/job/Test/build/%UUID%/notifyCommit?rev=%REV%    

где Test = название задания

echoиспользуется для просмотра значения, и вы также можете добавить его exit 2в конце, чтобы узнать о проблеме и о том, запущен ли скрипт ловушки после фиксации или нет.

Мегха
источник