-
Bug
-
Resolution: Fixed
-
Minor
-
None
I get the following error when using recordCoverage inside an build container from the Kubernetes plugin.
recordCoverage(tools: [[parser: 'COBERTURA', pattern: 'coverage/cobertura-coverage.xml']], sourceDirectories: [[path: '.']])
The error log:
The error shows that the Coverage Plugin has no permission to write into /home/jenkins/agent/workspace/my-project_develop/coverage/ directory.
My guess is, that the plugin tries to write into the folder on the Master Node, where the directory does not exist, and not the Build Agent Container.
[Coverage] [-ERROR-] Errors during source code painting: [Coverage] [-ERROR-] Can't write coverage paint of 'src/components/TokenErrors.tsx' to zipped source file '/home/jenkins/agent/workspace/my-project_develop/coverage/src_components_TokenErrors.tsx.zip' [Coverage] [-ERROR-] java.nio.file.AccessDeniedException: /home/jenkins/agent/workspace/my-project_develop/coverage/src_components_Publish_TokenErrors.tsx.zip [Coverage] [-ERROR-] at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source) [Coverage] [-ERROR-] at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source) [Coverage] [-ERROR-] at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source) [Coverage] [-ERROR-] at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(Unknown Source) [Coverage] [-ERROR-] at java.base/java.nio.file.spi.FileSystemProvider.newOutputStream(Unknown Source) [Coverage] [-ERROR-] at java.base/java.nio.file.Files.newOutputStream(Unknown Source) [Coverage] [-ERROR-] at Jenkins v2.521//hudson.FilePath.write(FilePath.java:2486) [Coverage] [-ERROR-] at Jenkins v2.521//hudson.FilePath.zip(FilePath.java:417) [Coverage] [-ERROR-] at PluginClassLoader for coverage//io.jenkins.plugins.coverage.metrics.source.SourceCodePainter$AgentCoveragePainter.paint(SourceCodePainter.java:219) [Coverage] [-ERROR-] at PluginClassLoader for coverage//io.jenkins.plugins.coverage.metrics.source.SourceCodePainter$AgentCoveragePainter.lambda$paintSource$1(SourceCodePainter.java:196) [Coverage] [-ERROR-] at java.base/java.util.Optional.map(Unknown Source) [Coverage] [-ERROR-] at PluginClassLoader for coverage//io.jenkins.plugins.coverage.metrics.source.SourceCodePainter$AgentCoveragePainter.paintSource(SourceCodePainter.java:196) [Coverage] [-ERROR-] at PluginClassLoader for coverage//io.jenkins.plugins.coverage.metrics.source.SourceCodePainter$AgentCoveragePainter.lambda$invoke$0(SourceCodePainter.java:158) [Coverage] [-ERROR-] at java.base/java.util.stream.ReferencePipeline$4$1.accept(Unknown Source) [Coverage] [-ERROR-] at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source) [Coverage] [-ERROR-] at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source) [Coverage] [-ERROR-] at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) [Coverage] [-ERROR-] at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(Unknown Source) [Coverage] [-ERROR-] at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(Unknown Source) [Coverage] [-ERROR-] at java.base/java.util.stream.AbstractTask.compute(Unknown Source) [Coverage] [-ERROR-] at java.base/java.util.concurrent.CountedCompleter.exec(Unknown Source) [Coverage] [-ERROR-] at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source) [Coverage] [-ERROR-] at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source) [Coverage] [-ERROR-] at java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source) [Coverage] [-ERROR-] at java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source) [Coverage] [-ERROR-] at java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
Minimal Jenkinsfile:
podTemplate(containers: [ containerTemplate( name: 'jnlp', image: 'jenkins/inbound-agent:latest' ), containerTemplate( name: 'node', image: 'node:20', command: 'sleep', args: '99d' ) ]) { node(POD_LABEL) { container('node') { // Have some code producing `coverage/cobertura-coverage.xml` and its source recordCoverage(tools: [[parser: 'COBERTURA', pattern: 'coverage/cobertura-coverage.xml']], sourceDirectories: [[path: '.']]) } } }