Я новичок в 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 анализ Неизвестный тип контента: ноль
Когда я использую 1xx.xx.xxx.xx:8080/github-webhook я попадаю на страницу Jenkins, но появляется сообщение: «Упс! Возникла проблема при обработке вашего запроса. Идентификатор журнала = 9ab9f0ea-0cb1-4281». -b234-ac1a45d34e45 Мне придется выяснить, где находятся логи Дженкинса и как я их читаю!
@Iterokun Я сообщаю о том, что было в журналах после того, как попробовал ваше предложение в конце моего вопроса (как ОБНОВЛЕНИЕ). Спасибо!
Извините, моя вина, не упомянул, что вам нужно сделать ПОСТ. GitHub использует его для веб-перехватчиков для доставки полезных данных. Попробуйте с curl -X POST url
. Изменяется ли это сообщение об ошибке?
Хм. Я не очень хорошо знаком с завитком. Когда я делаю curl -X POST 1xx.xx.xxx.xx:8080/github-webhook, я получаю: Invoke-WebRequest: Невозможно найти параметр, соответствующий имени параметра «X». Это в командной строке в Windows
@Iterokun У меня Post работает с URL-адресом Curl.exe -X POST. Результаты добавляются в Обновление. Обратите внимание на ошибки с обеих сторон.
Я подозреваю, что получить это сообщение об ошибке — это нормально, поскольку мы не отправляем информацию о типе события в этом простом POST! Итак, на основе вашего теста я, похоже, смогу поразить машину Дженкинса.
Подозрительно, что вы получаете 400 локально и 502 с GitHub. Вы уверены, что используете общедоступный IP-адрес для своего Jenkins?
Я согласен! Очень странно. Я на время отложил эту проблему и вернулся к ней. Те же результаты. Я могу поразить машину Дженкинса из любого места с помощью оператора «curl». Я получаю сообщение «Ошибка 400 Hook должна содержать тип события». Однако в Github ответ отображается как «502». Я дважды и трижды проверил IP-адрес и написание github-webhook. Я попробовал тип контента как «application/x-www-form-urlencorded» и попробовал «application/json»!
Единственный раз, когда я получаю 502, это когда между GitHub и Jenkins нет сетевого подключения. Лучший способ проверить — с ноутбука, подключенного к мобильному телефону. Таким образом, вы отключитесь от корпоративной сети.
Есть ли шанс, что вы сможете обновить вопрос, указав последние поставки/полезную нагрузку, отправленные github через веб-хук? Это может помочь выяснить, не совпадает ли версия плагина. Другое дело, что размер полезной нагрузки мог превышать 20 МБ, что приводило к сбою шлюза? Хотя я думаю, что это маловероятно, но это легко исключить.
@Iterokun, не могли бы вы опубликовать некоторые свои комментарии (особенно по поводу завитка) в ответе, и я приму? Вы приложили немало усилий, чтобы ответить на этот вопрос, и ваши комментарии привели к ответу, который я опубликую. Однако я не могу назначить награду самому себе, поэтому думаю, что вы должны ее получить. Подробности в моем ответе.
Должен стыдливо признаться, что ответ был довольно очевиден. Конечно, задним числом всё очевидно :) Комментарии Итерокуна привели к ответу. Мой экземпляр Jenkins находится за брандмауэром, и доступ к нему должен осуществляться через VPN. Вот почему я мог достичь этого с помощью предложения @Iterokun «завиток ...». с моего рабочего ноутбука. Я почти всегда использую VPN. Фактически, когда я отключил VPN, я даже не смог пропинговать экземпляр Jenkins, не говоря уже об использовании Curl. GitHub находится в облаке и понятия не имеет о нашем брандмауэре или VPN. До него можно добраться из Дженкинса, но он не может достичь Дженкинса. Итак, вместо использования веб-перехватчиков, переходящих из Github в Jenkins, я могу опросить Jenkins в Github, или, если я действительно заинтересован и полон решимости заставить веб-перехватчики работать, есть несколько альтернатив:
Первое, что нужно попробовать, — это отправить запрос на публикацию с вашего ноутбука на URL-адрес, который вы настроили в веб-перехватчике.
curl -X POST url
Вы не получите 200, поскольку вы не предоставляете ожидаемую полезную нагрузку, но и 502 не должно быть.
Как только вы подтвердите, что сам Дженкинс не является источником 502, вы сможете проверить сетевое подключение за пределами вашей сети, например, с ноутбука, подключенного к вашему мобильному телефону.
Если вы обнаружите, что конфигурация вашей сети блокирует вызовы, вы можете попробовать открыть трафик для IP-адресов, с которых поступают вызовы веб-перехватчика. Они описаны в конечной точке мета API в разделе «хуки».
Спасибо @Iterokun! Будущим читателям смотрите мой ответ. Первоначальные комментарии Итерокуна побудили меня ответить!
Какой бы URL-адрес веб-перехватчика вы ни настроили в GitHub, что происходит, когда вы нажимаете на него прямо из браузера? 502 или что-то еще? Что вы видите в журналах Дженкинса?