如何批准 groovy.io.FileType 个文件的 Jenkins 脚本化管道 RejectedAccessException?

How to Approve Jenkins Scripted Pipeline RejectedAccessException for groovy.io.FileType FILES?

我有一个脚本化的 Jenkins 管道,无法批准 groovy.io.FileType FILES 的沙箱限制。例如,以下 Jenkins Pipeline 片段在开箱即用的沙箱中不起作用:

new File("/tmp").eachFileRecurse(FileType.FILES) { file ->
    echo "$file"
}

抛出异常:

Exception stacktrace: org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use staticField groovy.io.FileType FILES
at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectStaticField(StaticWhitelist.java:199)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.reject(SandboxInterceptor.java:372)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:381)
at org.kohsuke.groovy.sandbox.impl.Checker.call(Checker.java:288)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:292)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:29)
at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
at WorkflowScript.copySqlFiles(WorkflowScript:101)
at WorkflowScript.run(WorkflowScript:58)
at org.jenkinsci.plugins.docker.workflow.Docker$Image.inside(jar:file:/var/jenkins_home/plugins/docker-workflow/WEB-INF/lib/docker-workflow.jar!/org/jenkinsci/plugins/docker/workflow/Docker.groovy:136)
...

通常在 Manage Jenkins » In-process Script Approval,但对于这个例外没有。这真的很奇怪,因为如果我用 new File("/tmp").eachFileRecurse(FileType.DIRECTORIES) 遍历目录它正在工作并且我可以批准异常,但是现在没有为 FILES...

生成批准条目

一种解决方法是通过 Sub-URL .../script 和 运行 以下脚本使用 Groovy 脚本控制台:

def signature = 'staticField groovy.io.FileType FILES'
org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval.get().approveSignature(signature)

使用 Jenkins Pipelines 的最佳方式是遵循提供的脚本。在这种情况下,只需使用 findFiles Utility step

似乎无法找到目录,但您可以使用 ant-like pattern matching.

在子文件夹中递归查找文件

要遍历工作区子文件夹中的所有文件,您可以这样写:

findFiles(glob: 'special/path/**/*').each {
    echo "${WORKSPACE}/${it.path}"
}