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

Jerry li · 2018年11月07日 · 最后由 Jerry li 回复于 2018年11月08日 · 190 次阅读

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

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

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

原因分析:

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

求助:

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

共收到 7 条回复 时间 点赞

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

张全蛋 回复

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

没报错日志吗?

吴宝林 回复

就只有一句: 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的值不对。

吴宝林 回复

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

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