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

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:



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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.