2012-06-21 57 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

相關問題