Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CpsFlowExecution: parseScript(): log "Method Too Large" situations more readably #817

Open
wants to merge 44 commits into
base: master
Choose a base branch
from

Conversation

jimklimov
Copy link

@jimklimov jimklimov commented Nov 23, 2023

A small almost-cosmetic change which makes life easier for my colleagues when they develop (and debug failures of) Jenkins scripted pipelines.

UPDATE: Grew to be not so small, so evicted into a method of its own to constrain changes to other parts of the codebase. Learned a few more tricks over time, as new MTL situations were found in the field.

@jimklimov jimklimov requested a review from a team as a code owner November 23, 2023 08:35
@bitwiseman
Copy link
Contributor

Out of curiosity, what output does this give you and how is it helpful?

jimklimov and others added 5 commits December 11, 2023 21:55
…to avoid catching by full name

Signed-off-by: Jim Klimov <[email protected]>
…argeExceptionRealistic() tests

Signed-off-by: Jim Klimov <[email protected]>
…sException as a carrier of MethodTooLargeException; re-throw with just a compact message to appear in the build log

Signed-off-by: Jim Klimov <[email protected]>
@jimklimov
Copy link
Author

jimklimov commented Mar 5, 2024

Tests helped me realize that the catch block was a bit naive; the groovy parser returns a special exception class with a collection of errors, one of which (okay, the only one) is the Method Too Large one.

