2012-06-21 35 views
11

Tôi có một tác vụ build.gradle hoạt động giống như một nhà vô địch trên hộp dev của tôi khi tạo một tệp thuộc tính ghi lại tên của máy mà bản dựng đã được tạo. Logic rất đơn giản ...Tại sao InetAddress.getLocalHost(). GetHostName() trả về một giá trị khác với bash "tên máy chủ"?

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

Trên hộp dev của tôi luôn tạo ra giá trị giống như tôi đã đặt tên máy chủ từ bash shell. .

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

Trên máy chủ Jenkins CI của chúng tôi, tuy nhiên, bash hostname trả về một chuyện, nhưng cuộc gọi của tôi để InetAddress.getLocalHost() getHostName(); trả lại cái gì khác. Những gì cần phải thay đổi trên máy jenkins để có được hai trở về cùng một giá trị?

Trả lời

9

Giả sử bạn đang ở trên Linux, lệnh hostname thực hiện từ o/s trả về tên máy chủ được cấu hình của hạt nhân.

InetAddress.getHostName() đang thực hiện tra cứu ngược trên địa chỉ IP của máy chủ bằng cách sử dụng dịch vụ đặt tên (DNS) được định cấu hình trong O/S của bạn.

Nếu bạn cần tên máy chủ được hiểu bởi o/s, hãy lấy nó từ biến môi trường qua System.getenv có thể là tùy chọn đơn giản nhất. Nó không phải là một cách hoàn toàn mạnh mẽ để làm điều này nhưng nó có thể là đủ mà không cần phải delve vào mạng hoặc quản trị hệ thống.

+1

Điều này là khá nhiều. Thậm chí đơn giản hơn so với biến môi trường là bắn ra khỏi gradle để exec hostname ("hostname" .execute(). Văn bản). Làm việc cho tôi. Cảm ơn. –

+0

Tôi đã phải sử dụng '" tên máy chủ ".execute(). Text.trim()' để loại bỏ ký tự dòng mới. – friederbluemle

5

Từ tài liệu API cho InetAddress.getHostName();

Nếu InetAddress này được tạo bằng tên máy chủ, tên máy chủ này sẽ được ghi nhớ và trả về; nếu không, tra cứu tên đảo ngược sẽ được thực hiện và kết quả sẽ được trả về dựa trên dịch vụ tra cứu tên được cấu hình hệ thống. Nếu cần tra cứu dịch vụ tên, hãy gọi getCanonicalHostName.

Vì vậy, bạn có thể cần định cấu hình DNS trên máy chủ Jenkins. Cách dễ nhất để làm điều này là để chỉnh sửa/etc/hosts (tôi giả sử Jenkins của bạn chạy trên Linux) và chắc chắn rằng nó trông như thế này:

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

Hmmm./Etc/hosts của chúng tôi trông rất giống [127.0.0.1 \t \t localhost.localdomain localhost] nhưng đầu ra của InetAddress.getHostName() là "ab". Tôi đang nghiêng về phía "hostname" .execute() văn bản và gọi nó là tốt. –

+1

Điều này thực sự là ngược lại từ thứ tự mong muốn của/etc/hosts, tên chính tắc (có tên miền) phải đến trước tên máy chủ. http://man7.org/linux/man-pages/man5/hosts.5.html – NoUserException

Các vấn đề liên quan