web-dev-qa-db-ger.com

Wie definiere und verwende ich die Funktion in der Jenkins Pipeline-Konfiguration?

Ich versuche eine Aufgabe mit einer darin enthaltenen Funktion zu erstellen:

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

Aber das gibt mir eine Ausnahme: Java.lang.NoSuchMethodError: Keine solche DSL-Methode 'BuildAndCopyMibsHere' zwischen den Schritten gefunden

Gibt es eine Möglichkeit, eingebettete Funktionen in Pipline-Skripten zu verwenden?

29
Dr.eel

Zunächst sollten Sie nicht hinzufügen $ wenn Sie außerhalb von Zeichenketten sind ($class in Ihrer ersten Funktion ist eine Ausnahme), so sollte es sein:

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

Nun zu Ihrem Problem. Die zweite Funktion akzeptiert zwei Argumente, während Sie beim Aufruf nur ein Argument angeben. Entweder müssen Sie beim Aufruf zwei Argumente angeben:

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

... oder Sie müssen dem zweiten Argument der Funktionen einen Standardwert hinzufügen:

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

Gelöst! Der Anruf build job: project, parameters: params schlägt fehl mit einem Fehler Java.lang.UnsupportedOperationException: must specify $class with an implementation of interface Java.util.List wann params = [:]. Ersetzen durch params = null löste das Problem. Hier der Arbeitscode unten.

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