2012-02-14 3 views
8

우리는 원격 컴퓨터에 빌드 출력을 업로드하는 허드슨을위한 커스텀 플러그인을 가지고 있습니다. 우리는 빌드의 처리량을 높이기 위해 허드슨 슬레이브를 사용하기 시작했습니다. 그러나 사용자 정의 플러그인을 사용하는 프로젝트는 FileNotFoundExceptions를 사용하여 배포하지 못하고 있습니다.허드슨 노예가 플러그인을 실행할 수 있습니까?

우리가 볼 수 있듯이, 플러그인은 슬레이브에서 빌드가 발생하더라도 마스터에서 실행 중입니다. 발견되지 않은 파일은 슬레이브에 존재하지만 마스터에는 존재하지 않습니다.

질문 :

이 이
  • 이 플러그인은 노예에서 실행할 수 있습니다
      ? 그렇다면 어떻게? 플러그인을 '직렬화 가능'으로 식별하는 방법이 있습니까? Hudson 노예가 플러그인을 실행할 수없는 경우 SVN 체크 아웃은 어떻게됩니까?
    1. 이 문제에 대한 해결책은 허드슨 마스터의 작업 공간을 네트워크 드라이브로 만들고 슬레이브가 동일한 작업 공간을 사용하게하는 것입니다. 이것이 나에게 나쁜 생각입니까?
  • 답변

    16

    우선, go Jenkins! ;)

    두 번째로 올바른 코드는 —이며 마스터에서 코드가 실행 중입니다. 이것은 Hudson/Jenkins 플러그인의 기본 동작입니다.

    원격 노드에서 코드를 실행하려면 해당 노드의 VirtualChannel에 대한 참조를 가져와야합니다. 이 플러그인은 플러그인의 기본 메소드로 전달 된 Launcher을 통해 전달됩니다.

    코드

    이 젠킨스가 자동적으로이를에는 직렬화 그 채널을 통해 노드에 전달, 그 대가를 실행하므로, serialisable되어야하는 부분 인 Callable — 캡슐화되어야 원격 노드에서 실행될 결과.

    빌드가 실제로 마스터에서 실행중인 경우에도 이것은 — 마스터와 슬레이브의 구분을 숨 깁니다. "호출 가능"코드는 올바른 컴퓨터에서 투명하게 실행됩니다. 예를 들어

    :

    @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... 
    } 
    

    FileCallable를 참조하고, 유사한 기능을 other Jenkins plugins의 소스 코드를 확인하십시오.

    네트워크 공유 솔루션을 사용하는 대신 플러그인을 올바르게 작동시키는 것이 좋습니다. :)

    +0

    +1 "자동" – Cole9350

    관련 문제