如何为groovy.io.FileType FILES批准Jenkins脚本管道RejectedAccessException?

时间:2019-03-25 12:29:07

标签: jenkins groovy jenkins-pipeline sandbox jenkins-groovy

我有一个脚本化的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$14.reject(SandboxInterceptor.java:372)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:381)
at org.kohsuke.groovy.sandbox.impl.Checker$6.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生成批准条目...

2 个答案:

答案 0 :(得分:1)

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

似乎无法找到目录,但是您可以使用ant-like pattern matching在子文件夹中递归查找文件。

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

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

答案 1 :(得分:0)

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

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