PR updated with handling of both eventualities, and if the only exception in view is the MTL - re-throw with a short message avoiding a wall of text in pipeline log. From self-test console (showing both server log id=... and pipeline log test0), it now complains much more readably, like this:

   6.903 [test0 #1] Started
   7.635 [id=99]	SEVERE	o.j.p.w.cps.CpsFlowExecution#parseScript: FAILED to parse WorkflowScript (the pipeline script) due to MethodTooLargeException: Method too large: WorkflowScript.___cps___1 ()Lcom/cloudbees/groovy/cps/impl/CpsFunction;
   7.680 [test0 #1] java.lang.RuntimeException: FAILED to parse WorkflowScript (the pipeline script) due to MethodTooLargeException: Method too large: WorkflowScript.___cps___1 ()Lcom/cloudbees/groovy/cps/impl/CpsFunction;
   7.680 [test0 #1] 	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:697)
   7.680 [test0 #1] 	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:586)
   7.681 [test0 #1] 	at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:335)
   7.681 [test0 #1] 	at hudson.model.ResourceController.execute(ResourceController.java:101)
   7.681 [test0 #1] 	at hudson.model.Executor.run(Executor.java:442)
   7.700 [test0 #1] Finished: FAILURE
   7.718 [id=27]	INFO	hudson.lifecycle.Lifecycle#onStatusUpdate: Stopping Jenkins
   7.766 [id=27]	INFO	hudson.lifecycle.Lifecycle#onStatusUpdate: Jenkins stopped

Still got a bit of stack trace from generic handling, but it is reasonably short - the ultimate pipeline devs won't have to scroll up a couple of screenfuls just to learn that their script was too long or complex.

Now that the message is visible to end users, I am open to suggestions how to make it more actionable, and/or if the RuntimeException is the right re-throw wrapper, and of course which color should the bike shed be (or this can all be part of another PR) :D

e.g. to explain about script length or its coding complexity and what to do about it (nesting, amount of stages, separation of methods into JSL classes, etc.); maybe point to a knowledge-base URL for a better maintainable article on the subject (don't want to replace one wall of text in the logs with another, right?)

@jglick jglick requested a review from a team March 5, 2024 12:22
…unt to satisfy different CI platforms

Signed-off-by: Jim Klimov <[email protected]>
…uggestions for pipeline devs

Signed-off-by: Jim Klimov <[email protected]>
@jimklimov
Copy link
Author

jimklimov commented Mar 5, 2024

Out of curiosity, what output does this give you and how is it helpful?

Until today, it was helpful to myself and a few colleagues who may/can/do follow traces of the Jenkins server logs when developing pipelines (testing in private Jenkins instances and those wrapped by IDEs notwithstanding).

After the review comments some months ago (thanks, and sorry for not noticing) and a coding effort today, this should be better visible and more "actionable" to a more general population - now shown as a smaller wall of text right in the pipeline build logs:

   5.380 [test0 #1] Started
   5.975 [test0 #1] java.lang.RuntimeException: FAILED to parse WorkflowScript
       (the pipeline script) due to MethodTooLargeException; please refactor to
       simplify code structure and/or move logic to a Jenkins Shared Library:
       Method too large: WorkflowScript.___cps___1 ()Lcom/cloudbees/groovy/cps/impl/CpsFunction;
   5.975 [test0 #1] 	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:703)
   5.975 [test0 #1] 	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:584)
   5.975 [test0 #1] 	at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:335)
   5.975 [test0 #1] 	at hudson.model.ResourceController.execute(ResourceController.java:101)
   5.975 [test0 #1] 	at hudson.model.Executor.run(Executor.java:442)
   6.011 [test0 #1] Finished: FAILURE

...which is IMHO a bit more comprehensible than the original (especially the first time you see it):

...
 > git checkout -f c391f78bf7ac0d4afffab4f312a3d81cc41577d1 # timeout=10
Commit message: "..."
 > git rev-list --no-walk c391f78bf7ac0d4afffab4f312a3d81cc41577d1 # timeout=10
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during class generation: Method too large: WorkflowScript.___cps___20692 ()Lcom/cloudbees/groovy/cps/impl/CpsFunction;

groovyjarjarasm.asm.MethodTooLargeException: Method too large: WorkflowScript.___cps___20692 ()Lcom/cloudbees/groovy/cps/impl/CpsFunction;
        at groovyjarjarasm.asm.MethodWriter.computeMethodInfoSize(MethodWriter.java:2087)
        at groovyjarjarasm.asm.ClassWriter.toByteArray(ClassWriter.java:447)
        at org.codehaus.groovy.control.CompilationUnit$17.call(CompilationUnit.java:850)
        at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1087)
        at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:624)
        at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:602)
        at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:579)
        at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:323)
        at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:293)
        at groovy.lang.GroovyShell.parseClass(GroovyShell.java:677)
        at groovy.lang.GroovyShell.parse(GroovyShell.java:689)
        at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:142)
        at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:127)
        at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:554)
        at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:506)
        at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:335)
        at hudson.model.ResourceController.execute(ResourceController.java:101)
        at hudson.model.Executor.run(Executor.java:442)

1 error

        at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:309)
        at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1107)
        at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:624)
        at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:602)
        at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:579)
        at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:323)
        at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:293)
        at groovy.lang.GroovyShell.parseClass(GroovyShell.java:677)
        at groovy.lang.GroovyShell.parse(GroovyShell.java:689)
        at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:142)
        at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:127)
        at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:554)
        at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:506)
        at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:335)
        at hudson.model.ResourceController.execute(ResourceController.java:101)
        at hudson.model.Executor.run(Executor.java:442)
Finished: FAILURE

...and requires less scrolling to get to the crux of the issue =D

jimklimov and others added 2 commits March 5, 2024 15:52
…ethods (class complexity) from maxTryCatch (nesting depth)

Signed-off-by: Jim Klimov <[email protected]>
Copy link
Member

@jglick jglick left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The logic here is pretty convoluted and seems excessive when we do not really need to make things particularly pretty, we just need to offer some clue beyond what there is today. Would suffice to do something along the lines of

if (Functions.printThrowable(x).containsString("MethodTooLargeException")) {
    throw new IllegalArgumentException("…your hint here…", x);
} else {
    throw x;
}

Comment on lines 640 to 642
} catch (RuntimeException | Error x) {
} catch (Exception x) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This loses handling of Error, especially LinkageError.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I had some troubles compiling catch (Exception | Error x), or just IDE warnings, can try.

Copy link
Author

@jimklimov jimklimov Jun 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, it was an IDEA misconfiguration that had too old a "Language level" (claimed "5") set to support multi-catches.

FWIW, IDEA-generated update to the recipe (not committed here) is:

