使用FilePath访问Jenkins管道中的slave上的工作区

时间:2016-12-20 20:15:47

标签: jenkins groovy jenkins-pipeline

我需要检查我的工作区中是否存在某个.exe文件,作为我的管道构建作业的一部分。我尝试使用我的Jenkinsfile中的下面的Groovy脚本来做同样的事情。但我认为File类默认尝试在jenkins master上查找workspace目录并失败。

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

如何使用Jenkins文件中的Groovy访问slave上的文件系统?

我也试过下面的代码。但我收到No such property: build for class: groovy.lang.Binding错误。我也尝试使用manager对象。但是得到同样的错误。

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

1 个答案:

答案 0 :(得分:15)

遇到同样的问题,找到了这个解决方案:

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

这里重要的是createFilePath()没有注明@NonCPS,因为它需要访问env变量。使用@NonCPS删除对“Pipeline goodness”的访问权限,但另一方面,它不要求所有局部变量都是可序列化的。 然后,您应该能够在listFiles()方法中搜索文件。