programar - integrar sonar con jenkins
Ejecutando el trabajo de Jenkins simultáneamente en todos los nodos (8)
Tengo un gran grupo de nodos con la misma etiqueta. Me gustaría poder ejecutar un trabajo en Jenkins que se ejecute en todos los nodos con la misma etiqueta y que lo haga simultáneamente.
Vi una sugerencia de usar la opción de configuración de matriz en Jenkins, pero solo puedo pensar en un eje (el grupo de etiquetas). Cuando intento ejecutar el trabajo, parece que solo se ejecuta una vez en lugar de 300 veces (1 para cada uno de los nodos de ese grupo de etiquetas).
¿Cuál debería ser mi otro eje? O ... ¿hay algún plugin para hacer esto? Probé el complemento de parámetros de NodeLabel y elegí "ejecutar en todos los nodos en línea disponibles", pero no parece que se ejecuten los trabajos simultáneamente.
- Instalar
- Para el trabajo que desea ejecutar, habilite Ejecutar compilaciones concurrentes si es necesario
- Cree otro trabajo además del trabajo que desea ejecutar en todos los esclavos y configúrelo
- Compilación> Agregar paso de compilación> Activar / generar compilaciones en otros proyectos
- Añadir ParameterFactories> Todos los nodos para Label Factory> Etiqueta: la etiqueta de los nodos
- Compilación> Agregar paso de compilación> Activar / generar compilaciones en otros proyectos
Habilitar This project is parameterized
, agregue un parámetro de tipo Label
, ingrese un nombre arbitrario para la etiqueta y seleccione un valor predeterminado, como una etiqueta que cubra varios nodos o una conjunción (&&) de dichas etiquetas. Habilite Run on all nodes matching the label
, mantenga Run regardless of result
, mantenga la Node eligibility
en All nodes
.
Hay dos complementos que necesita: Paramitrized Trigger Plugin para poder activar otros trabajos como paso de compilación de su trabajo principal, y NodeLabel Plugin (lea la sección BuildParameterFactory para la descripción de lo que necesita) para especificar la etiqueta.
La estructura de la matriz funcionará; use "Slaves" como eje y expanda la lista "Nodos individuales" para seleccionar todos sus nodos.
Tenga en cuenta que deberá actualizar la selección cada vez que agregue o elimine un esclavo.
Para obtener una solución más mantenible, puede usar el complemento DSL de trabajo para configurar un trabajo semilla que tenga la plantilla para la compilación, luego hacer un bucle sobre cada esclavo y crear un nuevo trabajo con la etiqueta de compilación configurada con el nombre del esclavo.
La forma mejor y más fácil de lograr esto es utilizando el complemento Elastic Axis .
1. Instale el pulgin.
2. Cree un trabajo de configuración múltiple. (Instalar si no está presente)
3. En la configuración del trabajo puede encontrar nuevos ejes agregados como ejes elásticos. Agregue la etiqueta como se muestra a continuación para que el trabajo se ejecute en varios esclavos.
Lo tengo - ¡No necesitas ningún plugin especial!
He creado un trabajo para padres que activa / llama a otra compilación, y cuando lo llamo, le paso la etiqueta en la que no quiero que se ejecute el trabajo secundario.
Básicamente, el trabajo principal solo activa el trabajo que necesito, y el trabajo secundario se ejecutará tantas veces como el número de esclavos en esa etiqueta (en mi caso, 4 veces).
Tomando algunas de las respuestas anteriores y ajustándolas para la serie 2.0.
Ahora puede iniciar todo un trabajo en todos los nodos.
// The script triggers PayloadJob on every node.
// It uses Node and Label Parameter plugin to pass the job name to the payload job.
// The code will require approval of several Jenkins classes in the Script Security mode
def branches = [:]
def names = nodeNames()
for (int i=0; i<names.size(); ++i) {
def nodeName = names[i];
// Into each branch we put the pipeline code we want to execute
branches["node_" + nodeName] = {
node(nodeName) {
echo "Triggering on " + nodeName
build job: ''PayloadJob'', parameters: [
new org.jvnet.jenkins.plugins.nodelabelparameter.NodeParameterValue
("TARGET_NODE", "description", nodeName)
]
}
}
}
// Now we trigger all branches
parallel branches
// This method collects a list of Node names from the current Jenkins instance
@NonCPS
def nodeNames() {
return jenkins.model.Jenkins.instance.nodes.collect { node -> node.name }
}
Tomado del código https://jenkins.io/doc/pipeline/examples/#trigger-job-on-all-nodes
- Rundeck puede ser una herramienta que se adapte mejor a sus necesidades. Se puede configurar para ejecutar varios trabajos en paralelo y tiene un complemento para Jenkins: http://rundeck.org/
- Rundeck está diseñado para integrarse con sistemas más grandes. Generamos el archivo de recursos de nuestra base de datos de gestión de configuración. Muy fácil de hacer, consulte la documentación: http://rundeck.org/docs/administration/node-resource-sources.html .
- Además, hay complementos disponibles para Amazon y / o sistemas como Puppet y chef: http://rundeck.org/plugins