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によると、 play auto-test -command の後に-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>
完全に決定論的なものは何もないので、因果関係についてここで言うのは少し難しい. (これは、ジェンキンス/サーバーの再起動後、1 つまたは 2 つのビルドの後に発生するようです)
現在、私たちのプロジェクトでCoberturaを無効にすることを検討していますが、誰かが他のアイデアを持っているなら、それは素晴らしいことです =)