Сервер сборки не запускается: версия Java не подходит
Серверы сборки жёстко требуют определённых версий среды исполнения и отказываются работать на неподходящей. Осложняет разбор то, что на машине обычно несколько версий, и служба выбирает не ту, что нужна: выбор зависит от переменных окружения службы, а не от вашего профиля.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Установлена неподходящая версия среды исполнения
Программа проверяет версию при запуске и завершается с сообщением о несовместимости.
-
Служба выбирает не ту версию из нескольких
На машине несколько версий, и служба берёт версию по умолчанию системы, а не нужную. Ваш профиль на неё не влияет.
-
Памяти под сборки не хватает и служба падает позже
Запуск проходит, а при сборке среда исполнения не может выделить память и завершается. Это уже не версия, а ограничения.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сообщение при запуске: версия и путь к среде исполнения.
journalctl -u jenkins -n 40 --no-pagerКакая версия достаётся процессу от имени пользователя службы.
sudo systemd-run -q --pipe --property=User=jenkins java -version 2>&1 | head -3Окружение и предел памяти службы.
systemctl show jenkins -p Environment -p MemoryMaxРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Программа проверяет версию при запуске и завершается с сообщением о несовместимости.
- Как проверить
-
Посмотрите сообщение и установленные версии.
journalctl -u jenkins -n 20 --no-pager | grep -iE "java|version" update-alternatives --list java 2>/dev/null || ls /usr/lib/jvm/ 2>/dev/null
- Как исправить
- Установите требуемую версию среды исполнения. Требования к версии обычно указаны в примечаниях к выпуску программы.
- Почему происходит
- На машине несколько версий, и служба берёт версию по умолчанию системы, а не нужную. Ваш профиль на неё не влияет.
- Как проверить
-
Посмотрите, какая версия достаётся службе.
systemctl show jenkins -p Environment -p ExecStart sudo systemd-run -q --pipe --property=User=jenkins java -version 2>&1 | head -3
- Как исправить
-
Задайте путь к нужной среде исполнения переменной окружения службы или укажите её исполняемый файл в команде запуска явно.
[Service] Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
- Почему происходит
- Запуск проходит, а при сборке среда исполнения не может выделить память и завершается. Это уже не версия, а ограничения.
- Как проверить
-
Посмотрите ограничения памяти и последние сообщения.
systemctl show jenkins -p MemoryMax -p MemoryCurrent journalctl -u jenkins -n 30 --no-pager | grep -iE "OutOfMemory|heap"
- Как исправить
- Согласуйте предел памяти службы с размером кучи среды исполнения. Предел меньше кучи означает остановку процесса ядром при нагрузке.
Пример вывода
Установлена неподходящая версия среды исполнения. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
jenkins[6200]: java.lang.UnsupportedClassVersionError: hudson/WebAppMain has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
systemd[1]: jenkins.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- Java-служба не запускается: не найдена среда исполнения Служба на JVM падает с кодом 203 или 127: путь к java неверен или среда исполнения не установлена.
- Java-служба: OutOfMemoryError и куча Служба на JVM падает с нехваткой памяти: размер кучи, предел контрольной группы, дампы кучи.
- Node-служба не видит переменные окружения Приложение падает из-за отсутствующих переменных: файл .env не читается службой, окружение задаётся иначе.
- Tomcat: порт занят или служба не останавливается Отказы Tomcat: занятые порты приложения и остановки, долгое завершение, права на каталоги.
- Исполнитель задач не берёт работу, хотя служба активна Служба исполнителя сборок работает, но задачи не выполняются: нет связи с сервером, не тот токен, исчерпан предел задач.
- Служба на Java не может проверить сертификат собеседника Соединения отклоняются: хранилище доверенных сертификатов недоступно, устарело или не содержит нужного центра.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: could not bind to address Apache не занимает порт: конфликт с nginx, порт занят, нет прав на привилегированный порт.
Источники
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено запуском сервера сборки на неподходящей версии среды исполнения. -
systemd.exec(5)
Environment= и окружение процессов службы.