tareas - Ejecución de etapas en paralelo con el flujo de trabajo/canalización de Jenkins
nodos jenkins (5)
Tenga en cuenta: la pregunta se basa en el formato de canal antiguo, ahora llamado "con guiones". Cuando se utilizan "tuberías declarativas", se pueden anidar bloques paralelos dentro de bloques de etapas (ver Etapas paralelas con Canalización declarativa 1.2 ).
Me pregunto cómo se supone que los pasos paralelos funcionan con el plugin de flujo de trabajo / canalización de Jenkins, esp. cómo mezclarlos con etapas de construcción. Sé sobre el patrón general:
parallel(firstTask: {
// Do some stuff
}, secondTask: {
// Do some other stuff in parallel
})
Sin embargo, me gustaría ejecutar dos etapas en paralelo (en el mismo nodo, que tiene múltiples ejecutores), así que traté de agregar etapas como esta:
stage ''A''
// Do some preparation stuff
parallel(firstTask: {
stage ''B1''
// Do some stuff
}, secondTask: {
stage ''B2''
// Do some other stuff in parallel
})
stage ''C''
// Finalizing stuff
Esto no funciona como se esperaba Las tareas de "hacer cosas" se ejecutan en paralelo, pero las etapas paralelas finalizan inmediatamente y no incorporan las cosas que deberían contener. Como consecuencia, Stage View no muestra el resultado correcto y tampoco vincula los registros.
¿Puedo construir diferentes etapas en paralelo o el paso "paralelo" solo se debe usar en una sola etapa?
Acabo de probar la siguiente canalización y funciona
parallel firstBranch: {
stage (''Starting Test'')
{
build job: ''test1'', parameters: [string(name: ''Environment'', value: "$env.Environment")]
}
}, secondBranch: {
stage (''Starting Test2'')
{
build job: ''test2'', parameters: [string(name: ''Environment'', value: "$env.Environment")]
}
}
Este trabajo llamado ''trigger-test'' acepta un parámetro llamado ''Environment''
Job ''test1'' y ''test2'' son trabajos simples:
Ejemplo para ''test1''
- Un parámetro llamado ''Ambiente''
- Pipeline: echo "$ env.Environment-TEST1"
En la ejecución, puedo ver las dos etapas ejecutándose al mismo tiempo
Como mencionó @Quartz, puedes hacer algo como
stage(''Tests'') {
parallel(
''Unit Tests'': {
container(''node'') {
sh("npm test --cat=unit")
}
},
''API Tests'': {
container(''node'') {
sh("npm test --cat=acceptance")
}
}
)
}
Creo que esto se ha implementado oficialmente ahora: https://jenkins.io/blog/2017/09/25/declarative-1/
No puede colocar la stage
obsoleta sin ámbito de bloque (como en la pregunta original) dentro de parallel
.
A partir de JENKINS-26107 , stage
toma un argumento de bloque. Puede colocar parallel
dentro del stage
o stage
dentro del stage
parallel
o en el stage
dentro del stage
etc. Sin embargo, no se garantiza que las visualizaciones de la compilación respalden todas las anidaciones; en particular
- Los pasos integrados de Pipeline (una "tabla de árbol" que enumera cada paso ejecutado por la compilación) muestran la anidación arbitraria de
stage
. - El complemento Pipeline Stage View solo mostrará una lista lineal de etapas, en el orden en que comenzaron, independientemente de la estructura de anidación.
- Blue Ocean mostrará etapas de primer nivel, más ramas
parallel
dentro de un nivel superior, pero actualmente no más.
JENKINS-27394 , si se implementa, mostraría stage
anidadas arbitrariamente.
esa sintaxis ahora está en desuso, obtendrá este error:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 14: Expected a stage @ line 14, column 9.
parallel firstTask: {
^
WorkflowScript: 14: Stage does not have a name @ line 14, column 9.
parallel secondTask: {
^
2 errors
Deberías hacer algo como:
stage("Parallel") {
steps {
parallel (
"firstTask" : {
//do some stuff
},
"secondTask" : {
// Do some other stuff in parallel
}
)
}
}
Solo para agregar el uso del nodo aquí, para distribuir trabajos entre varios servidores / máquinas virtuales de compilación:
pipeline {
stages {
stage("Work 1"){
steps{
parallel ( "Build common Library":
{
node(''<Label>''){
/// your stuff
}
},
"Build Utilities" : {
node(''<Label>''){
/// your stuff
}
}
)
}
}
Todas las máquinas virtuales deben etiquetarse para usar como grupo.