Wie baue ich eine komplexe parallele Jenkins-Pipeline?

17

Ich war daran interessiert, unsere maßgeschneiderten Jenkins-Integrationen in eine Pipeline umzuwandeln. Allerdings kann ich nicht herausfinden, wie es geht.

Kann mir jemand mit dem Jenkins-Skript helfen, das Folgendes kann?

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

Ist das überhaupt möglich? Oder soll ich einfach nach 3, 4, 5 mitmachen? So was:

1---2---3-------6-------9---10
    |       |   |   |
    |---4---|   7---|
    |       |
    |---5---|
Bert Goethals
quelle
1
Ich würde für die zweite Option stimmen, klingt weniger bruchanfällig und lässt sich im Bedarfsfall leichter erweitern.
Tensibai
2
möglicherweise dicht, aber ich habe nicht verstanden, was die komplexere Version noch hinzufügt. Kannst du dokumentieren, was "9" macht und wovon es abhängt? Es gibt keine 8, falls Sie diese überarbeiten und hinzufügen möchten. :)
Burnettk
1
@BertGoethals Sie können Pipeline verwenden und haben immer noch verschiedene Jobs. Es ist möglich, dass mir hier etwas fehlt.
Avi
1
Ich habe vor ein paar Tagen versucht, etwas Ähnliches zu tun. Ich könnte es mit verschachtelten parallelBefehlen zum Laufen bringen, aber der Fluss sah in BlueOcean nicht richtig aus.
Rasenmäherlatte
1
@BertGoethals Kannst du nicht eine andere Pipeline starten, die 5 und dann 6 und 7 von deiner Hauptpipeline aus macht?
Tensibai

Antworten:

9

Basierend auf den Kommentaren zu meiner Frage und einigen grundlegenden Tests scheint Folgendes zu funktionieren:

Bert Goethals
quelle
4

Ich hatte eine ähnliche Situation, in der ich andere parallele Job-Threads in einem anderen parallelen verschachteln wollte. Dieser Code hat bei mir funktioniert:

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

Denken Sie daran, genügend Executoren zuzuweisen, um die Vorteile des parallelen Laufs voll auszuschöpfen.

biniosuaf
quelle
Funktioniert dieses Snippet, ohne den Variablen nodesund Werte appszuzuweisen?
Jellenberger
@jellenberger es wird nicht funktionieren, wenn diese vars leer sind (null / leere Zeichenfolge). Es ist jedoch in Ordnung, einzelne Elemente (einzelne App oder Knoten) ohne Kommas zu übergeben.
Biniosuaf