如何批准 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}"
}
我有一个脚本化的 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}"
}