diff --git a/plugin/pom.xml b/plugin/pom.xml
index 71404738..1d44a5bb 100644
--- a/plugin/pom.xml
+++ b/plugin/pom.xml
@@ -286,6 +286,14 @@
                     <compatibleSinceVersion>2.18</compatibleSinceVersion>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>7</source>
+                    <target>7</target>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
(1/1) Stage this hunk [y,n,q,a,d,e,p,?]? n

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code updated to restore these Throwable descendant types.

jimklimov and others added 2 commits June 11, 2024 08:57
…wExecution.java


Do not log to server console log (not all server admins are those who run the projects with issues).

Co-authored-by: Jesse Glick <[email protected]>
Comment on lines 690 to 701
if (ecCount > 1) {
// Not squashing with explicit MethodTooLargeException
// re-thrown below, in this codepath we have other errors.
throw new RuntimeException(msg, x);
} else {
// Do not confuse pipeline devs by a wall of text in the
// build console, but let the full context be found in
// server log with some dedication.
LOGGER.log(Level.FINE, mtlEx.getMessage());
//throw new RuntimeException(msg, mtlEx);
throw new RuntimeException(msg);
}
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regarding the concern of "pretty convoluted logic" - this block is largely why I did it so: groovy can return a MultipleCompilationErrorsException with an attached collection of one or more errors (broadly speaking), so we need to count if we only had the MethodTooLargeException one way or another here (and then print the pretty log), or also something else and then better print everything for human devs to sift through it diligently.

@jimklimov
Copy link
Author

Sorry it took a while to notice that there was finally a new review here - too many browser tabs open to keep track of such :D

Thanks for doing it!

@jimklimov
Copy link
Author

jimklimov commented Jun 17, 2024

Hm, got another use-case to handle: managed to get a step definition too large (aka "global variable", anyhow in JSL as vars/cloudBranch.groovy)!

So the pipeline chugged along until it called that step - and that's where the job crashed, with a different exception:

[Pipeline] End of Pipeline
Also:   org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: a1490d3b-63d7-4555-ae55-3a0d6856aee6
org.jenkinsci.plugins.workflow.cps.CpsCompilationErrorsException: startup failed:
General error during class generation: Method too large: cloudBranch.___cps___586328 ()Lcom/cloudbees/groovy/cps/impl/CpsFunction;

groovyjarjarasm.asm.MethodTooLargeException: Method too large: cloudBranch.___cps___586328 ()Lcom/cloudbees/groovy/cps/impl/CpsFunction;
	at groovyjarjarasm.asm.MethodWriter.computeMethodInfoSize(MethodWriter.java:2087)
	at groovyjarjarasm.asm.ClassWriter.toByteArray(ClassWriter.java:447)
	at org.codehaus.groovy.control.CompilationUnit$17.call(CompilationUnit.java:850)
	at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1087)
...
<no further pointers to the class in question>
...
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base/java.lang.Thread.run(Thread.java:1583)

1 error

	at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:309)
	at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1107)
	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:624)
	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:602)
	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:579)
	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:323)
...
	at org.jenkinsci.plugins.workflow.cps.LoggingInvoker.getProperty(LoggingInvoker.java:121)
	at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
	at WorkflowScript.run(WorkflowScript:428)
	at com.cloudbees.groovy.cps.CpsDefaultGroovyMethods.each(CpsDefaultGroovyMethods:2125)
	at com.cloudbees.groovy.cps.CpsDefaultGroovyMethods.each(CpsDefaultGroovyMethods:2110)
	at com.cloudbees.groovy.cps.CpsDefaultGroovyMethods.each(CpsDefaultGroovyMethods:2163)
	at WorkflowScript.run(WorkflowScript:385)
	at ___cps.transform___(Native Method)
	at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.get(PropertyishBlock.java:73)
	at com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30)
	at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.fixName(PropertyishBlock.java:65)
...
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base/java.lang.Thread.run(Thread.java:1583)
Finished: FAILURE

