Автоматическая сборка Jenkins, инициированная с GitHub. Не работает. 502 вернулись

Я новичок в Jenkins, но успешно создал конвейер, который будет создавать наш проект, размещенный на GitHub. Пользователь может даже указать ветку (master, development, test и т. д.), которую он хочет построить. Теперь я хотел бы реализовать автоматические сборки всякий раз, когда происходит переход в определенную ветку (например, разработка). Отправка в другие ветки не должна приводить к автоматической сборке. У меня возникли проблемы с этим и даже с поиском информации об этом. Я нашел:

https://www.devopsschool.com/blog/how-to-build-when-a-change-is-pushed-to-github-in-jenkins/

Мой первый вопрос: существуют ли какие-либо другие источники информации для настройки автоматических сборок в Jenkins, когда резервным исходным репозиторием является GitHub (в отличие, например, от Bitbucket)? Вышеупомянутая статья датирована 2021 годом. Некоторые шаги и снимки экрана не соответствуют последним версиям Jenkins.

Конкретно с упомянутой статьей я выполнил все шаги. Вероятно, не удалось, иначе все работало бы! Следует отметить, что на шаге 2 я добавил сервер GitHub. Я указал URL-адрес API как https://api.github.com. Нажатие «Проверить соединение» приводит к:

Credentials verified for user davidrunner, rate limit: 4998

что кажется хорошим знаком. Я не установил флажок «Управление перехватчиками», так как документ, похоже, не проверял его. Я полагаю, что выполнил шаг 3 и настроил шаг 4 в репозитории GitHub.

Однако, когда я фиксирую и отправляю тестовое изменение в ветку «master» или «develop», я вижу в разделе «Последние поставки» для веб-перехватчиков красный треугольник с восклицательным знаком. Ответ пустой с «502». Я считаю, что это означает, что соединение было отклонено машиной Дженкинса.

Мои следующие вопросы: Как я могу устранить эту неполадку? Что мне следует проверить? Я еще раз подчеркиваю, что я, безусловно, могу вытащить код из Дженкинса и собрать. Итак, очевидно, что связь между GitHub и машиной Дженкинса возможна.

Обновлять

Я попробовал предложение Iterokun @Iterokun в комментариях ниже.

Когда я напрямую использую: 1xx.xx.xxx.xx:8080/github-webhook Я вижу следующие ошибки в журналах Jenkins:

May 22, 2024 3:39:06 PM INFO org.jenkinsci.plugins.github_branch_source.ApiRateLimitChecker$RateLimitCheckerAdapter checkRateLimit
LocalChecker for rate limit was not set for this thread. Configured using system settings with API URL 'https://api.github.com'.
May 22, 2024 3:41:21 PM SEVERE org.jenkinsci.plugins.github.webhook.GHEventPayload$PayloadHandler parse
**Unknown content type null**
May 22, 2024 3:41:21 PM WARNING hudson.init.impl.InstallUncaughtExceptionHandler handleException
Caught unhandled exception with ID 288b80b3-2bbf-49ee-a010-c0d2bab5e8d4
**java.lang.Exception: Method POST required**
    at org.kohsuke.stapler.HttpResponses.error(HttpResponses.java:92)

Я также попробовал команду Curl Post и получил следующее:

PS C:\andrew\Firmware> curl.exe -X POST http://1xx.xx.xxx.xx:8080/github-webhook/
<html>
<head>
<meta http-equiv = "Content-Type" content = "text/html;charset=ISO-8859-1"/>
<title>**Error 400 Hook should contain event type**</title>
</head>
<body><h2>**HTTP ERROR 400 Hook should contain event type**</h2>
<table>
<tr><th>URI:</th><td>/github-webhook/</td></tr>
<tr><th>STATUS:</th><td>400</td></tr>
<tr><th>MESSAGE:</th><td>Hook should contain event type</td></tr>
<tr><th>SERVLET:</th><td>Stapler</td></tr>
</table>
<hr/><a href = "https://eclipse.org/jetty">Powered by Jetty:// 10.0.20</a><hr/>

В журнале Дженкинса я вижу:

22 мая 2024 г., 19:26:07 SEVERE org.jenkinsci.plugins.github.webhook.GHEventPayload$PayloadHandler анализ Неизвестный тип контента: ноль

Какой бы URL-адрес веб-перехватчика вы ни настроили в GitHub, что происходит, когда вы нажимаете на него прямо из браузера? 502 или что-то еще? Что вы видите в журналах Дженкинса?

Iterokun 22.05.2024 14:24

Когда я использую 1xx.xx.xxx.xx:8080/github-webhook я попадаю на страницу Jenkins, но появляется сообщение: «Упс! Возникла проблема при обработке вашего запроса. Идентификатор журнала = 9ab9f0ea-0cb1-4281». -b234-ac1a45d34e45 Мне придется выяснить, где находятся логи Дженкинса и как я их читаю!

