在Jenkins管道上列出工作区上的文件

Dan*_*ral 18 groovy jenkins jenkins-pipeline

我正在尝试在Jenkins管道中列出工作区中的文件,以便我可以使用它来生成适当的并行任务.

虽然我可以简单地使用sh ls > files和阅读它,但我想要的File对象可以用更复杂的逻辑进一步过滤.事实上,Files.listFiles(FileFilter)将是理想的.

但是,我根本无法获取文件列表.首先,我不得不求助于一些奇怪的东西来简单地找出构建的当前工作目录:

sh 'pwd > workspace'
workspace = readFile('workspace').trim()
Run Code Online (Sandbox Code Playgroud)

现在我调用它来检索文件列表:

@NonCPS
def getFiles(String baseDir) {
    Arrays.asList(new File(baseDir).listFiles())
}
Run Code Online (Sandbox Code Playgroud)

并获得一个NPE asList,这意味着,通过我读取的javadoc,它new File(baseDir)不存在(或者不是目录).

我正在标记它,@NonCPS因为它对于Pipeline上的groovy闭包是必需的,我更喜欢使用完整的java <1.8语法.

Krz*_*soń 24

对于pwd,您可以使用pwd步骤.

至于主工作区目录中的文件列表,您可以使用findFiles:

files = findFiles(glob: '*.*')
Run Code Online (Sandbox Code Playgroud)

  • `files [0] .name`只给你一个没有路径的文件名.如果你想要转换文件的路径:`files [0] .toString()`(所以你可以用`readFile(files [0] .toString())`来获取文件内容.) (3认同)
  • `findFiles`不返回`File`.它返回一个`FileWrapper`,这是相当有限的.如果没有像`pwd`这样的路径问题,它可能会有用. (2认同)

que*_*com 7

一种适用于所有情况的解决方案,无需使用 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}<<<"     
}
Run Code Online (Sandbox Code Playgroud)

  • 我想人们会想要一个操作系统便携式解决方案。此外,这不处理带有空格的文件或路径 (2认同)

van*_*ars 6

这是一个如何在我的项目中找到json文件进行处理的示例.

sh "ls *.json > listJsonFiles"
def files = readFile( "listJsonFiles" ).split( "\\r?\\n" );
sh "rm -f listJsonFiles"
Run Code Online (Sandbox Code Playgroud)
  • 使用ls查找文件并将其写入另一个临时文件
  • 读取临时文件并拆分新行以提供数组
  • 删除临时文件

  • 为什么不使用`sh script:“ ls * .json”,returnStdout:true`? (4认同)

f-s*_*ety 5

如果您在 master 上运行脚本,您可以尝试以下使用 pwd() 的操作。

 sh "ls -la ${pwd()}"
Run Code Online (Sandbox Code Playgroud)