在使用共享库(在jenkins文件夹/ untrusted上配置)的jenkins文件中,我有以下行:
def itemTime = Instant.parse("2018-02-27T13:33:36Z")
当我运行我的管道时,我得到:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use staticMethod java.time.Instant parse java.lang.CharSequence
at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectStaticMethod(StaticWhitelist.java:189)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onStaticCall(SandboxInterceptor.java:150)
at org.kohsuke.groovy.sandbox.impl.Checker$2.call(Checker.java:184)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedStaticCall(Checker.java:188)
当然我可以手动批准脚本方法:
staticMethod java.time.Instant parse java.lang.CharSequence
在Jenkins大师身上,我也看了看:
Jenkins CI Pipeline Scripts not permitted to use method groovy.lang.GroovyObject
可是:
答案 0 :(得分:1)
并非此方法已列入黑名单 - Jenkins' Security Plugin需要可在Groovy沙箱中使用的白名单方法。在这里,您可以找到默认情况下列入白名单的所有方法的列表:
这背后的原因是在运行Jenkins构建时提供尽可能高的安全性。如果默认情况下所有方法都可用,则用户可能会运行破坏其他构建或Jenkins服务器的恶意脚本。
当然缺点是Jenkins Security Plugin开发人员无法考虑应该列入白名单的所有可能方法,这就是为什么给Jenkins管理员提供脚本批准选项的原因 - 任何时候RejectedAccessException
被抛出构建,进程内脚本批准等待方法签名批准它并白名单以供以后使用。
来自Instant
类的任何方法都被列入白名单,即使是像
Instant.now();
不会导致任何副作用并返回不可变对象。但这是切割所有政策的代价,只允许一小部分(~550)方法。
回答你的第二个问题 - 批准Instant.parse()
实际上是唯一的办法。如果您尝试:
Date.parse("yyyy-MM-dd'T'HH:mm:ssZ", "2018-02-27T13:33:36Z")
或
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse("2018-02-27T13:33:36Z")
您将获得另一个RejectedAccessException
和方法签名以进行批准,因此批准Instant.parse()
一次并随时使用它是最有效的方法。