我正在尝试在Jenkins Pipeline中列出工作区中的文件,以便使用它来生成适当的并行任务。
虽然我可以简单地使用sh ls > files
并读取它,但我想要File
对象,我可以用更复杂的逻辑进一步过滤这些对象。事实上,Files.listFiles(FileFilter)
将是理想的。
但是,我根本无法获得文件列表。首先,我不得不求助于一些奇怪的东西来简单地找出构建的当前工作目录:
sh 'pwd > workspace'
workspace = readFile('workspace').trim()
现在我调用它来检索文件列表:
@NonCPS
def getFiles(String baseDir) {
Arrays.asList(new File(baseDir).listFiles())
}
在asList
上获得一个NPE,这意味着,根据我对javadoc的阅读,new File(baseDir)
不存在(或者不是一个目录)。
我将其标记为@NonCPS
,因为它是Pipeline上groovy闭包所必需的,比起完整的java<1.8语法。
对于pwd,可以使用pwd
步骤。
至于主工作区目录中的文件列表,您可以使用Pipeline Utility Steps插件中的findFiles
:
files = findFiles(glob: '*.*')
一个在所有情况下都能工作的解决方案,无需使用JENKINS函数
def FILES_LIST = sh (script: "ls '${workers_dir}'", returnStdout: true).trim()
//DEBUG
echo "FILES_LIST : ${FILES_LIST}"
//PARSING
for(String ele : FILES_LIST.split("\r?\n")){
println ">>>${ele}<<<"
}
以下是我如何在项目中查找json文件进行处理的示例。
sh "ls *.json > listJsonFiles"
def files = readFile( "listJsonFiles" ).split( "\r?\n" );
sh "rm -f listJsonFiles"
- 使用ls查找文件并将其写入另一个临时文件
- 读取临时文件,并在新行上拆分以生成数组
- 删除临时文件
如果您在master上运行脚本,您可以尝试以下使用pwd()的方法。
sh "ls -la ${pwd()}"
这是最简单的&简单的groovy解决方案,对我有效。
def fileList = "ls /path/to/dir".execute()
def files= []
fileList.text.eachLine {files.add(it)}
return files
这对我很管用!!
node("aSlave") {
def files = getAllFiles(createFilePath("${workspace}/path_to_directory_in_workspace"))
}
@NonCPS
def getAllFiles(rootPath) {
def list = []
for (subPath in rootPath.list()) {
list << subPath.getName()
// in case you don't want extension
// list << FilenameUtils.removeExtension(subPath.getName())
}
return list
}
// Helps if slave servers are in picture
def createFilePath(def path) {
if (env['NODE_NAME'].equals("master")) {
File localPath = new File(path)
return new hudson.FilePath(localPath);
} else {
return new hudson.FilePath(Jenkins.getInstance().getComputer(env['NODE_NAME']).getChannel(), path);
}
}