获取Jenkinsfile(Groovy)中给定文件夹中的文件名列表

我无法在脚本化的Jenkins管道中的给定目录中创建简单的文件名列表.我尝试在SO和其他论坛上发布了许多Groovy Script示例,但要么功能被阻止,要么我找不到方法.

这似乎是最简单的

def DOCKER_FILES_DIR = './dockerfiles'
// ...
def dir = new File(DOCKER_FILES_DIR);
def dockerfiles = [];
dir.traverse(type: FILES, maxDepth: 0) {
    dockerfiles.add(it)
}

但这会错误地解决相对路径,所以我收到此错误:

java.io.FileNotFoundException: /./dockerfiles

我也尝试用dir包装它:

def DOCKER_FILES_DIR = './dockerfiles'
// ...
def dockerfiles = [];
dir("${env.WORKSPACE}"){
    def dir = new File(DOCKER_FILES_DIR);
    dir.traverse(type: FILES, maxDepth: 0) {
        dockerfiles.add(it)
    }
}

但得到了同样的错误:

java.io.FileNotFoundException: /./dockerfiles

这不会产生错误,但只会向列表中添加一个文件:

def DOCKER_FILES_DIR = './dockerfiles'
// ...
def dockerfiles = [];
def dir = new File("${env.WORKSPACE}/${DOCKER_FILES_DIR}");
dir.traverse(type: FILES, maxDepth: 0) {
    dockerfiles.add(it.getName())
}

dockerfiles的内容然后丢失所有文件,但第一个:

['py365']

这是在Jenkins中重现它的最小管道:

#!groovy
import static groovy.io.FileType.FILES

node('master') {
    FILES_DIR = './foo'
    cleanWs()

    sh """
        mkdir foo
        touch foo/bar1
        touch foo/bar2
        touch foo/bar3
    """

    def filenames = [];
    def dir = new File("${env.WORKSPACE}/${FILES_DIR}");
    dir.traverse(type: FILES, maxDepth: 0) {
        filenames.add(it.getName())
    }

    for (int i = 0; i < filenames.size(); i++) {
        def filename = filenames[i]
        echo "${filename}"
    }
}

输出,显示只打印了bar1:

Started by user Tamas Gal
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] node
Running on Jenkins in /var/lib/jenkins/workspace/TestHome
[Pipeline] {
[Pipeline] cleanWs
[WS-CLEANUP] Deleting project workspace...[WS-CLEANUP] done
[Pipeline] sh
[TestHome] Running shell script
+ mkdir foo
+ touch foo/bar1
+ touch foo/bar2
+ touch foo/bar3
[Pipeline] echo
bar1
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
最佳答案
您无法真正使用新的File和常规的Groovy / Java方法来遍历文件系统.默认情况下,调用是安全检查的(参见JENKINS-38131),由于Jenkins Pipelines如何执行管道代码,因此通常不会正常工作.

一种方法是使用Pipeline Utility Steps plugin中的findFiles步骤.它返回FileWrapper[],可以检查/用于其他目的.

node {
  // ... check out code, whatever
  final foundFiles = findFiles(glob: 'dockerfiles/**/*')
  // do things with FileWrapper[]
}

另一个选择是弹出并捕获标准:

node {
  // ... check out code, whatever
  final foundFiles = sh(script: 'ls -1 dockerfiles', returnStdout: true).split()
  // Do stuff with filenames
}

转载注明原文:获取Jenkinsfile(Groovy)中给定文件夹中的文件名列表 - 代码日志