2012-02-14 26 views
8

Chúng tôi có một plugin tùy chỉnh cho Hudson mà tải lên đầu ra của một xây dựng lên một máy từ xa. Chúng tôi vừa mới bắt đầu xem xét sử dụng một nô lệ Hudson để cải thiện thông lượng của các bản dựng, nhưng các dự án sử dụng plugin tùy chỉnh không triển khai được với FileNotFoundExceptions.Có thể chạy nô lệ Hudson không?

Từ những gì chúng ta có thể thấy, plugin đang được chạy trên bản gốc ngay cả khi việc xây dựng đang diễn ra trên nô lệ. Tệp không được tìm thấy tồn tại trên slave nhưng không tồn tại trên master.

Câu hỏi:

  1. thể plugin được chạy trên những người nô lệ? Nếu vậy, làm thế nào? Có cách nào để xác định một plugin là 'serializable'? Nếu các nô lệ Hudson không thể chạy các trình bổ sung, thì việc thanh toán SVN xảy ra như thế nào?
  2. Một số nhà phát triển ở đây nghĩ rằng giải pháp cho vấn đề này là làm cho không gian làm việc của chủ của Hudson là ổ đĩa mạng và để nô lệ sử dụng cùng một không gian làm việc - đây có phải là ý tưởng tồi tệ như tôi không?

Trả lời

16

Đầu tiên, go Jenkins! ;)

Thứ hai, bạn chính xác là — mã đang được thực thi trên máy chủ. Đây là hành vi mặc định của plugin Hudson/Jenkins.

Khi bạn muốn chạy mã trên nút từ xa, bạn cần có tham chiếu đến nút đó VirtualChannel, ví dụ: qua số Launcher có thể được chuyển vào phương thức chính của plugin của bạn.

Mã được chạy trên nút điều khiển từ xa phải được đóng gói trong Callable — đây là phần cần nối tiếp, vì Jenkins sẽ tự động nối tiếp, chuyển nó tới nút qua kênh của nó, thực thi và trả về kết quả.

Điều này cũng ẩn sự khác biệt giữa chủ và nô lệ — ngay cả khi bản dựng thực sự chạy trên máy chủ, mã "có thể gọi" sẽ chạy trong suốt trên máy chính xác.

Ví dụ:

@Override 
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, 
         BuildListener listener) { 
    // This method is being run on the master... 

    // Define what should be run on the slave for this build 
    Callable<String, IOException> task = new Callable<String, IOException>() { 
     public String call() throws IOException { 
      // This code will run on the build slave 
      return InetAddress.getLocalHost().getHostName(); 
     } 
    }; 

    // Get a "channel" to the build machine and run the task there 
    String hostname = launcher.getChannel().call(task); 

    // Much success... 
} 

Xem thêm FileCallable, và kiểm tra mã nguồn của other Jenkins plugins với chức năng tương tự.

Tôi khuyên bạn nên làm cho plugin hoạt động đúng cách thay vì sử dụng giải pháp chia sẻ mạng .. :)

+0

+1 cho "automagically" – Cole9350

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