15

我有一个 build.gradle 任务,它在我的开发盒上像冠军一样工作,生成一个属性文件,记录生成构建的机器的名称。逻辑很简单……

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

在我的开发盒上,这总是产生与我从 bash shell 生成主机名相同的值。

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

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

4

2 回答 2

14

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

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

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

于 2012-06-21T19:02:17.197 回答
8

来自 InetAddress.getHostName() 的 API 文档;

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

所以你可能需要在 Jenkins 服务器上配置 DNS。最简单的方法是编辑 /etc/hosts (我假设你的 Jenkins 在 Linux 上运行)并确保它看起来像这样:

127.0.0.1           localhost       localhost.localdomain
<public IP address> <hostname>      <hostname>.<domain>
于 2012-06-21T18:56:00.310 回答