-
Type:
Bug
-
Resolution: Fixed
-
Priority:
Major
-
Component/s: performance-plugin
-
None
-
Environment:Jenkins v2.70
Performance Plugin v3.3-SNAPSHOT
Windows Server 2012
Oracle Java 1.8.0_66
When configuring the publisher in Expert Mode with a Relative Constraint with option "Compare with number of previous builds", the below exception is thrown, indicating that the PreviousResultsBlock fails to instantiate.
The cause seems to be a parameter name mismatch: The UI sends
      "previousResultsBlock": { "value": "true", "previousResultsString": "1" },
(as per radioBlocks in RelativeConstraint/config.jelly), where there is no matching getter/setter, but the binding is done instead via a matching constructor parameter
@DataBoundConstructor public PreviousResultsBlock(String value, String previousResultsString, String timeframeStartString, String timeframeEndString)
As a consequence, the actual value of PreviousResultsBlock.choicePreviousResults is never set, so that the Publisher always will select the builds by date range rather than number of previous builds.
Â
For reference:
The same problem is described here https://groups.google.com/forum/#!topic/jenkinsci-dev/o2uCY2HkEd8
And solutions are suggested here: http://jenkins-ci.361315.n4.nabble.com/Can-t-get-radioBlock-value-to-bind-to-constructor-td1748203.html
Snippet Generator full JSON payload:
{
   "sourceDataFiles": "test",
   "modePerformancePerTestCase": true,
   "modeThroughput": false,
   "graphType": "ART",
   "modeEvaluation": "true",
   "modeOfThreshold": "false",
   "failBuildIfNoResultFile": false,
   "errorUnstableThreshold": "-1",
   "errorFailedThreshold": "-1",
   "errorUnstableResponseTimeThreshold": "",
   "relativeUnstableThresholdNegative": "",
   "relativeUnstableThresholdPositive": "",
   "relativeFailedThresholdNegative": "",
   "relativeFailedThresholdPositive": "",
   "compareBuildPrevious": "false",
   "nthBuildNumber": "",
   "configType": "ART",
   "ignoreFailedBuilds": true,
   "ignoreUnstableBuilds": true,
   "persistConstraintLog": false,
   "constraints": {
      "relatedPerfReport": "test",
      "meteredValue": "AVERAGE",
      "operator": "NOT_GREATER",
      "tolerance": "12.34",
      "escalationLevel": "INFORMATION",
      "previousResultsBlock": {
         "value": "true",
         "previousResultsString": "1"
      },
      "stapler-class": "hudson.plugins.performance.constraints.RelativeConstraint",
      "kind": "hudson.plugins.performance.constraints.RelativeConstraint$DescriptorImpl"
   },
   "stapler-class": "hudson.plugins.performance.PerformancePublisher",
   "$class": "hudson.plugins.performance.PerformancePublisher"
}
Â
Â
Full stacktrace:
org.jenkinsci.plugins.structs.describable.DescribableParameter uncoerce WARNING: failed to uncoerce hudson.plugins.performance.constraints.blocks.PreviousResultsBlock@98d9298 java.lang.UnsupportedOperationException: no public field ‘value’ (or getter method) found in class hudson.plugins.performance.constraints.blocks.PreviousResultsBlock        at org.jenkinsci.plugins.structs.describable.DescribableParameter.getValue(DescribableParameter.java:161)        at org.jenkinsci.plugins.structs.describable.DescribableParameter.inspect(DescribableParameter.java:142)        at org.jenkinsci.plugins.structs.describable.DescribableModel.uninstantiate2(DescribableModel.java:532)        at org.jenkinsci.plugins.structs.describable.DescribableModel.uninstantiate2_(DescribableModel.java:622)        at org.jenkinsci.plugins.structs.describable.DescribableParameter.uncoerce(DescribableParameter.java:196)        at org.jenkinsci.plugins.structs.describable.DescribableParameter.inspect(DescribableParameter.java:142)        at org.jenkinsci.plugins.structs.describable.DescribableModel.uninstantiate2(DescribableModel.java:532)        at org.jenkinsci.plugins.structs.describable.DescribableModel.uninstantiate2_(DescribableModel.java:622)        at org.jenkinsci.plugins.structs.describable.DescribableParameter.uncoerce(DescribableParameter.java:196)        at org.jenkinsci.plugins.structs.describable.DescribableParameter.uncoerce(DescribableParameter.java:190)        at org.jenkinsci.plugins.structs.describable.DescribableParameter.inspect(DescribableParameter.java:142)        at org.jenkinsci.plugins.structs.describable.DescribableModel.uninstantiate2(DescribableModel.java:532)        at org.jenkinsci.plugins.structs.describable.DescribableModel.uninstantiate2_(DescribableModel.java:622)        at org.jenkinsci.plugins.structs.describable.DescribableParameter.uncoerce(DescribableParameter.java:196)        at org.jenkinsci.plugins.structs.describable.DescribableParameter.inspect(DescribableParameter.java:142)        at org.jenkinsci.plugins.structs.describable.DescribableModel.uninstantiate2(DescribableModel.java:532)        at org.jenkinsci.plugins.structs.describable.DescribableModel.uninstantiate2_(DescribableModel.java:622)        at org.jenkinsci.plugins.workflow.steps.StepDescriptor.uninstantiate(StepDescriptor.java:239)        at org.jenkinsci.plugins.workflow.cps.Snippetizer.object2Groovy(Snippetizer.java:124)        at org.jenkinsci.plugins.workflow.cps.Snippetizer.step2Groovy(Snippetizer.java:79)        at org.jenkinsci.plugins.workflow.cps.Snippetizer.doGenerateSnippet(Snippetizer.java:498)        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)        at java.lang.reflect.Method.invoke(Method.java:498)        at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:298)        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:746)        at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876)        at org.kohsuke.stapler.MetaClass$13.dispatch(MetaClass.java:411)        at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)        at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876)        at org.kohsuke.stapler.Stapler.invoke(Stapler.java:649)        at org.kohsuke.stapler.Stapler.service(Stapler.java:238)        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669)        at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:132)        at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:123)        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)        at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:49)        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)        at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76)        at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171)        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)        at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49)        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)        at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:81)        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)        at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:553)        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)        at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215)        at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110)        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)        at org.eclipse.jetty.server.Server.handle(Server.java:499)        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)        at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)        at java.lang.Thread.run(Thread.java:745)
Â
Â