Автоматический запуск задания Дженкинса при фиксации кода в репозитории SVN с использованием перехвата POST COMMIT - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь реализовать конвейер CI / CD, используя Jenkins, Docker и Ansible. Я использую SVN-репозиторий для своей системы контроля версий. Для развертывания и репо кода SVN я использую AWS EC2. Развертывание и репозиторий находятся в отдельной виртуальной машине.

Мои требования

Когда я фиксирую свой код в репозитории SVN, мне нужно запустить одно задание Jenkins. Это задание будет называться «сборник рассказов». Позже он создаст проект, создаст образ Docker и развернет его в EC2. Поэтому для любых изменений в моем репозитории SVN-кода мне нужно создать задание Jenkins.

Моя текущая попытка

Я добавил следующий скрипт в файл post-commit.tmpl в папке $ repo / hooks.

REPOS="$1"
REV="$2"
UUID=`svnlook uuid $REPOS`
/usr/bin/wget \
  --header "Content-Type:text/plain;charset=UTF-8" \
  --post-data "`svnlook changed --revision $REV $REPOS`" \
  --output-document "-" \
  --timeout=2 \
  http://server/subversion/${UUID}/notifyCommit?rev=$REV

Ниже приведен скриншот

enter image description here

И отметили опцию «Опрос SCM в задании Jenkins»:

enter image description here

NB: Я не ищу график минут / часов / недели, чтобы вытащить из репо. Вместо этого я смотрю, когда происходит изменение кода, тогда мне нужно построить проект Jenkins. Поэтому я не добавил никакого расписания.

Но я все еще не получаю последний код в Дженкинс. Как я могу узнать проблему, связанную с моей конфигурацией?

Обновлен файл post-commit.tmpl

enter image description here

Ответы [ 4 ]

0 голосов
/ 12 декабря 2018

Я предпринял много попыток решить эту проблему, используя указания из ответов. Наконец-то я получил актуальную проблему, с которой столкнулся. Я добавил скрипт post-commit в файл "post-commit.tmpl". Этот файл по умолчанию я получил, когда создал свой SVN-репозиторий. Вместо добавления «post-commit.tmpl» нужно создать файл просто «post-commit». Это решило мою проблему.

0 голосов
/ 12 ноября 2018

Как сказал @bahrep, трудно устранять подобные проблемы, но я предполагаю, что ваш хук после фиксации не работает из-за опции безопасности Jenkins «Предотвращение подделки межсайтовых запросов» (вы подтвердили, что она включена) ,

Из Jenkins Wiki :

Если ваш Jenkins использует «Предотвращение подделки межсайтовых запросов» Опция безопасности, вышеуказанный запрос будет отклонен с 403 ошибками («Никакая действительная крошка не была включена»). Крошка, необходимая в этом запросе, может получить по URL http://server/crumbIssuer/api/xml (или / API / JSON). Это может быть включено в вызов wget выше с чем-то как это:

--header `wget -q --output-document - \
  'http://server/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'`

Самый простой способ подтвердить, вызывает ли проблема этот параметр безопасности, - отключить его и попробовать, будет ли работать ловушка после фиксации. Если да, включите снова и попробуйте настроить ловушку с крошкой. (В конце концов, вы хотите, чтобы все было в безопасности :))

А также убедитесь, что Дженкинс разрешил анонимный доступ для чтения:

Чтобы это работало, ваш Jenkins должен разрешить анонимный доступ для чтения (в частности, доступ «Работа> Чтение») к системе. Если контроль доступа для вашего Jenkins более ограничительным, вам может понадобиться указать имя пользователя и пароль, в зависимости от того, как ваша аутентификация сконфигурировано.

enter image description here

Редактировать

Я думаю, что проблемы возникают из-за того, что вы не указали адрес экземпляра Jenkins. В вашем примере с webhook у вас есть:

http://server/subversion/${UUID}/notifyCommit?rev=$REV

Вы должны изменить server на свой адрес экземпляра Jenkins (Ip, домен или ip и порт. Это зависит от вашей конфигурации.).

http://yourjenkins.com/subversion/${UUID}/notifyCommit?rev=$REV

http://<IP>:<Port>/subversion/${UUID}/notifyCommit?rev=$REV

http://<IP>/subversion/${UUID}/notifyCommit?rev=$REV

Или, если вы все запускаете локально (включая SVN-репо):

http://localhost:8080/subversion/${UUID}/notifyCommit?rev=$REV

Но не забудьте иметь:

  • Параметр безопасности «Предотвращать подделку межсайтовых запросов» отключен (вы создадите webhook для работы с этим параметром позже, теперь мы хотим найти основную причину)
  • Включена опция безопасности «разрешить анонимный доступ для чтения»

Я думаю, что скрипт ловушки работает просто отлично, но он отправляется в никуда. Это можно легко проверить, зарегистрировав скрипт хука. Просто добавьте в конце крючка:

echo "`$REPOS` change to revision `$REV` triggered @ `date`" >> ${REPOS}/post-commit-hook.log

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

0 голосов
/ 24 ноября 2018

есть более простой способ ... просто определив расписание для триггера:

jenkins screenshot

или используйте trigger builds remotely, если хотите получить push вместо решения для извлечения, которое требует публикации в https://username:api-token@JENKINS_URL/job/Example/build с предопределенным токеном API; аутентификация скриптовых клиентов объясняет это. опираясь только на предложенные изменения, потому что все остальное будет излишне стоить вычислительной мощности (что равнозначно деньгам).

0 голосов
/ 10 ноября 2018

Трудно устранить эту проблему, не видя реальных ошибок и журнала. Однако одной из возможных причин является то, что ваш SVN-сервер требует аутентификации. Вы должны указать правильное имя пользователя и пароль и убедиться, что эта учетная запись пользователя имеет разрешения на чтение для репозитория SVN.

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