在 Jenkins 中从公共共享库调用步骤时如何处理 RejectedAccessException?

问题描述 投票:0回答:1

我正在尝试为多个项目中的 Jenkins 脚本中使用的通用步骤创建一个通用共享库。 我有一个步骤 sendBuildInfoSlack ,它之前调用了同一个 JenkinsFile 中定义的函数。我将其移至 vars 文件夹下的公共共享库中自己的步骤。

该文件的调用函数正在调用与之前直接在 JenkinsFile 中工作的相同函数。但是,它给了我这个错误:

Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object (org.jenkinsci.plugins.workflow.cps.CpsClosure2 sendBuildInfoSlack java.util.LinkedHashMap). Administrators can decide whether to approve or reject this signature.
Error when executing failure post condition:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object (org.jenkinsci.plugins.workflow.cps.CpsClosure2 sendBuildInfoSlack java.util.LinkedHashMap)

我没想到会遇到这个错误,特别是在声明全局管道库时,它明确表示这些库将受到信任,这意味着它们在没有沙箱限制的情况下运行

此外,我不清楚哪种方法导致了这个问题。

如果我不必将每个函数列入白名单,我会更愿意,因为我希望这个库能够增长以涵盖更广泛使用的函数,而且我也没有白名单的权限。

请问有什么帮助吗?

jenkins jenkins-groovy
1个回答
0
投票

这是一个老问题,很抱歉在 2020 年没有看到它,但我们都在处理一些事情。

Jenkins 有一个长期存在的“怪癖”,它是由于 groovy 如何进行方法解析和沙箱安全管理器的设置方式之间的交互而产生的。这个怪癖意味着,如果你输入了错误的方法名称或传递了错误的参数(例如,如果你在 Jenkins 和 python 之间来回跳转,并尝试在本应使用

isFoo=true
时将参数传递为
isFoo: true
,或者如果您在函数需要它时忘记了函数后面的块),您会得到一个引用
RejectedAccessException
GroovyObject invokeMethod
,而不是像
groovy.lang.MissingMethodException
这样的合理错误。至少从 2016 年开始就是这样,所以我不会对这个问题很快得到解决抱有期待。

所以这个错误真正告诉你的是“我找不到名为

sendBuildInfoSlack
的方法,该方法将
Map
作为其唯一参数”。

一种可能是您错误地声明了您的方法(如本问题中)并创建了一个不采用常见

sendBuildInfoSlack
语法的命名参数的
funcName paramName: value
。然而,由于过去它在所有内容都在同一个文件中时才可以工作,所以这不太可能。 (尽管您确实将顶级定义从
def call
更改为
def sendBuildInfoSlack
,对吗?)

更有可能的是,由于某种原因,您的 Jenkinsfile 没有加载库文件,因此根本看不到

sendBuildInfoSlack
。您的 Jenkinsfile 顶部是否有
@Library
声明?您可以调用同一目录中的其他函数吗?

© www.soinside.com 2019 - 2024. All rights reserved.