在使用共享库的 jenkinsfile 中(在 jenkins 文件夹/不受信任上配置),我有以下行:
def itemTime = Instant.parse("2018-02-27T13:33:36Z")
Run Code Online (Sandbox Code Playgroud)
当我运行管道时,我得到:
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)
Run Code Online (Sandbox Code Playgroud)
当然我可以手动批准脚本方法:
staticMethod java.time.Instant parse java.lang.CharSequence
Run Code Online (Sandbox Code Playgroud)
关于詹金斯大师,我也看了:
Jenkins CI 管道脚本不允许使用方法 groovy.lang.GroovyObject
但:
这并不是说该方法已被列入黑名单 - Jenkins 的安全插件需要可在 Groovy 沙箱中使用的白名单方法。在这里您可以找到默认列入白名单的所有方法的列表:
这背后的原因是为了在运行 Jenkins 构建时提供尽可能高的安全性。如果默认情况下所有方法都可用,则用户通常可以运行破坏其他构建或 Jenkins 服务器的恶意脚本。
当然,缺点是 Jenkins 安全插件开发人员无法考虑应该列入白名单的所有可能方法,这就是为什么脚本批准选项被给予 Jenkins 管理员 - 任何时候在RejectedAccessException
构建中抛出,进程内脚本批准等待方法签名批准它并将其列入白名单以供以后使用。
类中没有任何方法Instant
被列入白名单,即使是类似的方法
Instant.now();
Run Code Online (Sandbox Code Playgroud)
不会引起任何副作用并返回不可变对象。但这是全面策略的代价,并且只允许一小部分(~550)方法子集。
回答你的第二个问题 - 批准Instant.parse()
实际上是继续进行的唯一方法。如果你试试:
Date.parse("yyyy-MM-dd'T'HH:mm:ssZ", "2018-02-27T13:33:36Z")
Run Code Online (Sandbox Code Playgroud)
或者
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse("2018-02-27T13:33:36Z")
Run Code Online (Sandbox Code Playgroud)
您将获得另一个RejectedAccessException
方法签名来批准,因此批准Instant.parse()
一次并随时使用是最有效的方法。