如何在Jenkins插件中通过管道步骤返回复杂的对象?

问题描述

我创建了一个名为DeployFromCatalogStep插件。此步骤返回描述部署的记录。当前作为Deployment类的对象返回。这纯粹是一个数据载体对象(getter和setter)。该步骤工作正常,但是当我的管道尝试调用getter时,我收到了脚本安全性错误。这是我正在运行的代码段:

@H_404_6@def dep = vraDeployFromCatalog( catalogItemName: 'plain-ubuntu-18',count: 1,deploymentName: 'Jenkins-#',projectName: 'Pontus Project',reason: 'Test',timeout: 300,version: '6',inputs: '{ username: \'testuser\' }') assert dep != null def addr = vraWaitForAddress(dep[0].id)

当我尝试提取代码段最后一行的ID时,最后一行失败:

@H_404_6@org.jenkinsci.plugins.scriptsecurity.sandBox.RejectedAccessException: Scripts not permitted to use method net.virtualviking.vra.jenkinsplugin.model.catalog.Deployment getId

我了解为什么会收到该错误。我没有明确允许访问该方法

这是我的问题:在这种情况下,最佳做法是什么?我可以想到一些选择:

  1. 避免返回任何不是简单类型的东西(真的不是我想要的)
  2. 要求管理员启用对我返回的对象的所有getter的访问权限
  3. 将所有内容转换为Map或其他“无害”数据类型。
  4. 一些尚未发现的精美注释或机制。

有什么想法吗?

解决方法

由于您的方法的返回类型,这里没有得到脚本批准。即使您将字符串等类型用作返回值,也会出现错误消息。

无论您的方法中使用哪种数据类型,您的插件类都被认为是不安全的。您可以自动为脚本安全签名预先填充白名单,例如上述here。这不能解决问题,但是是有效的解决方法。