You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Disables invokedynamic bytecode generation for the legacy ([3.0, 8.3)) Gradle instrumentation to keep it compatible with Gradle versions older than 7.0.
Bumps the oldest gradle legacy test from 3.5 to 4.10 so that it is compatible with the project's TestKit and therefore executed (it was currently being skipped).
Motivation
#11436 bumped the project's Gradle version from 8.14.5 to 9.5.1. The Groovy version bundled with Gradle was also bumped, from 3.0 to 4.0. This version of Groovy now enables invokedynamic bytecode generation by default, instead of using the classic call-site caching mechanism used previously.
Parts of the legacy Gradle instrumentation are implemented in Groovy and compiled with the project's bundled Groovy compiler. After the bump, the dynamic calls in the code are emitted as invokedynamic instructions that bootstrap through org.codehaus.groovy.vmplugin.v8.IndyInterface.bootstrap(...), instead of the previous call-site dispatch via org.codehaus.groovy.runtime.callsite.CallSite.
These instrumentation classes are loaded into the user's Gradle daemon at runtime, so they have to link against the Groovy runtime bundled in that daemon's Gradle distribution, which can be much older than the Gradle/Groovy used to build the agent. vmplugin.v8.IndyInterface only exists from Groovy 3.0 onwards (in Groovy 2.x the equivalent class lived under vmplugin.v7). As a result, any build run with a Gradle distribution that bundles Groovy 2.x, Gradle 6.x and earlier (Gradle 7.0 was the first to bundle Groovy 3.0), cannot resolve the bootstrap method. The instrumentation classes fail to link, so CI Visibility never instruments the project's test tasks and no test events are produced.
Additional Notes
The failure was caught through the netflix-zuul and reactive-streams-jvm projects in the test-environment, as the "oldest version" smoke test was being skipped.
Add your completed PR to the merge queue by commenting /merge. You can also:
Customize the commit message associated with the merge with /merge --commit-message "..."
Remove your PR from the merge queue with /merge -c
Skip all merge queue checks with /merge -f --reason "reason"; please use this judiciously, as some checks do not run at the PR-level (note: the PR still needs to be mergeable, this will only skip the pre-merge build)
daniel-mohedano
changed the title
Disable invokedynamic compilation for legacy gradle instrumentation
Disable invokedynamic bytecode for legacy gradle instrumentation
Jun 10, 2026
daniel-mohedano
changed the title
Disable invokedynamic bytecode for legacy gradle instrumentation
Disable invokedynamic bytecode for legacy Gradle instrumentation
Jun 10, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What Does This Do
[3.0, 8.3)) Gradle instrumentation to keep it compatible with Gradle versions older than7.0.3.5to4.10so that it is compatible with the project's TestKit and therefore executed (it was currently being skipped).Motivation
#11436 bumped the project's Gradle version from
8.14.5to9.5.1. The Groovy version bundled with Gradle was also bumped, from3.0to4.0. This version of Groovy now enables invokedynamic bytecode generation by default, instead of using the classic call-site caching mechanism used previously.Parts of the legacy Gradle instrumentation are implemented in Groovy and compiled with the project's bundled Groovy compiler. After the bump, the dynamic calls in the code are emitted as invokedynamic instructions that bootstrap through
org.codehaus.groovy.vmplugin.v8.IndyInterface.bootstrap(...), instead of the previous call-site dispatch viaorg.codehaus.groovy.runtime.callsite.CallSite.These instrumentation classes are loaded into the user's Gradle daemon at runtime, so they have to link against the Groovy runtime bundled in that daemon's Gradle distribution, which can be much older than the Gradle/Groovy used to build the agent.
vmplugin.v8.IndyInterfaceonly exists from Groovy3.0onwards (in Groovy2.xthe equivalent class lived undervmplugin.v7). As a result, any build run with a Gradle distribution that bundles Groovy2.x, Gradle 6.x and earlier (Gradle 7.0 was the first to bundle Groovy 3.0), cannot resolve the bootstrap method. The instrumentation classes fail to link, so CI Visibility never instruments the project's test tasks and no test events are produced.Additional Notes
The failure was caught through the
netflix-zuulandreactive-streams-jvmprojects in the test-environment, as the "oldest version" smoke test was being skipped.Contributor Checklist
type:and (comp:orinst:) labels in addition to any other useful labelsclose,fix, or any linking keywords when referencing an issueUse
solvesinstead, and assign the PR milestone to the issue/merge. You can also:/merge --commit-message "..."/merge -c/merge -f --reason "reason"; please use this judiciously, as some checks do not run at the PR-level (note: the PR still needs to be mergeable, this will only skip the pre-merge build)Jira ticket: [PROJ-IDENT]