Как определить и использовать функцию внутри конфигурации Jenkins Pipeline?

Я пытаюсь создать задачу с функцией внутри:

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

Но это дает мне исключение:

java.lang.NoSuchMethodError: Не найден такой метод DSL 'BuildAndCopyMibsHere' среди шагов *

Есть ли способ использовать встроенные функции в сценарии конвейера?

Ответ 1

Во-первых, вы не должны добавлять $, когда находитесь за пределами строк ($class в вашей первой функции является исключением), поэтому должно быть:

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', null)
    }
}

... или вам нужно добавить значение по умолчанию ко второму аргументу функции:

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

Ответ 2

Решено! Сбой вызова build job: project, parameters: params с ошибкой java.lang.UnsupportedOperationException: must specify $class with an implementation of interface java.util.List при params = [:]. Замена на params = null решила проблему. Вот рабочий код ниже.

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