jenkinsci / code-coverage-api-plugin

Deprecated Jenkins Code Coverage Plugin
https://plugins.jenkins.io/code-coverage-api/
MIT License
111 stars 77 forks source link

`NullPointerException` at `FileNode.getRelativePath(FileNode.java:534)` #630

Closed viceice closed 1 year ago

viceice commented 1 year ago

Jenkins and plugins versions report

Environment ```text Jenkins: 2.387.2 OS: Linux - 5.15.0-1034-azure Java: 11.0.18 - Eclipse Adoptium (OpenJDK 64-Bit Server VM) --- Office-365-Connector:4.18.0 additional-identities-plugin:1.1 analysis-model-api:11.1.0 ansicolor:1.0.2 antisamy-markup-formatter:159.v25b_c67cd35fb_ apache-httpcomponents-client-4-api:4.5.14-150.v7a_b_9d17134a_5 authentication-tokens:1.53.v1c90fd9191a_b_ authorize-project:1.5.1 aws-credentials:191.vcb_f183ce58b_9 aws-java-sdk:1.12.406-378.v938a_d577f750 aws-java-sdk-cloudformation:1.12.406-378.v938a_d577f750 aws-java-sdk-codebuild:1.12.406-378.v938a_d577f750 aws-java-sdk-ec2:1.12.406-378.v938a_d577f750 aws-java-sdk-ecr:1.12.406-378.v938a_d577f750 aws-java-sdk-ecs:1.12.406-378.v938a_d577f750 aws-java-sdk-efs:1.12.406-378.v938a_d577f750 aws-java-sdk-elasticbeanstalk:1.12.406-378.v938a_d577f750 aws-java-sdk-iam:1.12.406-378.v938a_d577f750 aws-java-sdk-kinesis:1.12.406-378.v938a_d577f750 aws-java-sdk-logs:1.12.406-378.v938a_d577f750 aws-java-sdk-minimal:1.12.406-378.v938a_d577f750 aws-java-sdk-sns:1.12.406-378.v938a_d577f750 aws-java-sdk-sqs:1.12.406-378.v938a_d577f750 aws-java-sdk-ssm:1.12.406-378.v938a_d577f750 basic-branch-build-strategies:71.vc1421f89888e blueocean-autofavorite:1.2.5 blueocean-commons:1.27.3 blueocean-config:1.27.3 blueocean-core-js:1.27.3 blueocean-dashboard:1.27.3 blueocean-display-url:2.4.1 blueocean-events:1.27.3 blueocean-git-pipeline:1.27.3 blueocean-github-pipeline:1.27.3 blueocean-i18n:1.27.3 blueocean-jwt:1.27.3 blueocean-personalization:1.27.3 blueocean-pipeline-api-impl:1.27.3 blueocean-pipeline-editor:1.27.3 blueocean-pipeline-scm-api:1.27.3 blueocean-rest:1.27.3 blueocean-rest-impl:1.27.3 blueocean-web:1.27.3 bootstrap4-api:4.6.0-5 bootstrap5-api:5.2.2-2 bouncycastle-api:2.27 branch-api:2.1071.v1a_188a_562481 build-token-root:151.va_e52fe3215fc caffeine-api:2.9.3-65.v6a_47d0f4d1fe checks-api:2.0.0 cloudbees-folder:6.815.v0dd5a_cb_40e0e code-coverage-api:4.2.0 command-launcher:90.v669d7ccb_7c31 commons-httpclient3-api:3.1-3 commons-lang3-api:3.12.0-36.vd97de6465d5b_ commons-text-api:1.10.0-36.vc008c8fcda_7b_ config-file-provider:3.11.1 credentials:1224.vc23ca_a_9a_2cb_0 credentials-binding:523.vd859a_4b_122e6 data-tables-api:1.13.3-3 display-url-api:2.3.7 docker-commons:419.v8e3cd84ef49c docker-java-api:3.2.13-68.va_875df25a_b_45 docker-plugin:1.3.0 docker-workflow:563.vd5d2e5c4007f durable-task:504.vb10d1ae5ba2f echarts-api:5.4.0-3 email-ext:2.96 embeddable-build-status:369.vb_a_68a_575a_b_11 external-monitor-job:203.v683c09d993b_9 favorite:2.4.1 font-awesome-api:6.3.0-2 forensics-api:2.1.0 git:5.0.0 git-client:4.2.0 git-forensics:2.0.0 git-parameter:0.9.18 gitea:1.4.5 gitea-checks:449.v0672c320ee47 github:1.37.0 github-api:1.303-417.ve35d9dd78549 github-branch-source:1703.vd5a_2b_29c6cdc google-oauth-plugin:1.0.8 gravatar:2.2 handy-uri-templates-2-api:2.1.8-22.v77d5b_75e6953 htmlpublisher:1.31 instance-identity:142.v04572ca_5b_265 ionicons-api:45.vf54fca_5d2154 jackson2-api:2.14.2-319.v37853346a_229 jakarta-activation-api:2.0.1-3 jakarta-mail-api:2.0.1-3 javax-activation-api:1.2.0-6 javax-mail-api:1.6.2-9 jaxb:2.3.8-1 jdk-tool:63.v62d2fd4b_4793 jenkins-design-language:1.27.3 jjwt-api:0.11.5-77.v646c772fddb_0 jobcacher:378.v5e7c64638d63 jquery:1.12.4-1 jquery3-api:3.6.4-1 jsch:0.1.55.61.va_e9ee26616e7 junit:1189.v1b_e593637fa_e kubernetes:3909.v1f2c633e8590 kubernetes-client-api:6.4.1-215.v2ed17097a_8e9 kubernetes-credentials:0.10.0 ldap:671.v2a_9192a_7419d lockable-resources:1141.v7c5f8f31d2ee mailer:448.v5b_97805e3767 matrix-auth:3.1.6 matrix-project:785.v06b_7f47b_c631 metrics:4.2.13-420.vea_2f17932dd6 mina-sshd-api-common:2.9.2-62.v199162f0a_2f8 mina-sshd-api-core:2.9.2-62.v199162f0a_2f8 nunit:0.28 oauth-credentials:0.5 okhttp-api:4.10.0-132.v7a_7b_91cef39c pipeline-build-step:488.v8993df156e8d pipeline-graph-analysis:202.va_d268e64deb_3 pipeline-groovy-lib:629.vb_5627b_ee2104 pipeline-input-step:466.v6d0a_5df34f81 pipeline-milestone-step:111.v449306f708b_7 pipeline-model-api:2.2125.vddb_a_44a_d605e pipeline-model-definition:2.2125.vddb_a_44a_d605e pipeline-model-extensions:2.2125.vddb_a_44a_d605e pipeline-multibranch-defaults:2.1 pipeline-rest-api:2.32 pipeline-stage-step:305.ve96d0205c1c6 pipeline-stage-tags-metadata:2.2125.vddb_a_44a_d605e pipeline-stage-view:2.32 pipeline-utility-steps:2.15.1 plain-credentials:143.v1b_df8b_d3b_e48 plugin-util-api:3.2.0 popper-api:1.16.1-3 popper2-api:2.11.6-2 prism-api:1.29.0-4 pubsub-light:1.17 saml:4.385.v4dea_91565e9d scm-api:631.v9143df5b_e4a_a scoring-load-balancer:59.vf791549fa_989 script-security:1229.v4880b_b_e905a_6 sidebar-link:2.2.1 simple-theme-plugin:146.v0e67db_a_9052e snakeyaml-api:1.33-95.va_b_a_e3e47b_fa_4 sse-gateway:1.26 ssh-agent:327.v230ecd01f86f ssh-credentials:305.v8f4381501156 ssh-slaves:2.877.v365f5eb_a_b_eec sshd:3.275.v9e17c10f2571 structs:324.va_f5d6774f3a_d timestamper:1.24 token-macro:321.vd7cc1f2a_52c8 trilead-api:2.84.v72119de229b_7 variant:59.vf075fe829ccb versioncolumn:145.va_e3ca_f8a_a_d23 warnings-ng:10.1.0 workflow-aggregator:596.v8c21c963d92d workflow-api:1208.v0cc7c6e0da_9e workflow-basic-steps:1010.vf7a_b_98e847c1 workflow-cps:3653.v07ea_433c90b_4 workflow-durable-task-step:1241.v1a_63e465f943 workflow-job:1289.vd1c337fd5354 workflow-multibranch:733.v109046189126 workflow-scm-step:408.v7d5b_135a_b_d49 workflow-step-api:639.v6eca_cd8c04a_a_ workflow-support:839.v35e2736cfd5c ```

