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

列出Jenkins管道上工作区中的文件,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我试图在Jenkins管道中列出工作区中的文件,以便我可以使用它来生成适当的并行任务 虽然我可以简单地使用shls>文件并阅读它,但我想要文件对象,我可以用更复杂的逻辑进一步过滤它们。事实上,Files.listFiles(FileFilter)将是理想的选择 但是,我根本无法获取文件列表。首先,我不得不求助于一些奇怪的东西来简单地找出构建的当前工作目录: sh 'pwd > workspace' workspace = readFile('workspace').trim() 现在我调

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

虽然我可以简单地使用
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