2016-12-20 12 views
5

Muszę sprawdzić, czy istnieje określony plik .exe w moim obszarze roboczym jako część mojego zadania budowania potoku. Próbowałem użyć poniższego skryptu Groovy z mojego Jenkinsfile, aby zrobić to samo. Ale myślę, że klasa File domyślnie próbuje znaleźć katalog obszaru roboczego na mistrzu jenkins i nie powiedzie się.Używanie FilePath do uzyskiwania dostępu do obszaru roboczego na slave w potoku Jenkinsa

@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 
    } 
} 

Jak uzyskać dostęp do systemu plików na urządzeniu slave za pomocą Groovy z wnętrza Jenkinsfile?

Próbowałem również poniższy kod. Ale dostaję błąd No such property: build for class: groovy.lang.Binding. Próbowałem też użyć obiektu menedżera. Ale dostaję ten sam błąd.

@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 
    } 
} 

Odpowiedz

10

miał ten sam problem, znalazł rozwiązanie:

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()}"; 
    } 
} 

Ważną rzeczą jest to, że createFilePath() ins't opatrzone @NonCPS ponieważ potrzebuje dostępu do zmiennej env. Użycie @NonCPS usuwa dostęp do "Dobroci Pipeline", ale z drugiej strony nie wymaga, aby wszystkie zmienne lokalne można było szeregować. Powinieneś być w stanie wyszukać plik wewnątrz metody listFiles().

+2

Uratowałem mi życie :) Dzięki! –