Note there are actually two lines at WorkflowScript.run(WorkflowScript:NNN), pipeline code at line 385 starts an ...each {} closure to iterate several repos this job processes, and the line 428 actually calls the cloudBranch() method.

Gotta look into the structure of CpsCompilationErrorsException to see how to best parse it here (and know if "method too large" was the only error, so the report can be trimmed), and also consider that not only WorkflowScript can have such troubles.

jimklimov and others added 2 commits June 24, 2024 18:00
Notably, the latter is a Throwable but not an Exception so e.g. LinkageError might be not handled.

Signed-off-by: Jim Klimov <[email protected]>
@jimklimov
Copy link
Author

jimklimov commented Jun 26, 2024

Posted the updated code to recognize the newly seen exception from Method Too Large in a JSL. I'll be testing a build with this on servers I manage, to get some first-hand feedback.

A few things of note are:

  • we try to detect the problematic step/class name (if not WorkflowScript) and make less assumption that specifically the pipeline script code is too large
  • newly emitted stack trace (to be seen in build log) should include a trail through *.groovy source files+line numbers, if present (assuming JSL)
  • logging into server log only goes as FINE(R) so should not be a problem by default (but developers figuring out the issue with a private Jenkins instance can drill into full gory details on demand)

…lass) for MethodTooLargeException handling

And re-word logging (impacted class name, possible excerpts from trace).
Not only WorkflowScript (pipeline) suffers from this, see examples
in jenkinsci#817

Signed-off-by: Jim Klimov <[email protected]>
@jimklimov
Copy link
Author

Heh, the code path which leads to MTL stack trace for steps/classes from JSL apparently lands into a different method's try/catch. Reworking the plugin change for the not-WorkflowScript case, although currently inclined to make this handling a method to just call from several places.

@jimklimov
Copy link
Author

Figured it out locally, preparing refactored PR contents as a meaningful series of commits :)

jimklimov added 19 commits June 28, 2024 10:42
…c from parseScript() into a method of its own

I first wanted it to just throw the exceptions, but IDEA was upset that
we might return from the catch block and then use the uninitialized "s"
variable. So this new method returns the entity which we clearly throw
from the catch block.

Signed-off-by: Jim Klimov <[email protected]>
…ectedMethodTooLarge()" as too generic

Curiously, before this PR jenkinsci#817 it had no qualms to "throw x"
which could be a RuntimeException or Error, and the method
itself only declares that it "throws IOException" which is
neither. Even now explicitly-cast rethrows seem acceptable :\

Signed-off-by: Jim Klimov <[email protected]>
…hodTooLarge(x)

Some loaded properties are in fact calls to resolve code from a
Jenkins Shared Library (steps aka global variables, or directly
class methods if using script{} blocks and not just declarative).
First accesses to such code cause CPS, compilation and possible
failure with a MethodTooLargeException (maybe hidden in another
Throwable) which we also want pretty-printed to be actionable
for a pipeline developer.

Signed-off-by: Jim Klimov <[email protected]>
…fter refactoring out of earlier codebase

Also avoid the final if/else to have a clear final code path

Signed-off-by: Jim Klimov <[email protected]>
…rt exception with a curated message to go into job log, chop off the stack trace leading to the reporter

Signed-off-by: Jim Klimov <[email protected]>
…clude x.getMessage(), a copy is already there

Signed-off-by: Jim Klimov <[email protected]>
…ationErrorsException.getMessage() is too long with all the original stack trace

Introduce an xMsgStart with curated start of original Throwable's
message (until the first "\tat somewhere(file:line)" match).

Signed-off-by: Jim Klimov <[email protected]>
…ee in pretty-printed overflowedClassName

Signed-off-by: Jim Klimov <[email protected]>
…SNAME_PATTERN and CLASSNAME_MENTIONS_PATTERN expectations/assumptions in code

Signed-off-by: Jim Klimov <[email protected]>
…e may have slashes for class or not for step

Signed-off-by: Jim Klimov <[email protected]>
…ine scripts named like "Script<NUM>"

Signed-off-by: Jim Klimov <[email protected]>
…excerpts into snip-markers to separate visibly

