¿Cómo construir una compleja tubería paralela de Jenkins?

17

He estado interesado en convertir nuestras integraciones Jenkins a medida en una tubería. Sin embargo, parece que no puedo entender cómo hacerlo.

¿Alguien puede ayudarme con el script Jenkins que podría hacer lo siguiente?

1---2---3-----------9---10
    |           |
    |---4-------|
    |           |
    |---5---6---|
        |       |
        |---7---|

1: Start pipeline
10: End pipeline
5: Build some files
   * needed by 6, 7,
   * needed as artifacts at the end
2, 3, 4, 6, 7: Have jUnit result files, should be available at end of
   test (somewhere), even if one failed

¿Es esto posible? ¿O debería unirme después de 3, 4, 5? Me gusta esto:

1---2---3-------6-------9---10
    |       |   |   |
    |---4---|   7---|
    |       |
    |---5---|
Bert Goethals
fuente
1
Yo votaría por la segunda opción, parece menos probable que se rompa y más fácil de ampliar si surge la necesidad.
Tensibai
2
posiblemente sea denso, pero aún no he entendido lo que agrega la versión más compleja. ¿Puedes documentar qué hace "9" y de qué depende? no hay 8, en caso de que desee revisar y agregar eso. :)
burnettk
1
@BertGoethals Puede usar Pipeline y seguir teniendo diferentes trabajos. Es posible que me falte algo aquí.
avi
1
Intenté hacer algo similar hace unos días. Podría hacer que funcione con parallelcomandos anidados , pero el flujo no se veía bien en BlueOcean.
cortacésped
1
@BertGoethals ¿No puede comenzar otra tubería haciendo 5 y luego 6 y 7 desde su tubería principal?
Tensibai

Respuestas:

9

Según los comentarios a mi pregunta, y algunas pruebas básicas, parece que lo siguiente funciona:

Bert Goethals
fuente
4

Tuve una situación similar en la que quería anidar otros hilos de trabajos paralelos dentro de otro paralelo. Este código funcionó para mí:

def performDeploymentStages(String node, String app) {
    stage("build") {
        echo "Building the app [${app}] on node [${node}]"
    }
    stage("deploy") {
        echo "Deploying the app ${app}] on node [${node}]"
    }
    stage("test") {
        echo "Testing the app [${app}] on node [${node}]"
    }
}

pipeline {
    agent {
        label 'master'
    }
    parameters {
        string(name: 'NODES', defaultValue: '1,2,3', description: 'Nodes to build, deploy and test')
        choice(name: 'ENV', choices: 'qa', description: 'Environment')
        string(name: 'APPS', defaultValue: 'app01,app02', description: 'App names')
    }

    stages {
        stage('parallel stage') {
            steps {
                script {
                    def nodes = [:]
                    for (node in params.NODES.tokenize(',')) {
                        def apps = [:]
                        for (app in params.APPS.tokenize(',')) {
                            performDeploymentStages(node, app)
                        }
                        parallel apps
                    }
                    parallel nodes
                }
            }
        }
    }
}

Para aprovechar al máximo la ejecución paralela, recuerde asignar suficientes ejecutores.

biniosuaf
fuente
¿Funciona este fragmento sin asignar valores a las variables nodesy apps?
jellenberger
@jellenberger no funcionará si estos vars estarán vacíos (cadena nula / vacía). Pero está bien pasar elementos individuales (aplicación única o nodo) sin comas.
biniosuaf