UpdateGradleWrapper - since 7.15.0 custom distribution url does not work
Intro
Since 7.15,0 version custom distribution uri for gradle wrapper does not work. As i walked through your code, i guess that it could be problem that the "distributions" part of gradle uri path is needed somehow, which seems to be limiting constraint to me.
What version of OpenRewrite are you using?
I am using
- Gradle plugin v7.18.0
How are you running OpenRewrite?
yaml recipe
type: specs.openrewrite.org/v1beta/recipe
name: MaintainUpdateCycle
recipeList:
- org.openrewrite.gradle.UpdateGradleWrapper:
version: "latest.release"
distribution: "all"
build.gradle.kts
plugins {
id("org.openrewrite.rewrite") version "7.18.0"
// -- other plugins
}
rewrite {
activeRecipe("MaintainUpdateCycle")
}
in gradle-wrapper.properties
distributionUrl=https\://foo.bar.nexus/repository/gradle-proxy/gradle-9.0.0-all.zip
and ran by:
./gradlew rewriteRun
What is the smallest, simplest way to reproduce the problem?
Just simply set version of openrewrite to greater than 7.14.0 and set the distributionUrl as i did.
What did you expect to see?
Succesfull build and switched gradle from 9.0.0 to 9.1.0
What did you see instead?
Caused by: java.lang.IllegalStateException: Unsupported distribution url for Gradle wrapper version detection: https://foo.bar.nexus/repository/gradle-proxy/gradle-9.0.0-all.zip
What is the full stack trace of any errors you encountered?
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':rewriteRun'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:135)
at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:288)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:133)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:121)
at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:45)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:347)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:334)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:330)
at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:84)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:330)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:319)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: Error while visiting gradle\wrapper\gradle-wrapper.properties: java.lang.IllegalStateException: Unsupported distribution url for Gradle wrapper version detection: https://foo.bar.nexus/repository/gradle-proxy/gradle-9.0.0-all.zip
org.openrewrite.gradle.util.GradleWrapper.determineGradleVersion(GradleWrapper.java:138)
org.openrewrite.gradle.util.GradleWrapper.create(GradleWrapper.java:88)
org.openrewrite.gradle.UpdateGradleWrapper.getGradleWrapper(UpdateGradleWrapper.java:141)
org.openrewrite.gradle.UpdateGradleWrapper.access$100(UpdateGradleWrapper.java:52)
org.openrewrite.gradle.UpdateGradleWrapper$1.visitEntry(UpdateGradleWrapper.java:214)
org.openrewrite.gradle.UpdateGradleWrapper$1.visitEntry(UpdateGradleWrapper.java:172)
org.openrewrite.properties.tree.Properties$Entry.acceptProperties(Properties.java:169)
org.openrewrite.properties.tree.Properties.accept(Properties.java:40)
org.openrewrite.TreeVisitor.visit(TreeVisitor.java:242)
org.openrewrite.properties.PropertiesVisitor.lambda$visitFile$0(PropertiesVisitor.java:39)
org.openrewrite.internal.ListUtils.map(ListUtils.java:245)
org.openrewrite.internal.ListUtils.map(ListUtils.java:269)
org.openrewrite.properties.PropertiesVisitor.visitFile(PropertiesVisitor.java:39)
org.openrewrite.properties.tree.Properties$File.acceptProperties(Properties.java:108)
org.openrewrite.properties.tree.Properties.accept(Properties.java:40)
org.openrewrite.TreeVisitor.visit(TreeVisitor.java:242)
...
at org.openrewrite.gradle.DelegatingProjectParser.unwrapInvocationException(DelegatingProjectParser.java:173)
at org.openrewrite.gradle.DelegatingProjectParser.run(DelegatingProjectParser.java:115)
at org.openrewrite.gradle.RewriteRunTask.run(RewriteRunTask.java:36)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:252)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:237)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:220)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:203)
at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:170)
at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)
at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42)
at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75)
at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50)
at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61)
at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26)
at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69)
at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:39)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:28)
at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189)
at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
at org.gradle.internal.Either$Right.fold(Either.java:176)
at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35)
at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75)
at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49)
at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27)
at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71)
at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:64)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:35)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:62)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:40)
at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:76)
at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:45)
at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:136)
at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:61)
at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:38)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)
at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)
at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)
at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:297)
at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)
at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)
at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)
at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)
at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67)
at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67)
at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:47)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34)
at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:132)
... 29 more
Caused by: java.lang.RuntimeException: Error while visiting gradle\wrapper\gradle-wrapper.properties: java.lang.IllegalStateException: Unsupported distribution url for Gradle wrapper version detection: https://foo.bar.nexus/repository/gradle-proxy/gradle-9.0.0-all.zip
org.openrewrite.gradle.util.GradleWrapper.determineGradleVersion(GradleWrapper.java:138)
org.openrewrite.gradle.util.GradleWrapper.create(GradleWrapper.java:88)
org.openrewrite.gradle.UpdateGradleWrapper.getGradleWrapper(UpdateGradleWrapper.java:141)
org.openrewrite.gradle.UpdateGradleWrapper.access$100(UpdateGradleWrapper.java:52)
org.openrewrite.gradle.UpdateGradleWrapper$1.visitEntry(UpdateGradleWrapper.java:214)
org.openrewrite.gradle.UpdateGradleWrapper$1.visitEntry(UpdateGradleWrapper.java:172)
org.openrewrite.properties.tree.Properties$Entry.acceptProperties(Properties.java:169)
org.openrewrite.properties.tree.Properties.accept(Properties.java:40)
org.openrewrite.TreeVisitor.visit(TreeVisitor.java:242)
org.openrewrite.properties.PropertiesVisitor.lambda$visitFile$0(PropertiesVisitor.java:39)
org.openrewrite.internal.ListUtils.map(ListUtils.java:245)
org.openrewrite.internal.ListUtils.map(ListUtils.java:269)
org.openrewrite.properties.PropertiesVisitor.visitFile(PropertiesVisitor.java:39)
org.openrewrite.properties.tree.Properties$File.acceptProperties(Properties.java:108)
org.openrewrite.properties.tree.Properties.accept(Properties.java:40)
org.openrewrite.TreeVisitor.visit(TreeVisitor.java:242)
...
at org.openrewrite.gradle.isolated.ResultsContainer$1.lambda$preVisit$0(ResultsContainer.java:116)
at org.openrewrite.gradle.isolated.ResultsContainer$1.preVisit(ResultsContainer.java:113)
at org.openrewrite.gradle.isolated.ResultsContainer$1.preVisit(ResultsContainer.java:109)
at org.openrewrite.gradle.isolated.ResultsContainer_1_PropertiesVisitor.preVisit(ResultsContainer_1_PropertiesVisitor.zig:102)
at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:239)
at org.openrewrite.properties.PropertiesVisitor.lambda$visitFile$0(PropertiesVisitor.java:39)
at org.openrewrite.internal.ListUtils.map(ListUtils.java:245)
at org.openrewrite.internal.ListUtils.map(ListUtils.java:269)
at org.openrewrite.properties.PropertiesVisitor.visitFile(PropertiesVisitor.java:39)
at org.openrewrite.properties.tree.Properties$File.acceptProperties(Properties.java:108)
at org.openrewrite.properties.tree.Properties.accept(Properties.java:40)
at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:242)
at org.openrewrite.gradle.isolated.ResultsContainer.getRecipeErrors(ResultsContainer.java:120)
at org.openrewrite.gradle.isolated.ResultsContainer.getFirstException(ResultsContainer.java:100)
at org.openrewrite.gradle.isolated.DefaultProjectParser.run(DefaultProjectParser.java:451)
at org.openrewrite.gradle.isolated.DefaultProjectParser.run(DefaultProjectParser.java:444)
at org.openrewrite.gradle.DelegatingProjectParser.lambda$run$2(DelegatingProjectParser.java:116)
at org.openrewrite.gradle.DelegatingProjectParser.unwrapInvocationException(DelegatingProjectParser.java:166)
... 120 more
Are you interested in contributing a fix to OpenRewrite?
yes why not, but i guess it should be some simple rollback. because it worked in 7.14.0
hi! thanks for the report; 7.15 here refers to the Gradle plugin version, which was released on August 27th: https://github.com/openrewrite/rewrite-gradle-plugin/releases/tag/v7.15.0
That means it likely contains these changes to the underlying recipe:
- https://github.com/openrewrite/rewrite/pull/5964
- https://github.com/openrewrite/rewrite/commit/f842210d5ca1c769d25d400333e95db512260d01
Those changes were very much deliberate and best not reverted; can you find away around your issue/? Or a minimal change to make it work?
/cc @shanman190
Yes, agree with Tim. Custom distribution URLs and dynamic ranges were always a source of errors, so we restricted those to just the forms where we presently have patterns for.
Custom distribution URLs still work as long as you use an exact version instead of a dynamic selector.
We try to rewrite the distributionUrl from the custom form to vanilla (to https://xxx.yyy.zzz/artifactory/gradle-distributions/...), then run the gradle update, as two steps in a recipe list, but the standardisation of the distributionUrl seems not to be happening and flowing into the UpdateGradleWrapper recipe. We used both a text replace recipe and a UpdatePropertyValue recipe but both don't seem to be honoured. Even setting causesAnotherCycle to true did not work. Running them standalone they work. We currently resort to running a Prerequisite recipe and then the actual recipe via to bash lines but would be interested if that can be streamlined?
Cheers