What Operating System are you using (both controller, and any agents involved in the problem)?

linux

Reproduction steps

  1. recordCoverage inside docker agent
    stage('post-test')  {
      agent {
        docker {
          label 'docker && linux'
          image 'ghcr.visualon.de/visualon/builder:3.2.9@sha256:f89b0eeb0da9c1546e02c841a02e6d07a8d3270b8de6134891e68c5d2d9e0362'
        }
      }
      steps {
        echo "Node: ${NODE_NAME}"
        unstash 'coverage-frontend'
        unstash 'coverage-backend'
        sh 'dotnet tool restore'
        sh 'dotnet reportgenerator -reporttypes:"TextSummary;Cobertura"'
        sh label: 'Coverage Summary', script: 'cat .coverage/Summary.txt'
        // pwsh 'scripts/fix-coverage.ps1 -path ./.coverage -filter Cobertura.xml'
        recordCoverage sourceCodeRetention: 'EVERY_BUILD', tools: [[parser: 'COBERTURA', pattern: '.coverage/Cobertura.xml']]
      }
    }

Expected Results

Just record coverage

Actual Results

Coverage recoder throws NullPointerException

07:12:42  [Pipeline] recordCoverage
07:12:43  [Cobertura] Recording coverage results
07:12:43  [Cobertura] Searching for all files in '/var/jenkins/workspace/xxx' that match the pattern '.coverage/Cobertura.xml'
07:12:43  [Cobertura] Traversing of symbolic links: disabled
07:12:43  [Cobertura] -> found 1 file
07:12:43  [Cobertura] Successfully parsed file '/var/jenkins/workspace/xxx/.coverage/Cobertura.xml'
07:12:43  [Cobertura] MODULE: 100.00% (1/1)
07:12:43  [Cobertura] PACKAGE: 85.71% (42/49)
07:12:43  [Cobertura] FILE: 74.77% (240/321)
07:12:43  [Cobertura] CLASS: 74.49% (257/345)
07:12:43  [Cobertura] METHOD: 50.37% (1352/2684)
07:12:43  [Cobertura] LINE: 47.97% (3398/7083)
07:12:43  [Cobertura] BRANCH: 13.37% (516/3858)
07:12:43  [Cobertura] COMPLEXITY: 955
07:12:43  [Cobertura] COMPLEXITY_MAXIMUM: 1
07:12:43  [Cobertura] COMPLEXITY_DENSITY: 955/7083
07:12:43  [Cobertura] LOC: 7083
07:12:43  [Cobertura] Successfully processed file '.coverage/Cobertura.xml'
07:12:43  The recommended git tool is: git
07:12:43  The recommended git tool is: git
07:12:44  [Pipeline] }
07:12:44  $ docker stop --time=1 1e74236efce1e4d12fba506586313077a14d15644785479ec14269164c7e49a3
07:12:44  $ docker rm -f --volumes 1e74236efce1e4d12fba506586313077a14d15644785479ec14269164c7e49a3
07:12:44  [Pipeline] // withDockerContainer
...
07:12:46  [Pipeline] End of Pipeline
07:12:46  java.lang.NullPointerException
07:12:46    at edu.hm.hafner.coverage.FileNode.getRelativePath(FileNode.java:534)
07:12:46    at edu.hm.hafner.coverage.FileNode.getFiles(FileNode.java:318)
07:12:46    at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
07:12:46    at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
07:12:46    at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
07:12:46    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
07:12:46    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
07:12:46    at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
07:12:46    at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source)
07:12:46    at edu.hm.hafner.coverage.Node.getFiles(Node.java:449)
07:12:46    at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
07:12:46    at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
07:12:46    at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
07:12:46    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
07:12:46    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
07:12:46    at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
07:12:46    at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source)
07:12:46    at edu.hm.hafner.coverage.Node.getFiles(Node.java:449)
07:12:46    at io.jenkins.plugins.coverage.metrics.steps.CodeDeltaCalculator.createOldPathMapping(CodeDeltaCalculator.java:158)
07:12:46    at io.jenkins.plugins.coverage.metrics.steps.CoverageReporter.createDeltaReports(CoverageReporter.java:158)
07:12:46    at io.jenkins.plugins.coverage.metrics.steps.CoverageReporter.lambda$publishAction$0(CoverageReporter.java:63)
07:12:46    at java.base/java.util.Optional.ifPresent(Unknown Source)
07:12:46    at io.jenkins.plugins.coverage.metrics.steps.CoverageReporter.publishAction(CoverageReporter.java:63)
07:12:46    at io.jenkins.plugins.coverage.metrics.steps.CoverageRecorder.perform(CoverageRecorder.java:407)
07:12:46    at io.jenkins.plugins.coverage.metrics.steps.CoverageRecorder.perform(CoverageRecorder.java:382)
07:12:46    at io.jenkins.plugins.coverage.metrics.steps.CoverageStep$Execution.run(CoverageStep.java:347)
07:12:46    at io.jenkins.plugins.coverage.metrics.steps.CoverageStep$Execution.run(CoverageStep.java:316)
07:12:46    at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
07:12:46    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
07:12:46    at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
07:12:46    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
07:12:46    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
07:12:46    at java.base/java.lang.Thread.run(Unknown Source)
...

07:12:47  Finished: FAILURE

Anything else?

No response

viceice commented 1 year ago

Looks like it's reading the exising coverage from previous build which is incompatible? Or there are some missing files which are not correctly validated?

uhafner commented 1 year ago

Yes, seems that I deleted the readResolve Method during my experiments with storing absolute paths as well 😠

viceice commented 1 year ago

will sourceCodeRetention: 'NEVER' be a workaround for now? so i have the report but no source painting?

uhafner commented 1 year ago

No, the problem occurs in the delta computation.

viceice commented 1 year ago

ok, thanks, when do you think an update is available? don't want to downgrade 🙈

uhafner commented 1 year ago

As you can see, the PR is already in work.

viceice commented 1 year ago

As you can see, the PR is already in work.

noticed ❤️

uhafner commented 1 year ago

https://github.com/jenkinsci/code-coverage-api-plugin/releases/tag/v4.2.1

viceice commented 1 year ago

seems to work again. ❤️🥳❤️