Skip to content

Revert "Upgrade ARG default values used in Docker FROM instructions" - #1215

Merged
timtebeek merged 1 commit into
mainfrom
tim/revert-docker-arg-defaults
Aug 22, 2026
Merged

Revert "Upgrade ARG default values used in Docker FROM instructions"#1215
timtebeek merged 1 commit into
mainfrom
tim/revert-docker-arg-defaults

Conversation

@timtebeek

@timtebeek timtebeek commented Aug 22, 2026

Copy link
Copy Markdown
Member

Why

Symbol Added in Landed

The last rewrite release is v8.90.3 (2026-08-20), so both miss it by a day.

That would normally sort itself out at release time, except the Moderne CLI loads the LST classes in its own classloader — a recipe runs against the rewrite-docker the CLI bundles, not the one this artifact resolves. CLI 4.6.3 bundles rewrite-docker 8.90.3, and javap against that jar shows Docker.Argument exposing only getContents(), with no ImageName class at all:

public java.util.List<Docker$ArgumentContent> getContents();
public Docker$Argument withContents(java.util.List<Docker$ArgumentContent>);

visitFile reads a global ARG through getText(), and visitFrom opens with hasEnvironmentVariables(), so the first FROM of every Dockerfile raises NoSuchMethodError. TreeVisitor.visit catches it as a RecipeRunException, so it lands as error markup on every Dockerfile of every UpgradeToJava* run rather than a hard failure — noisy in exactly the place the recipe is meant to help.

Why now

Follow up

…ns (#1213)"

This reverts commit d33eca3.

The recipe reached for rewrite-docker API that no released version of rewrite
carries yet. `Docker.Argument.getText()`, `getTextWithVariables()` and
`hasEnvironmentVariables()` arrived in openrewrite/rewrite#8576, and
`org.openrewrite.docker.trait.ImageName` in openrewrite/rewrite#8599, both
landed 2026-08-21, one day after v8.90.3.

The Moderne CLI loads the LST classes in its own classloader, so a recipe runs
against the rewrite-docker the CLI bundles rather than the one this artifact
resolves. CLI 4.6.3 bundles rewrite-docker 8.90.3, where `Docker.Argument`
exposes only `getContents()` and `ImageName` does not exist. `visitFile` reads
a global `ARG` through `getText()` and `visitFrom` opens with
`hasEnvironmentVariables()`, so the first `FROM` of every Dockerfile would
raise `NoSuchMethodError`, surfacing as error markup on every Dockerfile of
every `UpgradeToJava*` run.

Nothing is lost by waiting: v3.42.1 predates this commit, so the breakage has
not shipped. The state restored here is the #1212 fix, which reads an image
reference through `DockerFrom` alone and so links against 8.90.3.

Reapplied in a follow-up PR, to merge once a rewrite release carries #8576,
#8590 and #8599 and the CLI picks it up.
@github-project-automation github-project-automation Bot moved this to In Progress in OpenRewrite Aug 22, 2026
@timtebeek
timtebeek merged commit dee579b into main Aug 22, 2026
1 check passed
@timtebeek
timtebeek deleted the tim/revert-docker-arg-defaults branch August 22, 2026 01:33
@github-project-automation github-project-automation Bot moved this from In Progress to Done in OpenRewrite Aug 22, 2026
timtebeek added a commit that referenced this pull request Aug 22, 2026
This reverts commit 901210a, keeping the branch side.

Merging main in pulled #1215 across, and #1215 is the revert of the very
commit this branch exists to reapply. The merge base still carried the `ARG`
work and main had removed it, so the merge resolved to main's removal and
emptied the branch: `git diff main...HEAD` came back with nothing, leaving the
pull request proposing no change at all.

Reverting the merge rather than dropping it also settles the branch. The merge
stays in history, so main's revert counts as already merged here and undone on
purpose. A later `main` merge brings its new commits without resurrecting the
removal, which resetting the branch would leave it open to on the next
`Update branch`.
timtebeek added a commit that referenced this pull request Aug 22, 2026
openrewrite/rewrite#8608 moves `getText()`, `getTextWithVariables()`,
`getQuoteStyle()` and `hasEnvironmentVariables()` off `Docker.Argument` and
into `org.openrewrite.docker.internal.ArgumentContents`, then drops them from
the LST type.

That matters because of how the Moderne CLI splits one rewrite-docker jar
across two classloaders: `org.openrewrite.docker.tree` resolves to the
rewrite-docker the CLI bundles, while recipes, traits and `internal` load
child-first from the recipe artifact. Reading an argument through the LST type
therefore linked against the CLI's copy, which is where #1215 came from. The
helpers now sit on the recipe's side of that split and read only members that
predate the CLIs in the field, so they travel with this artifact.

`ImageName` already sits on that side, so it needed no change.

Verified against the pull request rather than assumed: rewrite-docker built at
6f5fd253 and published locally, and every one of the fifteen
`org.openrewrite.docker.tree` members this recipe links against confirmed
present in the 8.90.3 jar CLI 4.6.3 bundles, matching on descriptor.
timtebeek added a commit that referenced this pull request Aug 22, 2026
… for rewrite release) (#1216)

* Revert "Upgrade `ARG` default values used in Docker `FROM` instructions (#1213)"

This reverts commit d33eca3.

The recipe reached for rewrite-docker API that no released version of rewrite
carries yet. `Docker.Argument.getText()`, `getTextWithVariables()` and
`hasEnvironmentVariables()` arrived in openrewrite/rewrite#8576, and
`org.openrewrite.docker.trait.ImageName` in openrewrite/rewrite#8599, both
landed 2026-08-21, one day after v8.90.3.

The Moderne CLI loads the LST classes in its own classloader, so a recipe runs
against the rewrite-docker the CLI bundles rather than the one this artifact
resolves. CLI 4.6.3 bundles rewrite-docker 8.90.3, where `Docker.Argument`
exposes only `getContents()` and `ImageName` does not exist. `visitFile` reads
a global `ARG` through `getText()` and `visitFrom` opens with
`hasEnvironmentVariables()`, so the first `FROM` of every Dockerfile would
raise `NoSuchMethodError`, surfacing as error markup on every Dockerfile of
every `UpgradeToJava*` run.

Nothing is lost by waiting: v3.42.1 predates this commit, so the breakage has
not shipped. The state restored here is the #1212 fix, which reads an image
reference through `DockerFrom` alone and so links against 8.90.3.

Reapplied in a follow-up PR, to merge once a rewrite release carries #8576,
#8590 and #8599 and the CLI picks it up.

* Upgrade `ARG` default values used in Docker `FROM` instructions

Reapplies #1213, reverted in #1215 because the rewrite-docker API it reads
`ARG` defaults through had not been released yet.

Hold until a rewrite release carries openrewrite/rewrite#8576 (the
`Docker.Argument` accessors), #8590 (the image reference grammar) and #8599
(`ImageName`), and confirm the Moderne CLI bundles that release, as the CLI
loads the LST classes in its own classloader and so decides which
rewrite-docker a recipe actually links against.

