web-dev-qa-db-fra.com

Comment définir et utiliser une fonction dans la configuration du pipeline Jenkins?

J'essaie de créer une tâche avec une fonction à l'intérieur:

def doCopyMibArtefactsHere(projectName) {
    step ([
        $class: 'CopyArtifact',
        projectName: $projectName,
        filter: '**/**.mib',
        fingerprintArtifacts: true, 
        flatten: true
    ]);
}

def BuildAndCopyMibsHere(projectName, params) {
    build job: $project, parameters: $params
    doCopyMibArtefactsHere($projectName)
}


node { 
    stage('Prepare Mib'){
        BuildAndCopyMibsHere('project1')
    }
}

Mais cela me donne une exception: Java.lang.NoSuchMethodError: Aucune méthode DSL de ce type 'BuildAndCopyMibsHere' trouvée parmi les étapes

Est-il possible d'utiliser des fonctions intégrées dans le script Pipline?

29
Dr.eel

Tout d'abord, vous ne devriez pas ajouter $ lorsque vous êtes en dehors des chaînes ($class dans votre première fonction étant une exception), il devrait donc être:

def doCopyMibArtefactsHere(projectName) {
    step ([
        $class: 'CopyArtifact',
        projectName: projectName,
        filter: '**/**.mib',
        fingerprintArtifacts: true, 
        flatten: true
    ]);
}

def BuildAndCopyMibsHere(projectName, params) {
    build job: project, parameters: params
    doCopyMibArtefactsHere(projectName)
}
...

Maintenant, quant à votre problème; la deuxième fonction prend deux arguments alors que vous ne fournissez qu'un seul argument lors de l'appel. Soit vous devez fournir deux arguments lors de l'appel:

...
node { 
    stage('Prepare Mib'){
        BuildAndCopyMibsHere('project1', null)
    }
}

... ou vous devez ajouter une valeur par défaut au second argument des fonctions:

def BuildAndCopyMibsHere(projectName, params = null) {
    build job: project, parameters: params
    doCopyMibArtefactsHere($projectName)
}
27
Jon S

Résolu! L'appel build job: project, parameters: params échoue avec une erreur Java.lang.UnsupportedOperationException: must specify $class with an implementation of interface Java.util.List quand params = [:]. Le remplacer par params = null résolu le problème. Voici le code de travail ci-dessous.

def doCopyMibArtefactsHere(projectName) {
    step ([
        $class: 'CopyArtifact',
        projectName: projectName,
        filter: '**/**.mib',
        fingerprintArtifacts: true, 
        flatten: true
    ]);
}

def BuildAndCopyMibsHere(projectName, params = null) {
    build job: project, parameters: params
    doCopyMibArtefactsHere(projectName)
}
node { 
    stage('Prepare Mib'){
        BuildAndCopyMibsHere('project1')
    }
}
2
Dr.eel