2012-05-01 29 views
12

Estamos migrando de CruiseControl.NET a Jenkins solo para estar sincronizados con un socio, por lo que no tenemos dos scripts de CI diferentes. Estamos tratando de configurar a Jenkins para que haga algo similar a lo que hicimos con CruiseControl, que consistía en tener un servidor centralizado para invocar proyectos (trabajos en jenkins) en máquinas de construcción remota.¿Puede un jenkins maestro ejecutar trabajos en jenkins remotos?

Tenemos varias máquinas de construcción asociadas a un solo proyecto, por lo que cuando construyamos el proyecto desde el servidor de CI centralizado, se invocarán los proyectos en los servidores de CI remotos. Los servidores de CI remotos extraerían la versión del proyecto de servidor de CI centralizado.

En el control CruiseCruise configuramos un proyecto que haría un forceBuild en los proyectos remotos. Los proyectos en las máquinas de compilación usaron un remoteProjectLabeller para recuperar el número de versión para que estuvieran siempre sincronizados.

Para recuperar el número de compilación principal:

<labeller type="remoteProjectLabeller"> 
    <project>MainProject</project> 
    <serverUri>tcp://central-server:21234/CruiseManager.rem</serverUri> 
</labeller> 

para invocar a los proyectos remotas:

<forcebuild> 
    <project>RemoteBuildMachineA</project> 
    <serverUri>tcp://remote-server:21234/CruiseManager.rem</serverUri> 
    <integrationStatus>Success</integrationStatus> 
</forcebuild> 

lo que va de Jenkins he configurar un servidor secundario como esclavo usando el inicio de Java Web pero no sé cómo haría para que los maestros jenkins invoquen la configuración de los proyectos sobre los esclavos.

¿Puedo configurar Jenkins para invocar proyectos (trabajos) en esclavos?

¿Puedo hacer que los esclavos extraigan el número de versión del maestro?

EDITAR -

permítanme añadir algo más de información.

  • El maestro y los esclavos remotos de la máquina de compilación ejecutan Windows.
  • Teníamos el maestro central CruiseControl patear los proyectos remotos al mismo tiempo, por lo que se ejecutaron al mismo tiempo y me gustaría tener lo mismo con jenkins si es posible.

Respuesta

9

Jenkins tiene el concepto de build agents, que tal vez se ajuste mejor a su escenario: hay un maestro que desencadena la construcción y los esclavos que lo realizan. Una compilación puede restringirse a algunas categorías de esclavos solamente (por ejemplo, si depende de un software específico, no está presente en todos los agentes). Todos los datos son administrados centralmente por el maestro, que creo que es lo que está tratando de lograr.

+0

+1 sí Estaba pensando en la configuración en una mentalidad de Control de Crucero. Gracias. –

5

En Jenkins no es posible desencadenar una creación en un esclavo, es decir, donde se ejecuta una compilación no está controlada por quien la desencadena. Está controlado por la configuración del trabajo en sí. Cada trabajo tiene una configuración llamada "Restringir donde se puede ejecutar este trabajo".

En su caso, es probable que tenga dos trabajos: A y B. A se restringiría a ejecutar en "maestro" y B se configuraría para ejecutarse en "nombre de esclavo". Luego, todo lo que queda por hacer es que A dispare B.

Pero tenía otras limitaciones: desea que A y B verifiquen la misma versión del control de versión y que A y B se ejecuten en paralelo. Hay muchas maneras de lograrlo, pero lo más fácil es probablemente definir un trabajo de configuración múltiple.

No hay forma de convertir un trabajo existente de estilo libre en un trabajo de configuración múltiple, por lo que tendrá que hacer un nuevo trabajo.

  • seleccione Nuevo trabajo
  • elija Generar nuevo proyecto de configuración múltiple. Agrega un nombre
  • En la Matriz de configuración, abra el menú desplegable "Agregar eje".
  • Elija esclavos
  • Comprobar maestro y el esclavo
  • añadir la información de SMC y construir el paso (s)

Cuando se ejecuta el trabajo, se ejecuta tanto en el maestro y el esclavo. Jenkins se asegura de que compilan a partir de la misma versión de origen.

+2

* En Jenkins no es posible activar una creación en un esclavo, es decir, donde se ejecuta una compilación no está controlada por quien la desencadena * - esto no es 100% correcto. Puede especificar etiqueta de nodo como un parámetro con [Complemento de parámetro de etiqueta de nodo] (https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin) y luego usar el valor de ese parámetro en * Restringir donde este trabajo puede ejecutar * campo. –

+0

Configuré un entorno de prueba con tres máquinas virtuales, a, by c. A es el maestro, byc son los esclavos. Creé un trabajo de configuración múltiple y bajo la matriz de configuración solo seleccioné el nodo b porque solo quiero que se ejecute en esa VM. Sin embargo, cuando ejecuto la construcción, la ejecuto desde el maestro. ¿Por qué es esto? Espero que lo ejecute en el nodo que seleccioné. –

+0

@AndyArismendi, ¿estás seguro? Vaya al trabajo, seleccione la última compilación. Mostrará pequeñas bolas correspondientes a las compilaciones de su hijo (tal vez solo una, si solo tiene una compilación para un hijo, entonces dirá 'predeterminado' al lado). Las bolas serán azules, rojas o grises, dependiendo del estado. Haga clic en una de las bolas no grises. Ese es tu hijo estado de compilación. Se supone que el niño corre en esclavo 'b'. El trabajo de nivel superior, por otro lado, puede ejecutarse en cualquier lugar (a menos que esté vinculado a un nodo con una matriz Matrix Tie Parent). –

0

Desde/jenkins/url de la computadora, puede agregar, eliminar y reconfigurar "nodos" que son "agentes de compilación" locales o remotos.

Los trabajos se pueden restringir para ejecutarse en determinados agentes de compilación, o seguir varias reglas para seleccionar el agente de compilación adecuado entre los agentes disponibles.

+0

Lo siento, pero parece que no está diciendo aquí nada nuevo de lo que ya se ha proporcionado en las respuestas anteriores. –

0

Estaba pensando demasiado en Jenkins como en CruiseControl, donde el trabajo se define en la máquina remota. Entonces en Jenkins los proyectos remotos se definen en el maestro y se delegan a una máquina remota a través de un agente.

Utilicé el agente de Java Web Start instalado como un servicio de Windows en las máquinas remotas. Para ejecutar trabajos específicos en máquinas remotas específicas, definí cada nodo remoto con una etiqueta única en su configuración de esclavo. Para vincular trabajos específicos a esclavos específicos, utilicé la etiqueta del esclavo en cada configuración de trabajo ("Restringir dónde se puede ejecutar este proyecto").

Para activar los trabajos con un solo trabajo principal, creé un trabajo de estilo libre que solo se establece en "Crear otros proyectos" y proporcioné una lista separada por comas o nombres de proyecto. Este trabajo construye los trabajos indirectos en paralelo.

Todavía estoy buscando una forma de enviar un número de compilación maestro a los trabajos en sentido descendente para mantenerlos sincronizados siempre. (Esto se usa para versiones DLL y cosas así.)

Cuestiones relacionadas