【发布时间】:2012-09-22 04:56:22
【问题描述】:
我们有一个 Play 1.2.4 应用程序,并且我们为该应用程序安装了 Jenkins(在 Ubuntu 上)。我们遇到了 Cobertura 的问题。
运行测试(成功)后,我们时不时地收到以下错误:
---------------------------------------
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at net.sourceforge.cobertura.util.FileLocker.lock(FileLocker.java:124)
at play.modules.cobertura.CoberturaPlugin$CoberturaPluginShutdownThread.run(Unknown Source)
Caused by: java.nio.channels.OverlappingFileLockException
at sun.nio.ch.FileChannelImpl$SharedFileLockTable.checkList(FileChannelImpl.java:1166)
at sun.nio.ch.FileChannelImpl$SharedFileLockTable.add(FileChannelImpl.java:1068)
at sun.nio.ch.FileChannelImpl.lock(FileChannelImpl.java:824)
at java.nio.channels.FileChannel.lock(FileChannel.java:860)
... 6 more
---------------------------------------
Unable to get lock on /var/lib/jenkins/jobs/project/workspace/cobertura.ser.lock: null
This is known to happen on Linux kernel 2.6.20.
Make sure cobertura.jar is in the root classpath of the jvm
process running the instrumented code. If the instrumented code
is running in a web server, this means cobertura.jar should be in
the web server's lib directory.
Don't put multiple copies of cobertura.jar in different WEB-INF/lib directories.
Only one classloader should load cobertura. It should be the root classloader.
---------------------------------------
lock file could not be deleted
这似乎并没有“破坏构建”,但进一步向下构建,我们得到以下(导致 cobertura 报告失败)
Publishing Cobertura coverage report...
No coverage results were found using the pattern 'test-result/code-coverage/coverage.xml' relative to '/var/lib/jenkins/jobs/project/workspace'. Did you enter a pattern relative to the correct directory? Did you generate the XML report(s) for Cobertura?
Build step 'Publish Cobertura Coverage Report' changed build result to FAILURE
手动运行后续构建通常会通过。
根据Zero code coverage with cobertura 1.9.2 but tests are working,我尝试在播放自动测试命令后设置-Dcobertura.use.java.nio=false。
由于这个错误只是偶尔发生,我不确定这是否有帮助。但在那之后,我们遇到了播放自动测试挂起的问题:
...
Executing /opt/play-1.2.4/play auto-test "/var/lib/jenkins/jobs/project/workspace" -Dcobertura.use.java.nio=false
[workspace] $ /opt/play-1.2.4/play auto-test "/var/lib/jenkins/jobs/project/workspace" -Dcobertura.use.java.nio=false
<build stuck here for a couple of days>
由于没有什么东西是完全确定的,所以在这里很难说因果关系。 (这似乎发生在 jenkins/server 重启后的一两次构建之后)
目前我正在考虑在我们的项目中禁用 Cobertura,但如果有人有其他想法,那就太好了 =)
【问题讨论】:
-
我们遇到了完全相同的问题!我也以同样的方式尝试了 cobertura.use.java.nio,它也挂起......
-
@valanto : 你有什么环境?
-
和我想的一样。在 Ubuntu 机器上运行 jenkins。使用 play1.2.4,cobertura 模块 2.4,最新的 jenkins。我们也在 jenkins 上运行自动测试,当我尝试 -Dcobertura.use.java.nio=false 时它也挂了。我们在 cobertura 上的失败也时断时续……
-
我设法通过添加一个虚拟机作为 Jenkins 的奴隶来克服这个问题。 Master 正在运行 Ubuntu 并且没有获得任何构建作业,slave 正在运行 Centos 并且尚未显示错误(大约 300 个构建)。我不知道是什么开始导致错误,我偶尔会在我的 Win7 工作站上得到它(给出关于 Linux 内核的相同消息:P)
-
@LeonidasK :所以 Centos 似乎没有 Ubuntu 出现的这个问题(至少到目前为止)
标签: java playframework jenkins playframework-1.x cobertura