web-dev-qa-db-fra.com

Utilisation de FilePath pour accéder à l'espace de travail sur l'esclave dans le pipeline Jenkins

J'ai besoin de vérifier l'existence d'un certain fichier .exe dans mon espace de travail dans le cadre de mon travail de génération de pipeline. J'ai essayé d'utiliser le script Groovy ci-dessous de mon fichier Jenkins pour faire de même. Mais je pense que la classe File essaie par défaut de rechercher le répertoire de l'espace de travail sur jenkins master et échoue.

@com.cloudbees.groovy.cps.NonCPS
def checkJacoco(isJacocoEnabled) {

    new File(pwd()).eachFileRecurse(FILES) { it ->
    if (it.name == 'jacoco.exec' || it.name == 'Jacoco.exec') 
        isJacocoEnabled = true
    }
}

Comment accéder au système de fichiers sur l'esclave en utilisant Groovy depuis l'intérieur du fichier Jenkins?

J'ai également essayé le code ci-dessous. Mais je reçois No such property: build for class: groovy.lang.Binding Erreur. J'ai également essayé d'utiliser l'objet gestionnaire à la place. Mais obtenez la même erreur.

@com.cloudbees.groovy.cps.NonCPS
def checkJacoco(isJacocoEnabled) {

    channel = build.workspace.channel 
    rootDirRemote = new FilePath(channel, pwd()) 
    println "rootDirRemote::$rootDirRemote" 
    rootDirRemote.eachFileRecurse(FILES) { it -> 
        if (it.name == 'jacoco.exec' || it.name == 'Jacoco.exec') { 
            println "Jacoco Exists:: ${it.path}" 
            isJacocoEnabled = true 
    } 
}
10
HarshaB

Eu le même problème, a trouvé cette solution:

import hudson.FilePath;
import jenkins.model.Jenkins;

node("aSlave") {
    writeFile file: 'a.txt', text: 'Hello World!';
    listFiles(createFilePath(pwd()));
}

def createFilePath(path) {
    if (env['NODE_NAME'] == null) {
        error "envvar NODE_NAME is not set, probably not inside an node {} or running an older version of Jenkins!";
    } else if (env['NODE_NAME'].equals("master")) {
        return new FilePath(path);
    } else {
        return new FilePath(Jenkins.getInstance().getComputer(env['NODE_NAME']).getChannel(), path);
    }
}
@NonCPS
def listFiles(rootPath) {
    print "Files in ${rootPath}:";
    for (subPath in rootPath.list()) {
        echo "  ${subPath.getName()}";
    }
}

L'important ici est que createFilePath() n'est pas annoté avec @NonCPS Car il a besoin d'accéder à la variable env. L'utilisation de @NonCPS Supprime l'accès à la "qualité du pipeline", mais d'un autre côté, il ne nécessite pas que toutes les variables locales soient sérialisables. Vous devriez alors pouvoir rechercher le fichier dans la méthode listFiles().

21
Jon S