* Revert "Merge branch 'main' into tim/docker-arg-defaults-redo"

This reverts commit 901210a, keeping the branch side.

Merging main in pulled #1215 across, and #1215 is the revert of the very
commit this branch exists to reapply. The merge base still carried the `ARG`
work and main had removed it, so the merge resolved to main's removal and
emptied the branch: `git diff main...HEAD` came back with nothing, leaving the
pull request proposing no change at all.

Reverting the merge rather than dropping it also settles the branch. The merge
stays in history, so main's revert counts as already merged here and undone on
purpose. A later `main` merge brings its new commits without resurrecting the
removal, which resetting the branch would leave it open to on the next
`Update branch`.

* Read an argument's text through `ArgumentContents`

openrewrite/rewrite#8608 moves `getText()`, `getTextWithVariables()`,
`getQuoteStyle()` and `hasEnvironmentVariables()` off `Docker.Argument` and
into `org.openrewrite.docker.internal.ArgumentContents`, then drops them from
the LST type.

That matters because of how the Moderne CLI splits one rewrite-docker jar
across two classloaders: `org.openrewrite.docker.tree` resolves to the
rewrite-docker the CLI bundles, while recipes, traits and `internal` load
child-first from the recipe artifact. Reading an argument through the LST type
therefore linked against the CLI's copy, which is where #1215 came from. The
helpers now sit on the recipe's side of that split and read only members that
predate the CLIs in the field, so they travel with this artifact.

`ImageName` already sits on that side, so it needed no change.

Verified against the pull request rather than assumed: rewrite-docker built at
6f5fd253 and published locally, and every one of the fifteen
`org.openrewrite.docker.tree` members this recipe links against confirmed
present in the 8.90.3 jar CLI 4.6.3 bundles, matching on descriptor.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant