jenkins+播放1.2.4:与coberturalocking文件/报告的问题

我们有一个Play 1.2.4应用程序,我们得到了Jenkins(在Ubuntu上)的应用程序。 我们在Cobertura遇到问题。

在运行testing(成功)之后,我们每隔一段时间就会得到以下错误:

--------------------------------------- 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 

这似乎不是“打破构build”,但进一步下来的构build,我们得到以下(导致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 

手动运行后续构build通常会通过。

根据零代码覆盖与cobertura 1.9.2但testing正在工作 ,我试着设置-Dcobertura.use.java.nio =玩后自动testing命令 – 命令。

由于这个错误只是偶尔发生,我不完全确定这是否有帮助。 但是之后,我们在玩玩自动testing挂起了一个问题:

  ... 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 /服务器重启后的一两个版本之后)

目前我正在考虑在我们的项目中禁用Cobertura,但如果有人有其他的想法,那将是很棒的=)

很明显,这是由于JVM实现中的JVMlocking问题,或者说是您部署cobertura JAR的方式。

Jenkins可以产生大量的JVM线程,如果cobetura在你的全局类path上,可能会发生一些奇怪的冲突。

我最终认为这应该归因于cobertura中的一个小错误(除非复杂的corbertura文件locking正在解决一些其他更重要的问题)。

根据Cobertura的FileLock(cobertura / src / main / java / net / sourceforge / cobertura / util / FileLocker.java)的源代码,围绕多个JVM加载Cobertura jar有一些问题。

要解决,确保只有一个副本和一个应用程序启动和使用Corbetura。

你的虚拟机实现解决它的原因很可能是你已经减less了cobetrura可以加载的方式的变化量。 也许你是以更高的频率重新启动你的虚拟机,然后你的jenkins服务器。

在我们的jenkins corbertura构build中,我们只使用maven插件,这似乎没有问题地正常工作(但是再一次,我们不使用java 1.7,也不使用Play)。

这一直困扰我们一段时间(玩1.2.4 /jenkins)。 由于jenkins cobertura插件(报告发布)和播放框架cobertura模块之间的重叠序列,存在一些问题。 我相信它纯粹是时间巧合,因此是间歇性的。 我们有以下的解决方法缺乏更好的解决方法。

从主build筑作业中删除了jenkins cobertura report publish动作。 我们创build了一个新的jenkins工作,并configuration了发布cobertura覆盖报告操作。 在新工作中,我们有shell操作将coverage.xml从主构build作业工作区复制到新作业的工作区,以便cobertura覆盖报表发布操作运行。 副本(为显而易见的原因)是为了避免同时运行cobertura和jenkins cobertura。

它不是最好的,但很高兴看到覆盖报告/图:-)

诀窍是每个模块使用一个数据文件(cobertura.ser)来避免来自并行任务的locking。

用ant:

 <cobertura-instrument todir="${build.dir}" datafile="cobertura.ser.${modulename}"> ... 

最后将许多cobertura文件合并成一个cobertura文件:

 <target name="merge-coverage"> <cobertura-merge datafile="cobertura.ser"> <fileset dir="${build.dir}"> <include name="cobertura.ser.*" /> </fileset> </cobertura-merge> </target> 

-Dcobertura.use.java.nio = false以前似乎需要更改为true才能使用文件locking作为您的错误信息解释。

此外,某处应用程序可能需要为cobertura添加完整的文件夹类path。

看起来你正在使用类似于COF(不断打开的文件)的东西,错误信息是指存在的文件,但文件的区域被locking在驱动器上,而不是文件本身。

你有没有设置

 %test.play.tmp=none 

在你的application.conf文件中?