Jenkins Pipeline中Groovy代码调用get()触发空指针异常求助
解决Jenkins Pipeline中HttpBuilder-NG的NullPointerException问题
这个问题我之前在Jenkins Pipeline里用Groovy第三方库时也碰到过,核心原因是Jenkins Pipeline的Groovy运行环境和本地标准Groovy环境有很大差异,尤其是动态依赖加载(比如@Grab注解)的支持不好,导致HttpBuilder-NG没有被正确初始化,最终configure方法返回了null,调用get()时就抛出了NPE。
下面给你两个可行的解决方案:
方案一:改用Jenkins官方的httpRequest插件(推荐)
Jenkins有专门的httpRequest插件来处理HTTP请求,完全适配Pipeline环境,不需要手动处理依赖,步骤如下:
- 先在Jenkins的「插件管理」里安装
httpRequest插件 - 修改你的Pipeline代码为:
pipeline { agent any stages { stage('Fetch Astronaut Data') { steps { script { // 发送HTTP请求获取响应 def response = httpRequest 'http://api.open-notify.org/astros.json' // 把响应内容解析为JSON对象 def astros = readJSON text: response.content println "There are ${astros.number} astronauts in space right now." astros.people.each { p -> println " - ${p.name} (${p.craft})" } } } } } }
这个方案最稳妥,因为是Jenkins官方支持的方式,不会有类加载或依赖的问题。
方案二:手动添加HttpBuilder-NG依赖到Jenkins(适合一定要用原库的场景)
如果必须使用HttpBuilder-NG,需要绕过@Grab的动态加载,手动把依赖包放到Jenkins的类路径中:
- 下载
http-builder-ng-core-1.0.3.jar以及它的所有依赖包(比如Groovy相关、HTTP客户端相关的jar) - 把这些jar包复制到Jenkins服务器的
$JENKINS_HOME/plugins/workflow-cps/lib/目录下(如果没有lib文件夹就新建一个) - 重启Jenkins服务,让新的依赖生效
- 修改你的Pipeline代码,去掉
@Grab注解(因为依赖已经在Jenkins的classpath里了):
import static groovyx.net.http.HttpBuilder.configure def astros = configure { request.uri = 'http://api.open-notify.org/astros.json' }.get() println "There are ${astros.number} astronauts in space right now." astros.people.each { p -> println " - ${p.name} (${p.craft})" }
为什么@Grab在Jenkins里不行?
Jenkins Pipeline使用CPS转换来实现脚本的暂停和恢复,这种机制会改变Groovy代码的执行逻辑,而@Grab是Groovy的动态依赖加载特性,在CPS转换的环境下无法正确执行,导致HttpBuilder-NG的类没有被加载,configure方法无法初始化出有效的HttpBuilder实例,最终返回null,调用get()就会抛出NullPointerException。
内容的提问来源于stack exchange,提问作者user54
相关产品推荐
相关产品推荐

