Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-72317

Pipeline Snippet Generator does not work with step "recordCoverage: Record code coberage results" when logged user has permission to configure only jobs inside his project

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Minor Minor
    • coverage-plugin
    • None
    • coverage-plugin v1.3.0 / role-strategy-plugin v689.v731678c3e0eb_ / Jenkins v2.414.3 / Jenkins user with permission "Job>Configure" enabled on "Project roles" section but not on "Global roles" section

      When a Jenkins user (with permission "Job>Configure" enabled on "Project roles" section but not on "Global roles" section) select the step "recordCoverage: Record code coverage results" from a pipeline snippet generator page, the "Coverage Parser" drop-down list is empty: none of the 3 expected parsers (JaCoCo, Cobertura or PIT Mutation Testing) can therefore be selected.

      The warning below is displayed on Jenkins system log when the user still clic on the "Generate Pipeline Script" button.

      If the Jenkins user has the permission "Job>Configure" enabled on "Global roles" section (role-strategy-plugin), the drop-down list is populated with the 3 expected values and the "Generate Pipeline Script" button works as expected.

      But our Jenkins users should not be able to configure all jobs on the server. They should be able to configure only the jobs in their project (with permission "Job>Configure" enabled only on "Project roles" section).

      Would it be possible to fix this issue on coverage plugin, please?

      Full error log :

      nov. 13, 2023 1:17:20 PM WARNING org.eclipse.jetty.server.handler.ContextHandler$Context log
      Error while serving http://localhost:8082/pipeline-syntax/generateSnippet
      java.lang.IllegalArgumentException: No enum constant io.jenkins.plugins.coverage.metrics.steps.CoverageTool.Parser.
          at java.base/java.lang.Enum.valueOf(Enum.java:240)
          at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:823)
          at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:551)
          at org.kohsuke.stapler.RequestImpl.injectSetters(RequestImpl.java:938)
          at org.kohsuke.stapler.RequestImpl.instantiate(RequestImpl.java:883)
          at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:768)
      Caused: java.lang.IllegalArgumentException: Failed to instantiate class io.jenkins.plugins.coverage.metrics.steps.CoverageTool from {"parser":"","pattern":"**/jacoco.xml"}
          at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:771)
          at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:551)
          at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:546)
          at hudson.model.Descriptor.bindJSON(Descriptor.java:622)
          at hudson.model.Descriptor.newInstance(Descriptor.java:592)
      Caused: java.lang.LinkageError: Failed to instantiate class io.jenkins.plugins.coverage.metrics.steps.CoverageTool from {"parser":"","pattern":"**/jacoco.xml"}
          at hudson.model.Descriptor.newInstance(Descriptor.java:595)
          at hudson.model.Descriptor$NewInstanceBindInterceptor.onConvert(Descriptor.java:693)
          at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:696)
          at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:807)
          at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:551)
          at org.kohsuke.stapler.RequestImpl.injectSetters(RequestImpl.java:938)
          at org.kohsuke.stapler.RequestImpl.instantiate(RequestImpl.java:883)
          at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:768)
          at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:551)
          at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:546)
          at hudson.model.Descriptor.bindJSON(Descriptor.java:622)
          at hudson.model.Descriptor.newInstance(Descriptor.java:592)
          at org.jenkinsci.plugins.workflow.cps.Snippetizer.doGenerateSnippet(Snippetizer.java:498)
          at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:710)
          at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:397)
      Caused: java.lang.reflect.InvocationTargetException
          at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:401)
          at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:409)
          at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:207)
          at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:140)
          at org.kohsuke.stapler.MetaClass$11.doDispatch(MetaClass.java:558)
          at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:59)
          at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:770)
          at org.kohsuke.stapler.Stapler.invoke(Stapler.java:900)
          at org.kohsuke.stapler.MetaClass$9.dispatch(MetaClass.java:475)
          at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:770)
          at org.kohsuke.stapler.Stapler.invoke(Stapler.java:900)
          at org.kohsuke.stapler.Stapler.invoke(Stapler.java:698)
          at org.kohsuke.stapler.Stapler.service(Stapler.java:248)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:590)
          at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764)
          at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1665)
          at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:163)
          at hudson.plugins.audit_trail.AuditTrailFilter.doFilter(AuditTrailFilter.java:88)
          at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:160)
          at io.jenkins.plugins.audit.filter.RequestContextFilter.doFilter(RequestContextFilter.java:52)
          at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:160)
          at jenkins.metrics.impl.MetricsFilter.doFilter(MetricsFilter.java:125)
          at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:160)
          at jenkins.util.HttpServletFilter$1.doFilter(HttpServletFilter.java:76)
          at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:160)
          at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:166)
          at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202)
          at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635)
          at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:154)
          at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202)
          at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635)
          at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:94)
          at jenkins.security.AcegiSecurityExceptionFilter.doFilter(AcegiSecurityExceptionFilter.java:52)
          at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99)
          at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:54)
          at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99)
          at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126)
          at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120)
          at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99)
          at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
          at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99)
          at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:110)
          at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:101)
          at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99)
          at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:227)
          at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:221)
          at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99)
          at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:97)
          at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99)
          at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:117)
          at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
          at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:63)
          at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99)
          at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:111)
          at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:172)
          at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202)
          at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635)
          at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:53)
          at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202)
          at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635)
          at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:86)
          at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202)
          at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635)
          at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)
          at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202)
          at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635)
          at jenkins.security.SuspiciousRequestFilter.doFilter(SuspiciousRequestFilter.java:38)
          at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202)
          at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635)
          at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:527)
          at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:131)
          at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:569)
          at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
          at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:223)
          at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1570)
          at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
          at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1384)
          at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176)
          at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:484)
          at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1543)
          at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174)
          at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1306)
          at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129)
          at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
          at org.eclipse.jetty.server.Server.handle(Server.java:563)
          at org.eclipse.jetty.server.HttpChannel$RequestDispatchable.dispatch(HttpChannel.java:1598)
          at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:753)
          at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:501)
          at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:287)
          at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:314)
          at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100)
          at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
          at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:421)
          at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:390)
          at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:277)
          at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:199)
          at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:411)
          at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:969)
          at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1194)
          at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1149)
          at java.base/java.lang.Thread.run(Thread.java:829)

          [JENKINS-72317] Pipeline Snippet Generator does not work with step "recordCoverage: Record code coberage results" when logged user has permission to configure only jobs inside his project

          Ulli Hafner added a comment -

          Thanks for reporting, it seems that the fix https://github.com/jenkinsci/code-coverage-api-plugin/pull/771 covers not all occurrences.

          Ulli Hafner added a comment - Thanks for reporting, it seems that the fix https://github.com/jenkinsci/code-coverage-api-plugin/pull/771 covers not all occurrences.

          Markus Winter added a comment -

          The problem is that

           public ListBoxModel doFillParserItems(@AncestorInPath final AbstractProject<?, ?> project) {
                      if (JENKINS.hasPermission(Item.CONFIGURE, project)) {

          can't resolve <project> in the context of a pipeline job.

          My guess is that this should work.

           public ListBoxModel doFillParserItems(@AncestorInPath final Job<?, ?> project) {
                      if (JENKINS.hasPermission(Item.CONFIGURE, project)) {

          Other places are affected as well, e.g. in CoverageStep all the doFill and doCheck methods

          Markus Winter added a comment - The problem is that   public ListBoxModel doFillParserItems(@AncestorInPath final AbstractProject<?, ?> project) {             if (JENKINS.hasPermission(Item.CONFIGURE, project)) { can't resolve <project> in the context of a pipeline job. My guess is that this should work.   public ListBoxModel doFillParserItems(@AncestorInPath final Job<?, ?> project) {             if (JENKINS.hasPermission(Item.CONFIGURE, project)) { Other places are affected as well, e.g. in CoverageStep all the doFill and doCheck methods

            drulli Ulli Hafner
            eraimbau Eric RAIMBAULT
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: