Почему InetAddress.getLocalHost(). GetHostName() возвращает значение, отличное от bash "hostname"?

У меня есть задача build.gradle, которая работает как чемпион в моей dev-блоке при создании файла свойств, который записывает имя машины, на которой была сгенерирована сборка. Логика достаточно проста...

def hostname = InetAddress.getLocalHost().getHostName();

В моем блоке dev это всегда дает такое же значение, как если бы я сделал hostname из оболочки bash.

bobk-mbp:DM_Server bobk$ hostname
bobk-mbp.local

На нашем сервере CI jenkins, однако, bash hostname возвращает одно, но мой вызов InetAddress.getLocalHost(). getHostName(); возвращает что-то еще. Что нужно изменить на машине jenkins, чтобы эти два возвращали одинаковое значение?

Ответ 1

Предполагая, что вы используете linux, команда hostname, выполненная из o/s, возвращает имя ядра, сконфигурированное в ядре.

InetAddress.getHostName() выполняет обратный поиск по IP-адресу сервера, используя службу именования (DNS), настроенную в вашем O/S.

Если вам нужно имя хоста, которое понимается o/s, получение его из переменной окружения через System.getenv может быть самым простым вариантом. Это не вполне надежный способ сделать это, но этого может быть достаточно без необходимости вникать в сетевой или системный администратор.

Ответ 2

В документации API для InetAddress.getHostName();

Если этот InetAddress был создан с именем хоста, это имя хоста будет запомнено и возвращено; в противном случае будет выполнен поиск обратного имени, и результат будет возвращен на основе настроенной системой службы поиска имен. Если требуется поиск службы имен, вызовите getCanonicalHostName.

Таким образом, вам может понадобиться настроить DNS на сервере Jenkins. Самый простой способ сделать это - отредактировать /etc/hosts (я предполагаю, что ваш Jenkins работает в Linux) и убедитесь, что он выглядит так:

127.0.0.1           localhost       localhost.localdomain
<public IP address> <hostname>      <hostname>.<domain>