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

Workflow plugin not working with with Gerrit event

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Major Major
    • gerrit-trigger-plugin
    • Jenkins version : 1.580.1
      OS: RHEL-7
      Web Browser: Firefox
      Java Version:
      java version "1.7.0_71"
      OpenJDK Runtime Environment (rhel-2.5.3.1.el7_0-x86_64 u71-b14)
      OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)

      Each time when I try to add Gerrit Event for a workflow job it's throw below error when try to save or apply it.


      Stack trace

      javax.servlet.ServletException: java.lang.ClassCastException: org.jenkinsci.plugins.workflow.job.WorkflowJob cannot be cast to hudson.model.AbstractProject
      at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:795)
      at org.kohsuke.stapler.Stapler.invoke(Stapler.java:875)
      at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249)
      at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
      at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:745)
      at org.kohsuke.stapler.Stapler.invoke(Stapler.java:875)
      at org.kohsuke.stapler.Stapler.invoke(Stapler.java:648)
      at org.kohsuke.stapler.Stapler.service(Stapler.java:237)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
      at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:686)
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1494)
      at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:96)
      at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:88)
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
      at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:48)
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
      at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)
      at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76)
      at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:164)
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
      at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:46)
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
      at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:81)
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1474)
      at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)
      at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
      at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)
      at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
      at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
      at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
      at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
      at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
      at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
      at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
      at org.eclipse.jetty.server.Server.handle(Server.java:370)
      at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)
      at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:960)
      at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1021)
      at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
      at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
      at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
      at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:668)
      at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
      at winstone.BoundedExecutorService$1.run(BoundedExecutorService.java:77)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
      at java.lang.Thread.run(Thread.java:745)
      Caused by: java.lang.ClassCastException: org.jenkinsci.plugins.workflow.job.WorkflowJob cannot be cast to hudson.model.AbstractProject
      at com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger.start(GerritTrigger.java:124)
      at org.jenkinsci.plugins.workflow.job.WorkflowJob.submit(WorkflowJob.java:168)
      at hudson.model.Job.doConfigSubmit(Job.java:1172)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:606)
      at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:298)
      at org.kohsuke.stapler.interceptor.RequirePOST$Processor.invoke(RequirePOST.java:46)
      at org.kohsuke.stapler.Function$InterceptedFunction.invoke(Function.java:399)
      at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:161)
      at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:96)
      at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:121)
      at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
      at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:745)
      ... 46 more

          [JENKINS-26010] Workflow plugin not working with with Gerrit event

          Praveen Kumar created issue -

          Jesse Glick added a comment -

          The problem is in the Gerrit Trigger plugin, which needs to be a Trigger<ParameterizedJobMixIn.ParameterizedJob> rather than a Trigger<AbstractProject>. And DescriptorImpl.isApplicable has to actually check the type!

          Jesse Glick added a comment - The problem is in the Gerrit Trigger plugin, which needs to be a Trigger<ParameterizedJobMixIn.ParameterizedJob> rather than a Trigger<AbstractProject> . And DescriptorImpl.isApplicable has to actually check the type!
          Jesse Glick made changes -
          Component/s New: gerrit-trigger-plugin [ 15731 ]
          Component/s Original: workflow-plugin [ 18820 ]
          Labels New: workflow
          Jesse Glick made changes -
          Assignee Original: Jesse Glick [ jglick ] New: rsandell [ rsandell ]

          rsandell added a comment -

          The Gerrit Trigger code is littered with assumptions about AbstractProject to reliably "just change the type" without doing an aggressive search replace and fix issues as they arise.

          rsandell added a comment - The Gerrit Trigger code is littered with assumptions about AbstractProject to reliably "just change the type" without doing an aggressive search replace and fix issues as they arise.

          rin_ne added a comment -

          ParameterizedJobMixIn.ParameterizedJob cannot be built since it is not BuildableItem. GT has trigger feature in order to schedule build for its job. So I think it is no reason why GT treats non-buildable job.

          Should we fix isApplicable() only?

          rin_ne added a comment - ParameterizedJobMixIn.ParameterizedJob cannot be built since it is not BuildableItem. GT has trigger feature in order to schedule build for its job. So I think it is no reason why GT treats non-buildable job. Should we fix isApplicable() only?

          Jesse Glick added a comment -

          ParameterizedJobMixIn.ParameterizedJob cannot be built since it is not BuildableItem.

          BuildableItem is in practice a pretty useless interface, since scheduleBuild does not give you much control. ParameterizedJobMixIn.schedule2 gives you more. Or in many cases it suffices to check for an instance of Queue.Task and call Queue.schedule directly (you do not pick up per-job quietPeriod settings this way, which may or may not matter).

          Jesse Glick added a comment - ParameterizedJobMixIn.ParameterizedJob cannot be built since it is not BuildableItem . BuildableItem is in practice a pretty useless interface, since scheduleBuild does not give you much control. ParameterizedJobMixIn.schedule2 gives you more. Or in many cases it suffices to check for an instance of Queue.Task and call Queue.schedule directly (you do not pick up per-job quietPeriod settings this way, which may or may not matter).

          Jacob Keller added a comment -

          What would it take to fix this?

          Jacob Keller added a comment - What would it take to fix this?

          Jesse Glick added a comment -

          Some work. TBD how much.

          Jesse Glick added a comment - Some work. TBD how much.

          Jacob Keller added a comment -

          Any chance someone could help step me through issues? I use this plugin today, and would like to move to workflows, but obviously can't easily do that until GerritTrigger is updated.

          I'm willing to attempt to help make this change, but I don't know if I have enough knowledge.

          The primary assumption being made seems to be that GerritTrigger just assumes everything is an AbstractProject. However, just swapping to ParameterizedJobMixIn.ParameterizedJob doesn't seem to work directly, as Gerrit Trigger uses .addTrigger() and .getTrigger() which are not part of the interface.

          I think we can implement .getTrigger() in terms of .getTriggers() from the interface, but .addTrigger() appears to have no equivalent.. I am not sure exactly how we'd fix this. I don't know how triggers work for workflows, though I assume they'd be similar to regular projects?

          Is it possible to add triggers to the .getTriggers() Map returned by the interface?

          Jacob Keller added a comment - Any chance someone could help step me through issues? I use this plugin today, and would like to move to workflows, but obviously can't easily do that until GerritTrigger is updated. I'm willing to attempt to help make this change, but I don't know if I have enough knowledge. The primary assumption being made seems to be that GerritTrigger just assumes everything is an AbstractProject. However, just swapping to ParameterizedJobMixIn.ParameterizedJob doesn't seem to work directly, as Gerrit Trigger uses .addTrigger() and .getTrigger() which are not part of the interface. I think we can implement .getTrigger() in terms of .getTriggers() from the interface, but .addTrigger() appears to have no equivalent.. I am not sure exactly how we'd fix this. I don't know how triggers work for workflows, though I assume they'd be similar to regular projects? Is it possible to add triggers to the .getTriggers() Map returned by the interface?

            tfennelly Tom FENNELLY
            kumarpraveen Praveen Kumar
            Votes:
            3 Vote for this issue
            Watchers:
            10 Start watching this issue

              Created:
              Updated:
              Resolved: