91 votes

Comment invoquer un pipeline A de Jenkins dans un autre pipeline B de Jenkins ?

J'ai deux pipelines Jenkins, disons pipeline-A et pipeline-B. Je veux invoquer le pipeline-A dans le pipeline-B. Comment puis-je le faire ?

(pipeline-A est un sous-ensemble de pipeline-B. Le pipeline-A est responsable de l'exécution de certaines tâches de routine qui peuvent être réutilisées dans le pipeline-B).

J'ai installé Jenkins 2.41 sur ma machine.

1 votes

Avez-vous essayé de le déclencher comme un travail normal : node { def job = build job : 'some-pipeline' }

80voto

Yash Points 574

La solution suivante fonctionne pour moi :

pipeline {
    agent
    {
        node {
                label 'master'
                customWorkspace "${env.JobPath}"
              }
    }

    stages 
    {
        stage('Start') {
            steps {
                sh 'ls'
            }
        }

        stage ('Invoke_pipeline') {
            steps {
                build job: 'pipeline1', parameters: [
                string(name: 'param1', value: "value1")
                ]
            }
        }

        stage('End') {
            steps {
                sh 'ls'
            }
        }
    }
}

Ajout du lien de la documentation officielle de "Pipeline : Build Step" ici : https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

3 votes

Comment cela fonctionne-t-il pour vous ? Est-ce que "pipeline1" est en fait un "pipeline{}" ? Je reçois cette erreur : "Waiting for non-job items is not supported". Je pense que cela ne concerne que les tâches et non les pipelines complets.

0 votes

Pipeline1 est en fait un autre nom de pipeline que vous devez invoquer ici.

5 votes

@red888 Si vous obtenez l'erreur ERROR: Waiting for non-job items is not supported vous devrez peut-être préciser la branche : build job: 'pipeline1/master', parameters: [

76voto

Matias Snellingen Points 378

Un peu flou si vous voulez invoquer un autre pipeline script ou job, donc je réponds les deux :

Pipeline script L'étape "load" exécutera l'autre pipeline script. Si vous avez les deux scripts dans le même répertoire, vous pouvez le charger comme ceci :

def pipelineA = load "pipeline_A.groovy"
pipelineA.someMethod()

Autre script (pipeline_a.groovy) :

def someMethod() {
    //do something
}

return this

Emploi dans les pipelines

S'il s'agit d'exécuter un autre travail de pipeline, l'étape "build job" peut le faire :

build job: '<Project name>', propagate: true, wait: true

propager : Propager les erreurs

wait : Attendre l'achèvement

Si vous avez des paramètres sur le travail, vous pouvez les ajouter comme ceci :

build job: '<Project name>', parameters: [[$class: 'StringParameterValue', name: 'param1', value: 'test_param']]

0 votes

Je veux juste savoir comment obtenir le statut du pipeline enfant dans le pipeline parent. Je veux poursuivre le pipeline parent en fonction du résultat du pipeline enfant.

0 votes

Existe-t-il un moyen de transmettre les "paramètres de construction actuels" d'un travail à l'autre ? comme dans le "vieux jenkins".

0 votes

J'ai utilisé le premier exemple de 'pipeline job', avec propagate et wait, mais Jenkins me donne cette erreur : ERROR : Waiting for non-job items is not supported. Une idée de ce que j'ai fait de mal ?

4voto

Michael COLL Points 745

Comme mentionné par @Matias Snellingen et @Céline Aussourd, dans le cas du lancement d'un job multibranche, vous devez spécifier la branche à construire comme ceci :

stage ('Invoke_pipeline') {
    steps {
        build job: 'pipeline1/master', parameters: [
        string(name: 'param1', value: "value1")
        ]
    }
}

Dans mon cas, cela a résolu le problème.

0 votes

Bonjour, comment puis-je accéder à ce paramètre dans l'autre pipeline ?

0 votes

@awiechert Oui, vous pouvez.

1voto

papigee Points 824

Pour ajouter à ce que @matias-snellingen a dit. Si vous avez plusieurs fonctions, le return this doit être sous la fonction qui sera appelée dans le pipeline principal script. Par exemple dans :

def someMethod() {
   helperMethod1() 
   helperMethod2()
} 
return this 

def helperMethod1(){ 
   //do stuff
} 

def helperMethod2(){
  //do stuff
}

Le site someMethod() est celui qui sera appelé dans le pipeline principal script.

0voto

IsaacE Points 114

Une autre option consiste à créer un paquet, à le charger et à l'exécuter à partir du paquet.

package name.of.package
import groovy.json.*

def myFunc(var1) {
return result
}

Puis le consommer

@Library('name_of_repo')
import name.of.package.* 
utils = new name_of_pipeline()
// here you can invoke
utils.myFunc(var)

J'espère que cela vous aidera

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X