Why does InetAddress.getLocalHost().getHostName() return a value different from bash "hostname"?
Solution 1
Assuming you're on linux, the hostname command executed from the o/s returns the kernel's configured hostname.
InetAddress.getHostName() is doing a reverse lookup on the server's IP address using the naming service (DNS) configured in your O/S.
If you need the hostname as understood by the o/s, getting it from an environment variable via System.getenv may be the simplest option. It isn't a completely robust way to do this but it may be enough without needing to delve into network or system admin.
Solution 2
From the API documentation for InetAddress.getHostName();
If this InetAddress was created with a host name, this host name will be remembered and returned; otherwise, a reverse name lookup will be performed and the result will be returned based on the system configured name lookup service. If a lookup of the name service is required, call getCanonicalHostName.
So you may need to configure the DNS on the Jenkins server. The easiest way to do this is to edit /etc/hosts (I'm assuming your Jenkins runs on Linux) and make sure it looks like this:
127.0.0.1 localhost localhost.localdomain
<public IP address> <hostname> <hostname>.<domain>
Bob Kuhar
Technologist, Java Developer, Board Gamer, Roller Derby enthusiast, and Fly Fisherman.
Updated on July 31, 2022Comments
-
Bob Kuhar almost 2 years
I've got a build.gradle task that works like a champ on my dev box at producing a properties file that records the name of the machine that the build was generated on. The logic is simple enough...
def hostname = InetAddress.getLocalHost().getHostName();
On my dev box this always produces the same value as if I did hostname from the bash shell.
bobk-mbp:DM_Server bobk$ hostname bobk-mbp.local
On our jenkins CI server, however, bash hostname returns one thing, but my call to InetAddress.getLocalHost().getHostName(); returns something else. What needs to change on the jenkins machine to get these two returning the same value?
-
Bob Kuhar almost 12 yearsHmmm. Our /etc/hosts looks a lot like that [127.0.0.1 localhost.localdomain localhost] but the output of InetAddress.getHostName() is "ab". I'm leaning towards "hostname".execute().text and calling it good.
-
Bob Kuhar almost 12 yearsThis is pretty much it. Even simpler than the environment variable is shelling out of gradle to exec hostname ( "hostname".execute().text ). Works for me. Thanks.
-
NoUserException over 8 yearsThis is actually backwards from the desired order of /etc/hosts, the canonical name (with domain) element should come before hostname. man7.org/linux/man-pages/man5/hosts.5.html
-
friederbluemle almost 8 yearsI had to use
"hostname".execute().text.trim()
to remove the trailing newline character.