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

时间:2016-07-31 01:36:05

标签: jenkins groovy jenkins-pipeline

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

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

7 个答案:

答案 0 :(得分:18)

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

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

files = findFiles(glob: '*.*')

答案 1 :(得分:6)

以下是我在项目中查找json文件以进行处理的示例。

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

答案 2 :(得分:3)

在不使用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}<<<"     
}

答案 3 :(得分:1)

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

 sh "ls -la ${pwd()}"

答案 4 :(得分:1)

这是对我有用的最简单,最简单的常规解决方案。

def fileList = "ls /path/to/dir".execute()
def files= []
fileList .text.eachLine {files.add(it)}
return files

答案 5 :(得分:0)

这对我有用!!

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);
    }
}

答案 6 :(得分:-2)

您是否考虑将所有文件逻辑操作编写为shell脚本,然后使用c2运行shell脚本?

Shell脚本对于文件操作非常强大。该脚本也可以分发给每个从站进行并行化。