列出Jenkins管道上工作区中的文件
我试图在Jenkins管道中列出工作区中的文件,以便我可以使用它来生成适当的并行任务 虽然我可以简单地使用列出Jenkins管道上工作区中的文件,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我试图在Jenkins管道中列出工作区中的文件,以便我可以使用它来生成适当的并行任务 虽然我可以简单地使用shls>文件并阅读它,但我想要文件对象,我可以用更复杂的逻辑进一步过滤它们。事实上,Files.listFiles(FileFilter)将是理想的选择 但是,我根本无法获取文件列表。首先,我不得不求助于一些奇怪的东西来简单地找出构建的当前工作目录: sh 'pwd > workspace' workspace = readFile('workspace').trim() 现在我调
shls>文件
并阅读它,但我想要文件
对象,我可以用更复杂的逻辑进一步过滤它们。事实上,Files.listFiles(FileFilter)
将是理想的选择
但是,我根本无法获取文件列表。首先,我不得不求助于一些奇怪的东西来简单地找出构建的当前工作目录:
sh 'pwd > workspace'
workspace = readFile('workspace').trim()
现在我调用它来检索文件列表:
@NonCPS
def getFiles(String baseDir) {
Arrays.asList(new File(baseDir).listFiles())
}
并在asList
上获得一个NPE,这意味着,通过我对javadoc的阅读,新文件(baseDir)不存在(或者不是目录)
我之所以将其标记为@NonCPS
,是因为它是管道上groovy闭包所必需的,对于pwd,我更愿意使用它,而不是使用完整的java,您可以使用步骤
对于主工作区目录中的文件列表,您可以使用:
如果在master上运行脚本,可以尝试使用pwd()执行以下操作
sh "ls -la ${pwd()}"
下面是我如何在项目中查找json文件以进行处理的示例
sh "ls *.json > listJsonFiles"
def files = readFile( "listJsonFiles" ).split( "\\r?\\n" );
sh "rm -f listJsonFiles"
- 使用ls查找文件并将其写入另一个临时文件
- 读取临时文件并在新行上拆分以生成数组
- 删除临时文件
- 这对我来说很有效
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);
}
}
节点(“aSlave”){
def files=getAllFiles(createFilePath(“${workspace}/path_到_目录_在_工作区”))
}
@非现金
def getAllFiles(根路径){
def列表=[]
for(rootPath.list()中的子路径){
列出一种在所有情况下都能使用而不使用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}<<<"
}
def FILES\u LIST=sh(脚本:“ls'${workers\u dir}',returnStdout:true)
//调试
回显“文件列表:${FILES\u LIST}”
//解析
对于(字符串ele:FILES\u LIST.split(\\r?\\n)){
println“>>>${ele}这是对我来说最简单、最简单的groovy解决方案
def fileList = "ls /path/to/dir".execute()
def files= []
fileList.text.eachLine {files.add(it)}
return files
还有pwd()
pipeline funct获取当前目录。pwd
在从属服务器上不起作用。它返回主服务器上的工作区。那么findFiles呢?findFiles
不返回File
。它返回一个FileWrapper
,这是一个非常有限的文件。如果它没有像pwd
这样的路径问题,它可能会很有用您正在尝试查找在前一阶段生成的文件。我只想指出,我成功地使用了并行构建(在我的示例中,是从管道执行的测试作业)在连接中隐藏/unstash。我无法理解我刚才创建的文件为什么会在下一阶段中丢失,我想从中获取它们的内容。也许您遇到了类似的情况?文件[0]。name
只提供了没有路径的文件名。如果您想要文件的路径,则必须转换:文件[0]。toString()
(因此您可以使用readFile(文件[0].toString())获取文件内容
)Jenkins不必允许创建文件实例。因此,这可能会失败。但是,如果您遵循错误日志中的链接,您可以批准它。我可以想象,人们会想要一个操作系统可移植解决方案。此外,这不处理带有空格的文件或路径,而不是sh脚本:“ls*.json,returnStdout:true
?我怀疑,如果您使用生成代理运行,这将显示主服务器上的文件。
def fileList = "ls /path/to/dir".execute()
def files= []
fileList.text.eachLine {files.add(it)}
return files