持续集成 求助: 调用了 jar 包的 python 脚本在 Jenkins 中执行失败

Jerry li · 2018年11月07日 · 最后由 Wchenghui 回复于 2020年10月29日 · 2397 次阅读

现在遇到一个这样的问题:

1. pytest 的脚本在服务器上可正常执行:

2. 脚本配置到 Jenkins 上后无法执行:

原因分析:

经过测试对比:
如果测试脚本中使用 jpype 模块调用 jar 包, 执行失败(直接在服务器上执行通过, Jenkins 执行失败);
如果测试脚本没使用 jpype 模块,可正常执行。

求助:

有人遇到过类似的情况和对应的解决方案吗?

共收到 10 条回复 时间 点赞

弱弱地猜测,Jenkins 上对应的 py 环境里是不是没装那个库?和你直接在服务器上运行调的不是同一个 python.exe?

我去催饭 回复

服务器是作为 node 在 Jenkins 上跑的,其他的用例脚本可以正常跑,只有调用到 jar 包的用例跑不通。 我在看是否对应 java 配置的问题。

没报错日志吗?

arrow 回复

就只有一句: Build step 'Execute shell' marked build as failure
所以百思不得其解,也不知道从何入手排查

问题解决了:

原因:
python 脚本里使用 getDefaultJVMPath() 方法来获取对应的 JVM 环境。 如果直接在服务器上执行脚本,可以获取到正确的环境; 如果使用 Jenkins 跑,则获取到的是另外一个环境。 原因可能是其他人员修改过默认的配置信息。

解决方案:
因为目前脚本是在固定的 linux 服务器上执行,所以暂时写死对应的 JVM 环境,不再通过 getDefaultJVMPath() 方法来获取。 问题解决。

Jerry li 回复

getDefaultJVMPath() 这个方法会先查找注册表获取你的 JVM 版本
/HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment/CurrentVersion 的值,然后再获取/HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment/{获取到的版本}/RunTimeLib 的值,就是 JVM 的路径,你看看是不是CurrentVersion的值不对。

arrow 回复

我是在 linux 服务器上部署的哦, 应该和注册表没关系。
不过分析也是类似的原因: 服务器上的 jdk 被重装过,路径可能被破坏了,导致 Jenkins 获取的路径和系统上 root 用户获取的路径不一致。

我也遇到了同样的问题,但是通过getDefaultJVMPath()方法查看了在服务器上和在 jenkins 上执行时获得的路径,都是相同的,想请教下楼主还会有什么原因吗

Wchenghui 回复

有什么错误截图吗?

Jerry li 回复

这个是报错信息

下面是在 jenkins 和在服务器上执行时获取的 JVMpath

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册