如何隔离 Jenkins 管道 Groovy 共享库类加载器?

2024-02-17

我有一个 Groovy 库作为全局共享库提供:

package com.example

@Grab(group="org.apache.httpcomponents", module="httpclient", version="[4.5.3,)")
import org.apache.http.HttpHost
import org.apache.http.impl.client.HttpClients

class MyClass implements Serializable {
  static def run() {
    return HttpClients.custom()
    .setProxy(new HttpHost("proxy.example.com", 3128))
    .build()
  }

  static def debug() {
    return ("""
      this: ${this.classLoader.class.toString()} ${this.classLoader.hashCode().toString()}
      HttpHost: ${HttpHost.class.classLoader.class.toString()} ${HttpHost.class.classLoader.hashCode()}
      HttpClients: ${HttpClients.class.classLoader.class.toString()} ${HttpClients.class.classLoader.hashCode()}
    """)
  }
}

以及使用此库的 Jenkins 脚本化管道作业:

@Library('example') _
node {
  echo "${com.example.MyClass.debug()}"
  com.example.MyClass.run()
}

当作业运行时,我得到以下输出debug(),随后出现错误run():

  this: class org.jenkinsci.plugins.workflow.cps.CpsGroovyShell$CleanGroovyClassLoader 765101363
  HttpHost: class hudson.ClassicPluginStrategy$AntClassLoader2 804623541
  HttpClients: class hudson.ClassicPluginStrategy$AntClassLoader2 1870591909

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: org.apache.http.impl.client.HttpClientBuilder.setProxy() is applicable for argument types: (org.apache.http.HttpHost) values: [http://proxy.example.com:3128]
Possible solutions: setProxy(org.apache.http.HttpHost)
The following classes appear as argument class and as parameter class, but are defined by different class loader

我很清楚一些 Jenkins 插件已经依赖于 httpcomponents,并且以下情况似乎是正确的:

  1. My @Grab注释导致下载请求的 httpclient 版本(如~/.groovy/grapes).
  2. 但是,该版本并未被 Groovy 库加载或使用,而是由某些 Jenkins 插件依赖的其他版本加载或使用。
  3. 而且,更令人恼火的是,HttpHost and HttpClients正在从不同的类加载器加载,因此我什至无法使用泄漏到我的 Groovy 代码的类加载器中的插件版本。

Versions

  • 詹金斯:2.20

插件版本

  • 格罗维:2.0
  • 管道:2.5
  • 管道:Groovy:2.30
  • 管道:共享 Groovy 库:2.8

有没有办法在与 Jenkins 插件隔离的类加载器中运行我的 Groovy? Jenkins 和 Groovy 共享库代码如何组织类加载器?插件引入的类的泄漏是故意的吗?

这是一个错误还是我做错了什么?我意识到我在 Jenkins 上落后了几个版本,所以这是值得尝试的一件事。

事实上,系统无法使用,除非我足够幸运拥有其他插件没有的依赖项,或者幸运地与类加载器碰巧找到的任何版本兼容。


@Grab当库的范围仅限于文件夹时不起作用。使用@Grab仅当在全局设置中配置库时,在库中才有效。根据 Jenkins 的说法,这是故意的,而不是 Jenkins 的错误插件结构文档 https://wiki.jenkins-ci.org/display/JENKINS/Plugin+Structure.

该文档继续说道:

如果您想在这些之前加载自己的库(例如,您想要更新版本的velocity或其他库),您可以通过在 pom.xml 中告诉 hpi 插件来配置您的插件以使用不同的类加载器策略

就我个人而言,在尝试上述操作之前,我会将 Jenkins(和 Pipelines)升级到可用的最新版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何隔离 Jenkins 管道 Groovy 共享库类加载器? 的相关文章

随机推荐

  • jQuery的load函数在本地不起作用

    当窗口宽度小于 600px 时 我必须在现有 div 中加载 HTML 文件 代码是 div div 我已经在我的网站上测试了这段代码并且它可以工作 但也许我做错了什么才能使其在本地工作 有没有理由load函数不能在本地运行
  • 在 Eclipse RCP 应用程序中在哪里存储“全局”数据?

    我是 Eclipse RCP 的初学者 我正在尝试为自己构建一个应用程序来尝试一下 我对如何实际处理模型对象感到困惑 我能找到的例子都不能解决我遇到的问题 所以我怀疑我的处理方式是错误的 假设我需要使用保存经过身份验证的用户信息的类来初始化
  • 如何用IPC::Open2过滤大量数据?

    我的任务是使用外部实用程序 addr2line 从 perl 脚本中过滤一些数据 数据量相当大 我需要打印大量数据stdin程序并读回大量数据 来自stdout程序到我的脚本中 现在我这样做IPC Open2 但我不混合阅读和写作 这合法吗
  • 设置控件Parent属性和使用Controls.Add()之间的区别?

    更具体地说 这些陈述是 ownerControl GroupBox1 Controls Remove childControl ownerControl Controls Add childControl 相当于 childControl
  • 在本地主机上托管 git 服务器

    我的公司没有中央 git 服务器 也不允许我使用 BitBucket 等 无论如何我可以使用我的本地主机作为remote 编辑 我在 Windows 机器上 本地目录的工作方式与远程存储库 URL 类似 因此只要您是唯一使用该存储库的人 基
  • shell 脚本错误期待“do”

    bin sh while true do echo WTF done 这给出了语法错误 语法错误 意外的文件结尾 需要 do 我也尝试过 bin sh while do echo WTF done 我怀疑行结尾 Try hexdump C
  • iOS 模拟器应用程序的终端命令行调试?

    是否可以在 Mac OS X 下的终端命令行中使用 GDB 或 LLDB 来调试在 iOS 模拟器上运行的应用程序 例如 不是从 Xcode 的 GUI 或控制台内部 而是使用外部命令行或进程 如果是这样 怎么办 您需要在模拟器的 Spri
  • MVC-错误消息

    我正在创建 MVC Web 应用程序 我应该在 MVC 模型 视图 控制器 的哪一部分保存错误消息 这些消息可能会出现在出现问题的地方并且用户应该阅读它们 目前情况 Model function f data error Error mes
  • 为 C# MVC ASP.NET 应用程序创建的默认数据库在哪里?

    我在引导程序上使用登录 注册脚本安装了新的 MVC ASP NET 应用程序 它工作正常 但我不知道该应用程序的默认数据库在哪里 我的 App Data 文件夹是空的 有人可以告诉我表单注册的数据保存在哪里吗 这将存储在 Visual St
  • 何时在 Ansible 中使用 from_json 过滤器?

    我什么时候应该使用from json filter https docs ansible com ansible playbooks filters html filters for formatting data在安西布尔 我发现使用它有
  • Mod 重写查询参数验证和阻止也请求 url 阻止

    在我的网站上 只允许很少的查询参数 但是 一些扫描仪或黑客试图使用我的 php 应用程序不支持的唯一参数访问 url 我可以通过验证在 php 应用程序级别阻止它们 GET参数 但我的服务器正在加载 所以如果参数无效 我想显示 403 查询
  • 如何为 flex: 0 0 25% 的弹性项目添加 1px 边距?

    我正在使用 Flexbox 测试几种不同的布局 但遇到以下问题 我有一个设置了弹性项目的图片库flex 0 0 25 我想给它们添加 1px 边距 因为 1 太大了 所以我想知道在这种情况下我应该做什么 我附上下面的例子 foto cont
  • 使用 sshj java 库在我的 Amazon EC2 机器上执行“sudo”命令

    我正在尝试使用 SSHJ 库在我的 Amazon EC2 计算机上执行 sudo 命令 https github com shikhar sshj https github com shikhar sshj 不幸的是 我没有收到服务器的任何
  • 使用 crypto-js 和十六进制编码对字符串进行加密,使其 url 友好

    我在用crypto js by brix https github com brix crypto js 我下面有这个函数来处理纯文本的加密 import CryptoJS from crypto js import AES from cr
  • Python 方法 *参数* 的双下划线

    我知道双下划线对于 Python 类属性 方法意味着什么 但是它对于方法参数意味着什么吗 看起来您无法将以双下划线开头的参数传递给方法 这很令人困惑 因为您可以对正常功能执行此操作 考虑这个脚本 def egg a None return
  • 如何使用多个 next.js 插件(typescript 和 stylus)

    我尝试使用打字稿和手写笔构建 next js 项目下一个撰写插件 https www npmjs com package next compose plugins 我的 next config js const withPlugins re
  • Laravel Carbon 从当前日期减去天数

    我正在尝试从模型 用户 中提取对象 其created at日期已超过从今天起 30 天 Carbon now gt 我想要 gt Carbon now 30 天 users Users where status id active gt w
  • 对日期和时间值进行排序

    简而言之 我有一个不同日期和时间的字符串数组 每个元素的格式如下 2015 08 27T22 24 31 903 即 YYYY MM DDT时 分 SS MMM 我正在对它们进行排序 是否有默认方法可用于对此格式进行排序 我现在正在做的是将
  • 是否有相当于 Backbone.js 路由器的 Ember.js 用于历史记录和哈希更改?

    在 Backbone js 中 您可以使用路由器绑定到 个更改以在单页 HTML5 应用程序中导航 Ember js 是否有等效项 或者我是否错过了其设计的一些基本内容 有计划为 Ember 编写一个路由器 它可能会与 Ember Stat
  • 如何隔离 Jenkins 管道 Groovy 共享库类加载器?

    我有一个 Groovy 库作为全局共享库提供 package com example Grab group org apache httpcomponents module httpclient version 4 5 3 import o