2012-02-14 11 views
8

Tenemos un complemento personalizado para Hudson que carga la salida de una construcción en una máquina remota. Acabamos de empezar a buscar el uso de un esclavo Hudson para mejorar el rendimiento de las compilaciones, pero los proyectos que utilizan el complemento personalizado no se implementan con FileNotFoundExceptions.¿Pueden los esclavos de Hudson ejecutar complementos?

Según lo que podemos ver, el complemento se está ejecutando en el maestro incluso cuando la compilación está ocurriendo en el esclavo. El archivo que no se encuentra existe en el esclavo pero no en el maestro.

Preguntas:

  1. Puede plugins pueden ejecutar en esclavos? ¿Si es así, cómo? ¿Hay alguna forma de identificar un complemento como 'serializable'? Si los esclavos de Hudson no pueden ejecutar complementos, ¿cómo se realiza el pago de SVN?
  2. Algunos de los desarrolladores aquí piensan que la solución a este problema es hacer del espacio de trabajo del maestro Hudson una unidad de red y dejar que el esclavo use ese mismo espacio de trabajo. ¿Es esta una mala idea como me parece a mí?

Respuesta

16

En primer lugar, go Jenkins! ;)

En segundo lugar, está correcto — el código se está ejecutando en el maestro. Este es el comportamiento predeterminado de un complemento de Hudson/Jenkins.

Cuando desee ejecutar código en un nodo remoto, debe obtener una referencia al nodo VirtualChannel, p. Ej. a través del Launcher que probablemente pasó al método principal de tu complemento.

El código para ejecutar en el nodo remoto debe ser encapsulado en una Callable — esta es la parte que necesita ser serialisable, como Jenkins automágicamente serializar él, pasar al nodo a través de su canal, ejecutarlo y retorno el resultado.

Esto también oculta la distinción entre maestro y esclavo —, incluso si la compilación se ejecuta realmente en el maestro, el código "invocable" se ejecutará de forma transparente en la máquina correcta.

Por ejemplo:

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

Ver también FileCallable, y ver el código fuente de other Jenkins plugins con una funcionalidad similar.

Recomendaría hacer su trabajo adecuadamente complemento en lugar de utilizar la solución recurso compartido de red .. :)

+0

1 para "automágicamente" – Cole9350

Cuestiones relacionadas