2012-06-21 56 views
11

我有一个build.gradle任务,就像我的开发箱上的冠军一样,生成一个属性文件,记录生成的机器的名称。逻辑足够简单...为什么InetAddress.getLocalHost()。getHostName()返回一个与bash“hostname”不同的值?

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

在我的开发盒上,这总是会产生相同的值,就像我从bash shell执行hostname一样。 。

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

在我们的詹金斯CI服务器,但是,bash的主机名返回的一件事,但我对InetAddress.getLocalHost()调用的gethostname();返回别的东西。在詹金斯机器上需要改变什么才能让这两个返回相同的值?

回答

9

假设你在Linux上,hostname命令执行从o/s返回内核的配置主机名。

InetAddress.getHostName()使用您的操作系统中配置的命名服务(DNS)对服务器的IP地址进行反向查找。

如果您需要o/s理解的主机名,通过System.getenv从环境变量获取它可能是最简单的选项。这不是一个完全可靠的方法,但它可能已经足够,无需深入研究网络或系统管理员。

+1

这是非常多的。甚至比环境变量更简单,就是将gradle移出到exec主机名(“hostname”.execute()。text)。适用于我。谢谢。 –

+0

我不得不使用''hostname'.execute()。text.trim()'去除尾随的换行符。 – friederbluemle

5

从InetAddress.getHostName()的API文档;

如果此InetAddress是使用主机名创建的,则会记住此主机名并将其返回;否则,将执行反向名称查找,并根据系统配置的名称查找服务返回结果。如果需要查找名称服务,请调用getCanonicalHostName。

因此,您可能需要在Jenkins服务器上配置DNS。要做到这一点,最简单的方法是编辑/ etc/hosts文件(我假设你的詹金斯在Linux上运行),并确保它看起来是这样的:

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

嗯。我们的/ etc/hosts看起来很像[127.0.0.1 \t \t localhost.localdomain localhost],但InetAddress.getHostName()的输出是“ab”。我倾向于“主机名”.execute()。文本并将其调用为好。 –

+1

这实际上是从/ etc/hosts的所需顺序向后,规范名称(带有域)元素应该在主机名之前。 http://man7.org/linux/man-pages/man5/hosts.5.html – NoUserException

相关问题