Come costruire una complessa pipeline parallela Jenkins?


17

Sono stato interessato a convertire le nostre integrazioni Jenkins su misura in una pipeline. Tuttavia, non riesco a capire come farlo.

Qualcuno può aiutarmi con la sceneggiatura di Jenkins che potrebbe fare quanto segue?

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

È possibile? O dovrei semplicemente aderire dopo 3, 4, 5? Come questo:

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

1
Voterei per la seconda opzione, sembra meno probabile che si rompa e più facile da estendere in caso di necessità.
Tensibai,

2
probabilmente essere denso, ma non ho ancora capito cosa aggiunge la versione più complessa. puoi documentare cosa fa "9" e da cosa dipende? non ce ne sono 8, nel caso in cui si desidera rivedere e aggiungerlo. :)
burnettk,

1
@BertGoethals Puoi usare Pipeline e avere ancora diversi lavori. È possibile che mi manchi qualcosa qui.
avi

1
Stavo cercando di fare qualcosa di simile qualche giorno fa. Potrei farlo funzionare con i parallelcomandi nidificati , ma il flusso non sembrava corretto in BlueOcean.
tosaerba

1
@BertGoethals Non riesci ad avviare un'altra pipeline facendo 5 e poi 6 e 7 dalla tua pipeline principale?
Tensibai,

Risposte:



4

Ho avuto una situazione simile in cui volevo nidificare altri thread di lavori paralleli all'interno di un altro parallelo. Questo codice ha funzionato per me:

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
                }
            }
        }
    }
}

Per beneficiare appieno della corsa parallela, ricorda di assegnare abbastanza esecutori.


Questo snippet funziona senza assegnare valori alle variabili nodese apps?
Jellenberger,

@jellenberger non funzionerà se questi parametri saranno vuoti (stringa nulla / vuota). Ma va bene passare singoli elementi (singola app o nodo) senza virgole.
biniosuaf,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.