Signed-off-by: Jim Klimov <[email protected]>
…dClassNameBreadcrumbs as a StringBuilder

Signed-off-by: Jim Klimov <[email protected]>
…verflowedClassName for overflowedClassNameBreadcrumbs

Signed-off-by: Jim Klimov <[email protected]>
…excerpts - only add a newline before final wrapper if not present in wrapped text

Signed-off-by: Jim Klimov <[email protected]>
…eraction" with ContinuationGroup.fixupStackTrace()

Signed-off-by: Jim Klimov <[email protected]>
…x in the end, use a dedicated "RuntimeException rtex" object

Signed-off-by: Jim Klimov <[email protected]>
@jimklimov
Copy link
Author

jimklimov commented Jun 28, 2024

Updated screenshots, now with some detail learned about MTL issues happening in the JSL also:

  • Pipeline script too large:
...
Executing git in workdir C:\Users\klimov\.jenkins\workspace\test-MethodTooLarge@libs\3fbaa4c2a74a618783608223aa05bcd2484d251d9f183ec393764a9458686f38
java.lang.RuntimeException: FAILED to parse WorkflowScript (the pipeline script) due to MethodTooLargeException; please refactor to simplify code structure and/or move logic to a Jenkins Shared Library:
-----
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during class generation: Method too large: WorkflowScript.___cps___5112 ()Lcom/cloudbees/groovy/cps/impl/CpsFunction;
groovyjarjarasm.asm.MethodTooLargeException: Method too large: WorkflowScript.___cps___5112 ()Lcom/cloudbees/groovy/cps/impl/CpsFunction;
-----

Complete details can be seen in server log at FINE/FINER level (Jenkins admin access for org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.MethodTooLargeLogging is required)
Finished: FAILURE
  • JSL step:
...
[Pipeline] End of Pipeline
Also:   org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: e5f57f7d-1081-49cf-a579-0644086eead0
java.lang.RuntimeException: FAILED to parse presumed JSL step 'cloudBranch' due to MethodTooLargeException; please refactor to simplify code structure:
-----
org.jenkinsci.plugins.workflow.cps.CpsCompilationErrorsException: startup failed:
General error during class generation: Method too large: cloudBranch.___cps___1028 ()Lcom/cloudbees/groovy/cps/impl/CpsFunction;
groovyjarjarasm.asm.MethodTooLargeException: Method too large: cloudBranch.___cps___1028 ()Lcom/cloudbees/groovy/cps/impl/CpsFunction;
-----

Complete details can be seen in server log at FINE/FINER level (Jenkins admin access for org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.MethodTooLargeLogging is required)
Finished: FAILURE
  • JSL class:
...
[Pipeline] End of Pipeline
Also:   org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: 9338d5ab-bd20-4f09-b81a-2d13b2eaf911
java.lang.RuntimeException: FAILED to parse presumed JSL class 'com/myprovys/ci/BranchResync' due to MethodTooLargeException; please refactor to simplify code structure:
-----
org.jenkinsci.plugins.workflow.cps.CpsCompilationErrorsException: startup failed:
General error during class generation: Method too large: com/myprovys/ci/BranchResync.___cps___2123 ()Lcom/cloudbees/groovy/cps/impl/CpsFunction;
groovyjarjarasm.asm.MethodTooLargeException: Method too large: com/myprovys/ci/BranchResync.___cps___2123 ()Lcom/cloudbees/groovy/cps/impl/CpsFunction;
-----

Complete details can be seen in server log at FINE/FINER level (Jenkins admin access for org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.MethodTooLargeLogging is required)
Finished: FAILURE

Notably, code was made to trace the messages I've seen (and posted earlier above) with "bread-crumbs" to see the code path through the pipeline script and groovy (JSL) files and line numbers (for steps/classes with code too large), only to discover this is slapped on later via ContinuationGroup.fixupStackTrace() called from PropertyishBlock.ContinuationImpl.get() :\

Probably some refactoring can be due to take advantage of that bit. At least, the groovy-cps code is now in the same plugin.

@jglick jglick requested a review from a team July 5, 2024 22:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants