2012-02-14 10 views
8

Mamy niestandardową wtyczkę dla Hudsona, która przesyła dane wyjściowe kompilacji na zdalną maszynę. Właśnie rozpoczęliśmy pracę nad użyciem niewolnika Hudsona w celu zwiększenia przepustowości budowli, ale projekty korzystające z niestandardowej wtyczki nie mogą być wdrażane za pomocą FileNotFoundExceptions.Czy niewolnicy Hudsona mogą uruchamiać wtyczki?

Z tego, co widzimy, wtyczka uruchamiana jest na serwerze głównym, nawet gdy kompilacja dzieje się na niewolniku. Plik, który nie został znaleziony, istnieje w urządzeniu slave, ale nie w systemie nadrzędnym.

Pytania:

  1. Czy wtyczki są uruchamiane na niewolników? Jeśli tak to jak? Czy istnieje sposób na zidentyfikowanie wtyczki jako "nadającej się do serializacji"? Jeśli niewolnicy Hudsona nie mogą uruchamiać wtyczek, jak przebiega realizacja transakcji SVN?
  2. Niektórzy z twórców uważają, że rozwiązaniem tego problemu jest uczynienie przestrzeni roboczej mistrza Hudsona napędem sieciowym i pozwolić niewolnikowi korzystać z tej samej przestrzeni roboczej - czy jest to tak zły pomysł, jak mi się wydaje?

Odpowiedz

16

Po pierwsze, go Jenkins! ;)

Po drugie, masz poprawne — kod jest wykonywany na wzorcu. Jest to domyślne zachowanie wtyczki Hudson/Jenkins.

Aby uruchomić kod na zdalnym węźle, należy uzyskać odwołanie do tego węzła: VirtualChannel, np. przez Launcher, który prawdopodobnie przeszedł do głównej metody twojej wtyczki.

kod do uruchomienia na zdalnym komputerze powinien być zamknięty w Callable — jest to część, która musi być serialisable, jak Jenkins automagicznie serialise go przekazać go do węzła za pośrednictwem swojego kanału, uruchom go i zwrot wynik.

To również ukrywa rozróżnienie między master i slave —, nawet jeśli kompilacja działa na master, kod "callable" będzie przezroczyście działać na właściwym komputerze.

Na przykład:

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

Zobacz także FileCallable i sprawdzić kod źródłowy other Jenkins plugins o podobnej funkcjonalności.

Polecam czyniąc swoją pracę prawidłowo wtyczki zamiast przy użyciu rozwiązanie udziale sieciowym .. :)

+0

+1 dla „automagicznie” – Cole9350