Вопрос или проблема
Попытка запустить Jenkins slave на Windows с помощью Java Web Start выдает мне следующее:
>java -jar agent.jar -jnlpUrl https://jenkins.example.com/computer/slave-office/slave-agent.jnlp -secret 74aebde5a38c4f19b0b6c64ee9d3d75571d6cd666e67ebae7d39d8b259d39a0f -workDir C:\Jenkins\
ш■э 26, 2018 5:15:49 PM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
ИНФО: Используется C:\Jenkins\remoting в качестве рабочего каталога для удаленной работы
Оба лога ошибок и вывода будут напечатаны в C:\Jenkins\remoting
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main createEngine
ИНФО: Настройка агента: slave-office
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main$CuiListener <init>
ИНФО: Агент Jenkins работает в безголовом режиме.
ш■э 26, 2018 5:15:50 PM hudson.remoting.Engine startEngine
ИНФО: Используется версия Remoting: 3.22
ш■э 26, 2018 5:15:50 PM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
ИНФО: Используется C:\Jenkins\remoting в качестве рабочего каталога для удаленной работы
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main$CuiListener status
ИНФО: Поиск сервера среди [https://jenkins.example.com/]
ш■э 26, 2018 5:15:50 PM org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver resolve
ИНФО: Удаленный сервер принимает следующие протоколы: [JNLP4-connect, Ping]
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main$CuiListener status
ИНФО: Обнаружение агента успешно
Адрес агента: jenkins.example.com
Порт агента: 50000
Идентификатор: 62:e9:82:de:8b:ae:cf:6d:ea:9e:0b:cf:5c:ad:bb:10
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main$CuiListener status
ИНФО: Установка соединения
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main$CuiListener status
ИНФО: Подключение к jenkins.example.com:50000
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main$CuiListener status
ИНФО: Пытаюсь использовать протокол: JNLP4-connect
ш■э 26, 2018 5:15:50 PM org.jenkinsci.remoting.protocol.impl.AckFilterLayer abort
ПРЕДУПРЕЖДЕНИЕ: [JNLP4-connect соединение с jenkins.example.com/11.22.33.44:50000] Неправильная последовательность подтверждения, ожидалось 0x000341434b, получено 0x485454502f
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main$CuiListener status
ИНФО: Протокол JNLP4-connect столкнулся с неожиданным исключением
java.util.concurrent.ExecutionException: org.jenkinsci.remoting.protocol.impl.ConnectionRefusalException: Соединение закрыто до отправки подтверждения
в org.jenkinsci.remoting.util.SettableFuture.get(SettableFuture.java:223)
в hudson.remoting.Engine.innerRun(Engine.java:609)
в hudson.remoting.Engine.run(Engine.java:469)
Вызвано: org.jenkinsci.remoting.protocol.impl.ConnectionRefusalException: Соединение закрыто до отправки подтверждения
в org.jenkinsci.remoting.protocol.impl.AckFilterLayer.onRecvClosed(AckFilterLayer.java:280)
в org.jenkinsci.remoting.protocol.FilterLayer.abort(FilterLayer.java:164)
в org.jenkinsci.remoting.protocol.impl.AckFilterLayer.abort(AckFilterLayer.java:130)
в org.jenkinsci.remoting.protocol.impl.AckFilterLayer.onRecv(AckFilterLayer.java:258)
в org.jenkinsci.remoting.protocol.ProtocolStack$Ptr.onRecv(ProtocolStack.java:669)
в org.jenkinsci.remoting.protocol.NetworkLayer.onRead(NetworkLayer.java:136)
в org.jenkinsci.remoting.protocol.impl.BIONetworkLayer.access$2200(BIONetworkLayer.java:48)
в org.jenkinsci.remoting.protocol.impl.BIONetworkLayer$Reader.run(BIONetworkLayer.java:283)
в java.util.concurrent.ThreadPoolExecutor.runWorker(Неизвестный источник)
в java.util.concurrent.ThreadPoolExecutor$Worker.run(Неизвестный источник)
в hudson.remoting.Engine$1.lambda$newThread$0(Engine.java:93)
в java.lang.Thread.run(Неизвестный источник)
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main$CuiListener status
ИНФО: Подключение к jenkins.example.com:50000
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main$CuiListener status
ИНФО: Сервер сообщает, что протокол JNLP4-plaintext не поддерживается, пропускаем
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main$CuiListener status
ИНФО: Сервер сообщает, что протокол JNLP3-connect не поддерживается, пропускаем
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main$CuiListener status
ИНФО: Сервер сообщает, что протокол JNLP2-connect не поддерживается, пропускаем
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main$CuiListener status
ИНФО: Сервер сообщает, что протокол JNLP-connect не поддерживается, пропускаем
ш■э 26, 2018 5:15:50 PM hudson.remoting.jnlp.Main$CuiListener error
СЕРЬЕЗНО: Сервер отклонил соединение: Ни один из протоколов не был принят
java.lang.Exception: Сервер отклонил соединение: Ни один из протоколов не был принят
в hudson.remoting.Engine.onConnectionRejected(Engine.java:670)
в hudson.remoting.Engine.innerRun(Engine.java:634)
в hudson.remoting.Engine.run(Engine.java:469)
TCP порт для JNLP агентов, похоже, правильно настроен на 50000
Протокол Java Web Start Agent Protocol/4 (шифрование TLS) активирован
Https сертификат корректен & curl подтверждает, что сервер доступен
curl https://jenkins.example.com:50000
Jenkins-Agent-Protocols: JNLP4-connect, Ping
Jenkins-Version: 2.129
Jenkins-Session: 9ab0885c
Клиент: 10.42.24.96
Сервер: 10.42.7.42
Remoting-Minimum-Version: 3.4
Я столкнулся с аналогичной проблемой. В моем случае прямое подключение к хосту через частную сеть работало хорошо, но подключение через балансировщик нагрузки привело к тому же исключению.
Я запустил Wireshark и выяснил, что наш балансировщик нагрузки не пропускал часть TCP трафика. Я смог отключить специфическую конфигурацию HTTP на балансировщике нагрузки и настроить его на проходной TCP. Этого было достаточно, чтобы решить проблемы с подключением.
В моем случае мне нужно было обновить URL Jenkins, чтобы он совпадал с тем IP, который я использовал для подключения (приватный IP), тогда как в текущий момент использовался публичный IP, который был защищен с помощью nginx auth.
<jenkins url>/configure
Обновите URL Jenkins до того же, к которому пытаются подключиться агенты.
Ответ или решение
Проблема с подключением Jenkins-агента на Windows через Java Web Start может быть вызвана несколькими факторами, и существует ряд шагов, которые можно предпринять для диагностики и решения этой проблемы. Рассмотрим ключевые моменты, которые могут помочь вам устранить неполадки.
1. Понимание ошибки
На основе предоставленных логов, видно следующее:
- Agent успешно обнаруживает сервер и начинает соединение.
- Однако возникает проблема с последовательностью подтверждений ("Incorrect acknowledgement sequence").
- Сервер отклоняет соединение, так как не было принято ни одного из поддерживаемых протоколов.
Эта информация указывает на проблемы с совместимостью протоколов, сетевыми настройками или конфигурацией сервера Jenkins.
2. Проверка конфигурации Jenkins
2.1 Параметры протоколов
Убедитесь, что сервер настроен на использование подходящих протоколов агентов. Проверьте настройки в Jenkins (в разделе "Manage Jenkins" → "Configure Global Security"). Протокол Java Web Start Agent Protocol/4 (TLS encryption) должен быть включен. Возможно, стоит попробовать отключить поддержку для устаревших протоколов (JNLP2, JNLP3), если они больше не требуются.
2.2 Jenkins URL
Некоторые пользователи сообщали, что замена публичного IP на частный (или наоборот) в конфигурации Jenkins помогала решить проблему. Вы можете проверить и обновить URL Jenkins в разделе <jenkins url>/configure
, указав IP-адрес, который ваш агент использует для подключения.
3. Сетевые настройки
3.1 Проверка брандмауэра
Убедитесь, что порты, используемые Jenkins (по умолчанию 50000), не блокируются брандмауэром Windows или сторонними фаерволами. Для этого можно временно отключить брандмауэр и проверить возможность соединения. Если это решает проблему, добавьте исключения для необходимых портов.
3.2 Настройки прокси и балансировки нагрузки
Как показано в вашем случае, подключения через балансировщик нагрузки могут вызывать подобные проблемы. Проверьте настройки балансировщика – возможно, он не передает все TCP-трафики корректно. Попробуйте настроить его в режиме "TCP passthrough", если это возможно.
4. Тестирование соединения
Используйте команду curl
, чтобы проверить доступность порта:
curl -v https://jenkins.example.com:50000
Убедитесь, что ответ включает необходимые заголовки, такие как Jenkins-Agent-Protocols
, что подтверждает успешное соединение.
5. Логи и отладка
Если у вас все еще возникают проблемы, рекомендуется углубленно проанализировать логи Jenkins. Обратите внимание на сообщения об ошибках на сервере, которые могут дать больше информации. Если у вас есть доступ к Wireshark, используйте его для анализа сетевого трафика и поиска проблем с соединением.
Заключение
В целом, устранение проблем с подключением Jenkins-агента на Windows требует внимательного анализа конфигурации сервера, сетевых настроек и используемых протоколов. Следуйте вышеуказанным шагам, и вы сможете определить и устранить причину неполадок. Если все вышеперечисленные методы не помогли, можно обратиться к сообществу Jenkins за дополнительной помощью или рассмотреть возможность обновления Jenkins до последней версии, поскольку проблемы могут быть вызваны ошибками в предыдущих релизах.