Comment construire un pipeline Jenkins parallèle complexe?

17

Je souhaitais convertir nos intégrations Jenkins sur mesure en pipeline. Cependant, je n'arrive pas à comprendre comment le faire.

Quelqu'un peut-il m'aider avec le script Jenkins qui pourrait faire ce qui suit?

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

Est-ce seulement possible? Ou devrais-je simplement rejoindre après 3, 4, 5? Comme ça:

1---2---3-------6-------9---10
    |       |   |   |
    |---4---|   7---|
    |       |
    |---5---|
Bert Goethals
la source
1
Je voterais pour la deuxième option, les sons moins susceptibles de se casser et plus faciles à étendre si le besoin s'en fait sentir.
Tensibai
2
peut-être dense, mais je n'ai pas encore compris ce que la version plus complexe ajoute encore. pouvez-vous documenter ce que fait le «9» et ce dont il dépend? il n'y a pas de 8, au cas où vous voudriez réviser et ajouter cela. :)
burnettk
1
@BertGoethals Vous pouvez utiliser Pipeline tout en ayant des tâches différentes. Il est possible que je manque quelque chose ici.
avi
1
J'essayais de faire quelque chose de similaire il y a quelques jours. Je pouvais le faire fonctionner avec des parallelcommandes imbriquées , mais le flux ne semblait pas correct dans BlueOcean.
tondeuse à gazon
1
@BertGoethals Ne pouvez-vous pas démarrer un autre pipeline en faisant 5 puis 6 et 7 à partir de votre pipeline principal?
Tensibai

Réponses:

9

Sur la base des commentaires de ma question et de certains tests de base, les éléments suivants semblent fonctionner:

Bert Goethals
la source
4

J'ai eu une situation similaire dans laquelle je voulais imbriquer d'autres threads de travaux parallèles dans un autre parallèle. Ce code a fonctionné pour moi:

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

Pour profiter pleinement de l'exécution parallèle, n'oubliez pas d'affecter suffisamment d'exécuteurs.

biniosuaf
la source
Cet extrait fonctionne-t-il sans affecter de valeurs aux variables nodeset apps?
jellenberger
@jellenberger cela ne fonctionnera pas si ces vars seront vides (chaîne vide / vide). Mais c'est bien de passer des éléments uniques (application unique ou nœud) sans virgule.
biniosuaf