Dave 22.05.2024 15:41

@Iterokun Я сообщаю о том, что было в журналах после того, как попробовал ваше предложение в конце моего вопроса (как ОБНОВЛЕНИЕ). Спасибо!

Dave 22.05.2024 15:46

Извините, моя вина, не упомянул, что вам нужно сделать ПОСТ. GitHub использует его для веб-перехватчиков для доставки полезных данных. Попробуйте с curl -X POST url. Изменяется ли это сообщение об ошибке?

Iterokun 22.05.2024 16:35

Хм. Я не очень хорошо знаком с завитком. Когда я делаю curl -X POST 1xx.xx.xxx.xx:8080/github-webhook, я получаю: Invoke-WebRequest: Невозможно найти параметр, соответствующий имени параметра «X». Это в командной строке в Windows

Dave 22.05.2024 17:11

@Iterokun У меня Post работает с URL-адресом Curl.exe -X POST. Результаты добавляются в Обновление. Обратите внимание на ошибки с обеих сторон.

Dave 22.05.2024 19:31

Я подозреваю, что получить это сообщение об ошибке — это нормально, поскольку мы не отправляем информацию о типе события в этом простом POST! Итак, на основе вашего теста я, похоже, смогу поразить машину Дженкинса.

Dave 22.05.2024 22:58

Подозрительно, что вы получаете 400 локально и 502 с GitHub. Вы уверены, что используете общедоступный IP-адрес для своего Jenkins?

Iterokun 23.05.2024 07:38

Я согласен! Очень странно. Я на время отложил эту проблему и вернулся к ней. Те же результаты. Я могу поразить машину Дженкинса из любого места с помощью оператора «curl». Я получаю сообщение «Ошибка 400 Hook должна содержать тип события». Однако в Github ответ отображается как «502». Я дважды и трижды проверил IP-адрес и написание github-webhook. Я попробовал тип контента как «application/x-www-form-urlencorded» и попробовал «application/json»!

Dave 28.05.2024 22:54

Единственный раз, когда я получаю 502, это когда между GitHub и Jenkins нет сетевого подключения. Лучший способ проверить — с ноутбука, подключенного к мобильному телефону. Таким образом, вы отключитесь от корпоративной сети.

Iterokun 29.05.2024 13:53

Есть ли шанс, что вы сможете обновить вопрос, указав последние поставки/полезную нагрузку, отправленные github через веб-хук? Это может помочь выяснить, не совпадает ли версия плагина. Другое дело, что размер полезной нагрузки мог превышать 20 МБ, что приводило к сбою шлюза? Хотя я думаю, что это маловероятно, но это легко исключить.

Siddharth Kaul 29.05.2024 21:49

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

Dave 30.05.2024 17:25
Редкие достижения на Github ✨
Редкие достижения на Github ✨
Редкая коллекция доступна в профиле на GitHub ✨
1
12
185
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Должен стыдливо признаться, что ответ был довольно очевиден. Конечно, задним числом всё очевидно :) Комментарии Итерокуна привели к ответу. Мой экземпляр Jenkins находится за брандмауэром, и доступ к нему должен осуществляться через VPN. Вот почему я мог достичь этого с помощью предложения @Iterokun «завиток ...». с моего рабочего ноутбука. Я почти всегда использую VPN. Фактически, когда я отключил VPN, я даже не смог пропинговать экземпляр Jenkins, не говоря уже об использовании Curl. GitHub находится в облаке и понятия не имеет о нашем брандмауэре или VPN. До него можно добраться из Дженкинса, но он не может достичь Дженкинса. Итак, вместо использования веб-перехватчиков, переходящих из Github в Jenkins, я могу опросить Jenkins в Github, или, если я действительно заинтересован и полон решимости заставить веб-перехватчики работать, есть несколько альтернатив:

  1. Поместите Jenkins в облако Amazon или подобное.
  2. Используйте коммерческую службу ретрансляции (пример: https:webhookrelay.com) или создайте свою собственную. Я опубликую отдельные вопросы, если решу сделать 1 или 2. Это также управленческие решения, превышающие мою зарплату :). На данный момент я думаю, что перейду к опросу от Дженкинса к Github. Надеюсь, это легко — я никогда раньше этого не делал. Дженкинс для меня новый.
Ответ принят как подходящий

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

curl -X POST url

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

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

Если вы обнаружите, что конфигурация вашей сети блокирует вызовы, вы можете попробовать открыть трафик для IP-адресов, с которых поступают вызовы веб-перехватчика. Они описаны в конечной точке мета API в разделе «хуки».

Спасибо @Iterokun! Будущим читателям смотрите мой ответ. Первоначальные комментарии Итерокуна побудили меня ответить!

Dave 01.06.2024 17:47

Другие вопросы по теме