Jenkins + Игра 1.2.4: проблемы с cobertura блокируют файлы / отчет

У нас есть Игра 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

Выполнение последующей сборки вручную обычно передает.

Согласно Нулевому покрытию кода с cobertura 1.9.2, но тестами работают, я пытался установить-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
  

Так как ничто не было полностью детерминировано, немного трудно сказать о причинных связях здесь. (Это, кажется, происходит после одной или двух сборок после jenkins/server перезапуск),

В настоящее время я считаю отключение Cobertura в нашем проекте, но если бы у кого-то есть другие идеи, которые были бы прекрасными =)

63
задан 23 May 2017 в 14:48

5 ответов

Очевидно это - должные проблемы блокировки JVM или в Вашей реализации JVM, или скорее в способе, которым Вы развертываете свой cobertura JAR.

Jenkins может породить много потоков JVM, и если cobetura находится на Вашем глобальном пути к классу, его возможное, что происходят некоторые странные коллизии.

я предполагаю, в конечном счете, что это должно быть приписано незначительной ошибке в cobertura (если комплекс corbertura захват файла не решает некоторую другую более важную проблему).

Согласно исходному коду для FileLock Cobertura (cobertura/src/main/java/net/sourceforge/cobertura/util/FileLocker.java), существуют некоторые проблемы вокруг загрузки нескольких JVM банка Cobertura.

Для решения удостоверьтесь, что существует только одна копия и одно приложение запускающийся и использующий Corbetura.

причина Ваша реализация VM зафиксировала, скорее всего, случается так, что Вы уменьшились, сумма изменчивости в пути cobetrura может быть загружен. Также, возможно, Вы перезапускаете свой VM с верхней частотой затем Ваш jenkins сервер.

В нашем jenkins corbertura сборки, мы просто используем плагин знатока, и это, кажется, хорошо работает без проблемы (но с другой стороны, мы не используем java 1.7, и при этом мы не используем Игру).

2
ответ дан 31 October 2019 в 13:01

Это беспокоило нас некоторое время (играйте 1.2.4/Jenkins). Существует некоторая проблема из-за наложения последовательностей между jenkins cobertura плагин (отчет публикуют), и платформа игры cobertura модуль. Я верю его просто синхронизирующему совпадению и следовательно неустойчивый. У нас есть следующая работа вокруг из-за отсутствия лучшего разрешения.

Удаленные jenkins cobertura отчет публикуют действие от основного задания сборки. Мы создали новое jenkins задание, которое является установкой с, публикуют cobertura действие отчета о покрытии. В новом задании у нас есть действие оболочки для копирования coverage.xml от основной рабочей области задания сборки до рабочей области нового задания для cobertura отчета о покрытии, публикуют действие для выполнения. Копия (по очевидным причинам) сделана, чтобы не выполнять и игру cobertura и jenkins cobertura в том же задании.

не лучшее, но счастливое для наблюдения отчета/графиков о покрытии :-)

2
ответ дан 31 October 2019 в 13:01

Прием должен использовать один файл данных (cobertura.ser) на модуль для предотвращения блокировок от параллельных задач.

С муравьем:

<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>
2
ответ дан 31 October 2019 в 13:01

-Dcobertura.use.java.nio=false предыдущее, кажется, требует, чтобы изменение на истинный смогло использовать захват файла в качестве Вашего объясненного сообщения об ошибке.

кроме того, где-нибудь приложение, вероятно, требует добавления полного пути к классу папки для cobertura.

Это появляется , Вы используете что-то подобное COF (постоянно открытый файл), сообщение об ошибке относится к файлу, который существует, но регионы файла заблокированы n диск, не сам файл просто.

1
ответ дан 31 October 2019 в 13:01

Вы устанавливали

%test.play.tmp=none

в Вашем application.conf файле?

0
ответ дан 31 October 2019 в 13:01

Другие вопросы по тегам:

Похожие вопросы: