Jenkins + Play 1.2.4: problèmes avec les fichiers de verrouillage cobertura / rapport
nous avons une application Play 1.2.4 et nous avons Jenkins (sur Ubuntu) pour l'application. On a des problèmes avec Cobertura.
après avoir effectué les tests (avec succès), de temps en temps, nous obtenons l'erreur suivante:
---------------------------------------
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
cela ne semble pas "casser la construction", mais plus loin dans la construction, nous obtenons ce qui suit (qui provoque les rapports de cobertura à l'échec)
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
lancer une construction ultérieure manuellement passe d'habitude.
selon couverture de code zéro avec cobertura 1.9.2 mais les tests fonctionnent , j'ai essayé de mettre - Dcobertura.utiliser.Java.nio = false après lecture auto-test-commande.
comme cette erreur se produisait seulement de temps en temps, Je ne suis pas totalement sûr si cela a aidé. Mais après cela, nous avons eu un problème avec jeu auto-test suspension:
...
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>
puisque rien n'a j'ai été totalement déterministe, c'est un peu difficile de parler de causalité ici. (Cela semble se produire après une ou deux compilations après le redémarrage de jenkins/server)
actuellement, J'envisage de désactiver Cobertura dans notre projet, mais si quelqu'un a d'autres idées, ce serait génial=)
5 réponses
il est clair que cela est dû à des problèmes de verrouillage JVM soit dans votre implémentation JVM, soit plutôt, dans la façon dont vous déployez votre JAR cobertura.
Jenkins peut engendrer beaucoup de threads JVM, et si cobetura est sur votre chemin de classe global, il est possible que des collisions bizarres se produisent.
je suppose, en fin de compte, que cela doit être attribué à un bug mineur dans cobertura (à moins que le verrouillage de fichier corbertura complexe est résoudre un autre plus problème important).
selon le code source du FileLock de Cobertura (cobertura/src/main/java/net/sourceforge/cobertura/util/FileLocker.java), il y a quelques problèmes concernant le chargement de plusieurs JVM dans le jar de Cobertura.
pour résoudre, assurez-vous qu'il n'y a qu'une copie et une application de lancement et d'utilisation de Corbetura.
la raison pour laquelle votre implémentation de VM l'a corrigé, très probablement, est que vous avez diminué le nombre de variabilité dans la façon dont cobetrura peut être chargé. Aussi peut-être que vous redémarrez votre VM avec une fréquence plus élevée que votre serveur jenkins.
dans nos constructions jenkins corbertura, nous n'utilisons que le plugin maven et cela semble fonctionner sans problème (mais là encore, nous n'utilisons pas java 1.7, ni Play).
cela nous tracasse depuis un moment (play 1.2.4/Jenkins). Il y a un problème dû au chevauchement des séquences entre jenkins cobertura plugin (report publish) et Play framework cobertura module. Je crois que c'est une coïncidence purement temporelle et donc intermittente. Nous avons le contourner l'absence d'une meilleure résolution.
a supprimé le rapport de jenkins cobertura publiant l'action de la construction principale. Nous avons créé un nouvel emploi jenkins qui est mis en place avec publier le rapport de couverture de cobertura action. Dans la nouvelle tâche, nous avons l'action shell pour copier la couverture.xml à partir de la version principale de travail l'espace de travail l'espace de travail de la nouvelle tâche pour la couverture de la couverture de la publication des rapports de l'action à exécuter. La copie (pour des raisons évidentes) est faite pour éviter d'exécuter à la fois play cobertura et jenkins cobertura dans le même travail.
ce n'est pas le meilleur, mais heureux de voir le rapport de couverture/graphiques :-)
le truc est d'utiliser un fichier de données (cobertura.ser) par module pour éviter les serrures des tâches parallèles.
avec ant:
<cobertura-instrument todir="${build.dir}" datafile="cobertura.ser.${modulename}">
...
à la fin fusionner les nombreux fichiers cobertura dans un seul fichier cobertura:
<target name="merge-coverage">
<cobertura-merge datafile="cobertura.ser">
<fileset dir="${build.dir}">
<include name="cobertura.ser.*" />
</fileset>
</cobertura-merge>
</target>
- Dcobertura.utiliser.Java.nio=false le précédent semble nécessiter de changer à true pour pouvoir utiliser le verrouillage de fichier comme votre message d'erreur expliqué.
aussi, quelque part l'application nécessite probablement l'ajout du dossier complet classpath pour cobertura.
Il apparaît vous utilisez quelque chose de semblable à un COF(constamment ouvrir le fichier) , le message d'erreur fait référence à un fichier qui existe déjà, mais régions de la fichier sont verrouillés dans le lecteur, pas le fichier lui-même simplement.
avez-vous mis
%test.play.tmp=none
dans votre demande.fichier conf ?