groovy 列出Jenkins Pipeline上工作区中的文件

toe95027  于 2022-11-01  发布在  Jenkins
关注(0)|答案(6)|浏览(260)

我尝试在Jenkins Pipeline中列出工作区中的文件,以便可以使用它来生成适当的并行任务。
虽然我可以简单地使用sh ls > files并读取它,但我需要File对象,我可以用更复杂的逻辑进一步过滤它们。
然而,我根本无法获得文件列表。首先,我不得不求助于一些奇怪的东西来简单地找到构建的当前工作目录:

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语法。

syqv5f0l

syqv5f0l1#

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

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

t1qtbnec2#

一个在所有情况下都有效的解决方案,无需使用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}<<<"     
}
rpppsulh

rpppsulh3#

下面是一个例子,说明我如何在项目中查找json文件以进行处理。

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

dxpyg8gm4#

您可以尝试使用pwd()的以下命令。

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

kyvafyod5#

这是最简单和不复杂的groovy解决方案,为我工作。

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

yqyhoc1h6#

这对我很有效!

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

相关问题