2012-06-21 2 views
11

Ich habe eine build.gradle-Aufgabe, die wie ein Champ auf meiner Entwickler-Box funktioniert, wenn ich eine Eigenschaftendatei erzeuge, die den Namen des Rechners aufzeichnet, auf dem der Build erzeugt wurde. Die Logik ist einfach genug ...Warum gibt InetAddress.getLocalHost(). GetHostName() einen anderen Wert als bash "hostname" zurück?

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

Auf meiner Dev-Box diese immer den gleichen Wert erzeugt, als ob ich die Hostnamen aus dem Bash-Shell hatte. .

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

Auf unserem jenkins CI-Server, eine Sache, aber bash Host-Name zurückgibt, aber mein Aufruf an InetAddress.getLocalHost() getHostName(); gibt etwas anderes zurück. Was muss auf der Jenkins-Maschine geändert werden, damit diese beiden den gleichen Wert erhalten?

Antwort

9

Angenommen, Sie auf Linux sind, ausgeführt der Befehl hostname aus dem o/s gibt den konfigurierten Hostnamen des Kerns zurück.

InetAddress.getHostName() führt eine umgekehrte Suche auf der IP-Adresse des Servers unter Verwendung des Namensdienstes (DNS) durch, der in Ihrem O/S konfiguriert ist.

Wenn Sie den Hostnamen benötigen, wie er von den o/s verstanden wird, ist die Verwendung einer Umgebungsvariable über System.getenv die einfachste Option. Es ist keine völlig robuste Möglichkeit, dies zu tun, aber es kann genug sein, ohne sich in den Netzwerk- oder Systemadministrator vertiefen zu müssen.

+1

Das ist so ziemlich das. Noch einfacher als die Umgebungsvariable ist das Ausblenden von Gradle zu exec Hostname ("Hostname" .execute(). Text). Funktioniert bei mir. Vielen Dank. –

+0

Ich musste '" hostname ".execute(). Text.trim()' verwenden, um das nachfolgende Newline-Zeichen zu entfernen. – friederbluemle

5

Aus der API-Dokumentation für InetAddress.getHostName();

Wenn diese InetAddress mit einem Hostnamen erstellt wurde, wird dieser Hostname gespeichert und zurückgegeben. Andernfalls wird eine Reverse-Name-Suche durchgeführt, und das Ergebnis wird basierend auf dem vom System konfigurierten Namen-Suchdienst zurückgegeben. Wenn eine Suche des Namensdienstes erforderlich ist, rufen Sie getCanonicalHostName auf.

Sie müssen möglicherweise die DNS auf dem Jenkins-Server konfigurieren. Der einfachste Weg, dies zu tun, müssen Sie/etc/hosts (Ich gehe davon aus Ihrer Jenkins auf Linux läuft) und stellen Sie sicher, dass es wie folgt aussieht:

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

Hmmm. Unser/etc/hosts sieht sehr ähnlich aus [127.0.0.1 \t \t localhost.localdomain localhost], aber die Ausgabe von InetAddress.getHostName() ist "ab". Ich lehne mich auf "Hostname" .execute(). Text und nenne es gut. –

+1

Dies ist eigentlich rückwärts von der gewünschten Reihenfolge von/etc/hosts, der kanonische Name (mit Domain) sollte vor dem Hostnamen stehen. http://man7.org/linux/man-pages/man5/hosts.html – NoUserException

Verwandte Themen