gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:41:38 40 4
gpt4 key购买 nike

我无法在脚本化的Jenkins Pipeline中的给定目录中创建文件名的简单列表。我尝试了在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

最佳答案

您不能真正使用new File和常规的Groovy/Java方式遍历文件系统。该调用默认情况下经过安全检查(请参阅JENKINS-38131),并且由于Jenkins Pipelines如何执行您的管道代码,因此通常甚至无法正常工作。

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

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

另一种选择是掏出 shell 并捕获标准件:

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

关于jenkins - 获取Jenkinsfile(Groovy)中给定文件夹中的文件名列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50586769/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com