ocean - jenkins pipeline example
Configuración de matriz con tuberÃas de Jenkins (4)
El plugin de Jenkins Pipeline (también conocido como Flujo de trabajo) se puede ampliar con otros complementos de Multibranch
para crear sucursales y extraer solicitudes automáticamente.
¿Cuál sería la forma preferida de ejecutar configuraciones múltiples? Por ejemplo, construir con Java 7 y Java 8. Esto a menudo se denomina configuración matricial (debido a las múltiples combinaciones como la versión del idioma, la versión del marco, ...) o las variantes de compilación.
Lo intenté:
- ejecutándolos en serie como pasos de
stage
separados. Bien, pero toma más tiempo de lo necesario. - ejecutándolos dentro de un paso
parallel
, con o sinnode
s asignados dentro de ellos. Funciona, pero no puedo usar el paso delstage
dentro del paralelo para las limitaciones conocidas sobre cómo se visualizaría.
¿Hay una manera recomendada de hacer esto?
TLDR: Jenkins.io quiere que uses nodos para cada compilación.
Jenkins.io: en contextos de codificación de canalización, un "nodo" es un paso que hace dos cosas, por lo general al solicitar ayuda de los ejecutores disponibles en los agentes:
Programa los pasos que contiene para ejecutar agregándolos a la cola de compilación de Jenkins (de modo que tan pronto como un tramo de ejecutor esté libre en un nodo, se ejecuten los pasos apropiados)
Es una buena práctica hacer todo el trabajo material, como crear o ejecutar scripts dentro de los nodos, porque los bloques de nodos en una etapa le dicen a Jenkins que los pasos dentro de ellos son lo suficientemente intensivos para programarse, solicite ayuda del grupo de agentes y bloquear un espacio de trabajo solo mientras lo necesiten.
Los bloques de nodos de Vanilla Jenkins dentro de un escenario se verían así:
stage ''build'' {
node(''java7-build''){ ... }
node(''java8-build''){ ... }
}
Ampliando aún más esta noción, Cloudbees escribe sobre paralelismo y compilaciones distribuidas con Jenkins . El flujo de trabajo de Cloudbees para ti podría verse así:
stage ''build'' {
parallel ''java7-build'':{
node(''mvn-java7''){ ... }
}, ''java8-build'':{
node(''mvn-java8''){ ... }
}
}
Sus requisitos para visualizar las diferentes construcciones en la tubería podrían satisfacerse con cualquiera de los flujos de trabajo, pero confío en la documentación de Jenkins para la mejor práctica.
EDITAR
Para abordar la visualización que a le gustaría ver, ¡tiene razón, no funciona! El problema se ha planteado con Jenkins y está documentado aquí , la resolución de involucrar el uso de ''bloques etiquetados'' todavía está en progreso :-(
P: ¿Existe documentación que permita a los usuarios del pipeline no poner etapas dentro de pasos paralelos?
A: No, y esto se considera un uso incorrecto si está hecho; las etapas solo son válidas como construcciones de nivel superior en la tubería, por lo que la noción de bloques etiquetados como una construcción separada se ha convertido en ... Y con eso, me refiero a eliminar etapas de pasos paralelos dentro de mi pipeline.
Si intentas usar una etapa en un trabajo paralelo, vas a tener un mal momento.
ERROR: The ‘stage’ step must not be used inside a ‘parallel’ block.
Como señaló @StephenKing, Blue Ocean mostrará ramas paralelas mejor que la vista de escenario actual. Una próxima versión planificada de la vista de escenario podrá mostrar todas las ramas, aunque no indicará visualmente ninguna estructura de anidamiento (se vería igual que si ejecutara las configuraciones en serie).
En cualquier caso, el problema más grave es que básicamente obtendrá un estado de aprobado / reprobado para la compilación en general, en espera de una resolución de JENKINS-27395 y solicitudes relacionadas.
Para probar cada commit en varias plataformas, he usado este esqueleto básico de Jenkinsfile:
def test_platform(label, with_stages = false)
{
node(label)
{
// Checkout
if (with_stages) stage label + '' Checkout''
...
// Build
if (with_stages) stage label + '' Build''
...
// Tests
if (with_stages) stage label + '' Tests''
...
}
}
/*
parallel ( failFast: false,
Windows: { test_platform("Windows") },
Linux: { test_platform("Linux") },
Mac: { test_platform("Mac") },
)
*/
test_platform("Windows", true)
test_platform("Mac", true)
test_platform("Linux", true)
Con esto, es relativamente fácil pasar de una ejecución secuencial a una paralela, cada una de ellas teniendo sus pros y sus contras:
- La ejecución paralela se ejecuta mucho más rápido, pero no contiene las etapas de etiquetado
- La ejecución secuencial es mucho más lenta, pero se obtiene un informe detallado gracias a las etapas, etiquetadas como "Windows Checkout", "Windows Build", "Pruebas de Windows", "Mac Checkout", etc.
Estoy usando la ejecución secuencial por el momento, hasta que encuentre una mejor solución.
Parece que hay alivio al menos con la interfaz de usuario de BlueOcean . Esto es lo que obtuve (los nodos tk-*
son los pasos paralelos):