62

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を無効にすることを検討していますが、誰かが他のアイデアを持っているなら、それは素晴らしいことです =)

4

5 に答える 5

2

秘訣は、モジュールごとに 1 つのデータファイル (cobertura.ser) を使用して、並列タスクからのロックを回避することです。

アリの場合:

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

最後に、多数の cobertura ファイルを 1 つの cobertura ファイルにマージします。

<target name="merge-coverage">
    <cobertura-merge datafile="cobertura.ser">
        <fileset dir="${build.dir}">
            <include name="cobertura.ser.*" />
        </fileset>
    </cobertura-merge>
</target>
于 2014-03-28T18:20:47.590 に答える
2

明らかに、これは JVM の実装、または cobertura JAR のデプロイ方法に JVM のロックの問題があるためです。

Jenkins は多くの JVM スレッドを生成できます。cobetura がグローバル クラスパスにある場合、奇妙な衝突が発生している可能性があります。

最終的には、これは cobertura のマイナーなバグに起因すると考えられます (複雑な corbertura ファイルのロックが他の重要な問題を解決している場合を除きます)。

Cobertura の FileLock のソース コード (cobertura/src/main/java/net/sourceforge/cobertura/util/FileLocker.java) によると、複数の JVM が Cobertura jar をロードする際にいくつかの問題があります。

解決するには、Corbetura を起動して使用するコピーとアプリが 1 つだけであることを確認してください。

あなたの VM 実装がそれを修正した理由は、ほとんどの場合、cobetrura をロードできる方法の変動量を減らしたためです。また、jenkins サーバーよりも高い頻度で VM を再起動している可能性があります。

私たちの jenkins corbertura ビルドでは、maven プラグインを使用するだけで、これは問題なく正常に動作するようです (ただし、Java 1.7 も Play も使用していません)。

于 2013-07-07T15:32:30.877 に答える
0

設定しましたか

%test.play.tmp=none

あなたのapplication.confファイルに?

于 2013-06-28T07:17:17.313 に答える