我需要检查我的工作区中是否存在某个.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
}
}
答案 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()
方法中搜索文件。