From 0451e587d926553de3578823d8d9481121380851 Mon Sep 17 00:00:00 2001 From: James Fredley Date: Sun, 10 Nov 2024 18:58:09 -0500 Subject: [PATCH 01/37] Update asset-pipeline to 4.5.1 --- grails-forge-core/src/main/resources/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grails-forge-core/src/main/resources/pom.xml b/grails-forge-core/src/main/resources/pom.xml index e801422b..56f7cf8a 100644 --- a/grails-forge-core/src/main/resources/pom.xml +++ b/grails-forge-core/src/main/resources/pom.xml @@ -125,12 +125,12 @@ com.bertramlabs.plugins asset-pipeline-grails - 4.3.0 + 4.5.1 com.bertramlabs.plugins asset-pipeline-gradle - 4.3.0 + 4.5.1 org.junit.jupiter From 96f9c181b6ff9e55c1b97147cbc1c248e3eb4f9e Mon Sep 17 00:00:00 2001 From: James Fredley Date: Sun, 10 Nov 2024 19:00:08 -0500 Subject: [PATCH 02/37] remove parenthesis from Gradle dependencies --- .../forge/feature/build/gradle/templates/dependency.rocker.raw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/dependency.rocker.raw b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/dependency.rocker.raw index 87674104..2b5e40b4 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/dependency.rocker.raw +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/dependency.rocker.raw @@ -1,3 +1,3 @@ @args(String groupId, String artifactId, String scope, String version, boolean pom) -@(pom ? scope + " platform" : scope)("@groupId:@artifactId@(version != null ? ":" + version : "")") +@(pom ? scope + " platform" : scope) "@groupId:@artifactId@(version != null ? ":" + version : "")" From e69382aeb2a3b85fd0adfb8c3063c1f895346459 Mon Sep 17 00:00:00 2001 From: James Fredley Date: Sun, 10 Nov 2024 19:07:03 -0500 Subject: [PATCH 03/37] consolidate Gradle plugin config, make Gradle buildSrc and settings file optional features when buildSrc feature is selected buildscript{} will not generate in main build.gradle file --- .../generator/GeneratorContext.java | 15 +++- .../forge/build/dependencies/Dependency.java | 19 ++++- .../forge/build/dependencies/Scope.java | 1 + .../forge/build/dependencies/Source.java | 5 +- .../forge/build/gradle/GradleBuild.java | 22 +++++- .../build/gradle/GradleConfiguration.java | 6 ++ .../forge/build/gradle/GradleDependency.java | 8 +- .../forge/build/gradle/GradlePlugin.java | 36 ++++++++- .../feature/assetPipeline/AssetPipeline.java | 8 +- .../forge/feature/build/gradle/Gradle.java | 14 +--- .../feature/build/gradle/GradleBuildSrc.java | 76 ++++++++++++++++++ .../build/gradle/GradleBuildSrcFeature.java | 38 +++++++++ .../build/gradle/GradleSettingsFile.java | 77 +++++++++++++++++++ .../gradle/GradleSettingsFileFeature.java | 38 +++++++++ .../gradle/templates/buildGradle.rocker.raw | 33 +++++++- .../templates/buildSrcBuildGradle.rocker.raw | 6 +- .../templates/settingsGradle.rocker.raw | 36 +-------- .../forge/feature/database/HibernateGorm.java | 2 +- .../feature/grails/GrailsGradlePlugin.java | 10 +-- .../migration/DatabaseMigrationPlugin.java | 4 +- .../grails/forge/feature/view/GrailsGsp.java | 4 +- .../forge/feature/view/json/ViewJson.java | 9 ++- .../forge/feature/view/markup/ViewMarkup.java | 9 ++- .../grails/forge/feature/web/GrailsWeb.java | 4 +- 24 files changed, 390 insertions(+), 90 deletions(-) create mode 100644 grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleBuildSrc.java create mode 100644 grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleBuildSrcFeature.java create mode 100644 grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleSettingsFile.java create mode 100644 grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleSettingsFileFeature.java diff --git a/grails-forge-core/src/main/java/org/grails/forge/application/generator/GeneratorContext.java b/grails-forge-core/src/main/java/org/grails/forge/application/generator/GeneratorContext.java index 58fbfd67..06acbabd 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/application/generator/GeneratorContext.java +++ b/grails-forge-core/src/main/java/org/grails/forge/application/generator/GeneratorContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 original authors + * Copyright 2017-2024 original authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ import org.grails.forge.build.dependencies.*; import org.grails.forge.feature.Feature; import org.grails.forge.feature.Features; +import org.grails.forge.feature.build.gradle.GradleBuildSrc; import org.grails.forge.feature.config.ApplicationConfiguration; import org.grails.forge.feature.config.BootstrapConfiguration; import org.grails.forge.feature.config.Configuration; @@ -318,9 +319,19 @@ public void addBuildscriptDependency(@NonNull Dependency dependency) { if (dependency.requiresLookup()) { Coordinate coordinate = coordinateResolver.resolve(dependency.getArtifactId()) .orElseThrow(() -> new LookupFailedException(dependency.getArtifactId())); - this.buildscriptDependencies.add(dependency.resolved(coordinate)); + addBuildscriptDependencyBasedOnFeatures(dependency.resolved(coordinate)); } else { + addBuildscriptDependencyBasedOnFeatures(dependency); + } + } + + private void addBuildscriptDependencyBasedOnFeatures(@NonNull Dependency dependency) { + if (getFeature(GradleBuildSrc.class).isPresent()) { + // for buildSrc/build.gradle with initial scope this.buildscriptDependencies.add(dependency); + } else { + // for main build.gradle with classpath scope + this.buildscriptDependencies.add(dependency.scope(Scope.CLASSPATH)); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java index ff05905e..1b5f345e 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java +++ b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java @@ -119,6 +119,19 @@ public Dependency resolved(Coordinate coordinate) { coordinate.isPom()); } + public Dependency scope(Scope newScope) { + return new Dependency( + newScope, + groupId, + artifactId, + version, + versionProperty, + requiresLookup, + annotationProcessorPriority, + order, + pom); + } + public boolean isAnnotationProcessorPriority() { return annotationProcessorPriority; } @@ -166,7 +179,7 @@ public Builder scope(@NonNull Scope scope) { } } - public Builder buildscript() { + public Builder buildSrc() { return scope(Scope.BUILD); } @@ -207,6 +220,10 @@ public Builder profile() { return scope(Scope.PROFILE); } + public Builder classpath() { + return scope(Scope.CLASSPATH); + } + public Builder annotationProcessor(boolean requiresPriority) { this.annotationProcessorPriority = requiresPriority; return annotationProcessor(); diff --git a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java index edd2c1dc..dab1c1ef 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java +++ b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java @@ -37,6 +37,7 @@ public class Scope { public static final Scope TEST_RUNTIME = new Scope(Source.TEST, Collections.singletonList(Phase.RUNTIME)); public static final Scope OPENREWRITE = new Scope(Source.MAIN, Collections.singletonList(Phase.OPENREWRITE)); public static final Scope PROFILE = new Scope(Source.MAIN, Collections.singletonList(Phase.PROFILE)); + public static final Scope CLASSPATH = new Scope(Source.BUILDSCRIPT, Collections.singletonList(Phase.BUILD)); @NonNull private Source source; diff --git a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Source.java b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Source.java index 15b19d3f..1a0c2ef0 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Source.java +++ b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Source.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 original authors + * Copyright 2017-2024 original authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,5 +18,6 @@ public enum Source { MAIN, TEST, - BUILD_SRC + BUILD_SRC, + BUILDSCRIPT } diff --git a/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleBuild.java b/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleBuild.java index 68430680..681084df 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleBuild.java +++ b/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleBuild.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 original authors + * Copyright 2017-2024 original authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,8 +69,18 @@ public List getDependencies() { return dependencies; } + @NonNull + public List getBuildSrcDependencies() { + return buildscriptDependencies.stream().filter(gradleDependency -> !gradleDependency.getConfiguration().equals(GradleConfiguration.CLASSPATH)).collect(Collectors.toList()); + } + @NonNull public List getBuildscriptDependencies() { + return buildscriptDependencies.stream().filter(gradleDependency -> gradleDependency.getConfiguration().equals(GradleConfiguration.CLASSPATH)).collect(Collectors.toList()); + } + + @NonNull + public List getAllBuildscriptDependencies() { return buildscriptDependencies; } @@ -84,6 +94,16 @@ public List getPluginsWithVersion() { return plugins.stream().filter(plugin -> plugin.getVersion() != null).collect(Collectors.toList()); } + @NonNull + public List getPluginsWithoutApply() { + return plugins.stream().filter(plugin -> !plugin.useApplyPlugin()).collect(Collectors.toList()); + } + + @NonNull + public List getPluginsWithApply() { + return plugins.stream().filter(plugin -> plugin.useApplyPlugin()).collect(Collectors.toList()); + } + @NonNull public String renderExtensions() { return renderWritableExtensions(Stream.concat( diff --git a/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleConfiguration.java b/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleConfiguration.java index 5e2eebb1..9bbb09c5 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleConfiguration.java +++ b/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleConfiguration.java @@ -25,6 +25,7 @@ import java.util.Optional; public enum GradleConfiguration implements Ordered { + CLASSPATH("classpath", -2), PROFILE("profile", -1), BUILD("implementation", 0), ANNOTATION_PROCESSOR("annotationProcessor", 1), @@ -74,6 +75,11 @@ public static Optional of(@NonNull Scope scope, return Optional.of(GradleConfiguration.BUILD); } break; + case BUILDSCRIPT: + if (scope.getPhases().contains(Phase.BUILD)) { + return Optional.of(GradleConfiguration.CLASSPATH); + } + break; case MAIN: if (scope.getPhases().contains(Phase.ANNOTATION_PROCESSING)) { return Optional.of(GradleConfiguration.COMPILE_ONLY); diff --git a/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java b/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java index cdc554f8..5e8cb5f1 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java +++ b/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 original authors + * Copyright 2017-2024 original authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -102,10 +102,10 @@ public String toSnippet() { String snippet = gradleConfiguration.getConfigurationName(); if (isPom()) { String platformPrefix = " "; - snippet += platformPrefix + "platform"; + snippet += platformPrefix + "platform ("; } - snippet += "(\"" + getGroupId() + ':' + getArtifactId() + - (getVersion() != null ? (':' + getVersion()) : "") + "\")"; + snippet += " \"" + getGroupId() + ':' + getArtifactId() + + (getVersion() != null ? (':' + getVersion()) : "") + "\""; if (isPom()) { snippet += ")"; } diff --git a/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradlePlugin.java b/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradlePlugin.java index 8ab6529b..ed1c753c 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradlePlugin.java +++ b/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradlePlugin.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 original authors + * Copyright 2017-2024 original authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,6 +37,7 @@ public class GradlePlugin implements BuildPlugin { private final boolean requiresLookup; private final Set buildImports; private final int order; + private final boolean useApplyPlugin; public GradlePlugin(@NonNull String id, @Nullable String version, @@ -46,6 +47,26 @@ public GradlePlugin(@NonNull String id, boolean requiresLookup, int order, Set buildImports) { + this(id, + version, + artifactId, + extension, + settingsExtension, + requiresLookup, + order, + buildImports, + false); + } + + public GradlePlugin(@NonNull String id, + @Nullable String version, + @Nullable String artifactId, + @Nullable Writable extension, + @Nullable Writable settingsExtension, + boolean requiresLookup, + int order, + Set buildImports, + boolean useApplyPlugin) { this.id = id; this.version = version; this.artifactId = artifactId; @@ -54,6 +75,7 @@ public GradlePlugin(@NonNull String id, this.requiresLookup = requiresLookup; this.order = order; this.buildImports = buildImports; + this.useApplyPlugin = useApplyPlugin; } @Nullable @@ -98,6 +120,10 @@ public boolean requiresLookup() { return requiresLookup; } + public boolean useApplyPlugin() { + return useApplyPlugin; + } + @Override public BuildPlugin resolved(CoordinateResolver coordinateResolver) { Coordinate coordinate = coordinateResolver.resolve(artifactId) @@ -137,6 +163,7 @@ public static final class Builder { private boolean requiresLookup; private boolean pom = false; private int order = 0; + private boolean useApplyPlugin = false; private boolean template = false; private Set buildImports = new HashSet<>(); @@ -199,8 +226,13 @@ public GradlePlugin.Builder pom(boolean pom) { return this; } + public GradlePlugin.Builder useApplyPlugin(boolean useApplyPlugin) { + this.useApplyPlugin = useApplyPlugin; + return this; + } + public GradlePlugin build() { - return new GradlePlugin(id, version, artifactId, extension, settingsExtension, requiresLookup, order, buildImports); + return new GradlePlugin(id, version, artifactId, extension, settingsExtension, requiresLookup, order, buildImports, useApplyPlugin); } private GradlePlugin.Builder copy() { diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/assetPipeline/AssetPipeline.java b/grails-forge-core/src/main/java/org/grails/forge/feature/assetPipeline/AssetPipeline.java index bf74cbf3..1c4fd299 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/assetPipeline/AssetPipeline.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/assetPipeline/AssetPipeline.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 original authors + * Copyright 2017-2024 original authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -60,13 +60,11 @@ public String getDescription() { @Override public void apply(GeneratorContext generatorContext) { - generatorContext.addBuildscriptDependency(Dependency.builder() - .groupId("com.bertramlabs.plugins") - .lookupArtifactId("asset-pipeline-gradle") - .buildscript()); + generatorContext.addBuildPlugin(GradlePlugin.builder() .id("com.bertramlabs.asset-pipeline") .extension(new RockerWritable(assetPipelineExtension.template(generatorContext.getApplicationType()))) + .lookupArtifactId("asset-pipeline-gradle") .build()); generatorContext.addDependency(Dependency.builder() diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/Gradle.java b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/Gradle.java index ce40053d..47dba7ff 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/Gradle.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/Gradle.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 original authors + * Copyright 2017-2024 original authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,9 +28,7 @@ import org.grails.forge.feature.build.BuildFeature; import org.grails.forge.feature.build.gitignore; import org.grails.forge.feature.build.gradle.templates.buildGradle; -import org.grails.forge.feature.build.gradle.templates.buildSrcBuildGradle; import org.grails.forge.feature.build.gradle.templates.gradleProperties; -import org.grails.forge.feature.build.gradle.templates.settingsGradle; import org.grails.forge.options.BuildTool; import org.grails.forge.options.Options; import org.grails.forge.template.BinaryTemplate; @@ -74,14 +72,6 @@ public void apply(GeneratorContext generatorContext) { BuildTool buildTool = BuildTool.DEFAULT_OPTION; GradleBuild build = dependencyResolver.create(generatorContext); - generatorContext.addTemplate("buildSrc/build", new RockerTemplate("buildSrc/" + buildTool.getBuildFileName(), buildSrcBuildGradle.template( - generatorContext.getApplicationType(), - generatorContext.getProject(), - generatorContext.getFeatures(), - build - ))); - - final Function coordinateResolver = (artifactId) -> resolver.resolve(artifactId).orElseThrow(() -> new LookupFailedException(artifactId)); generatorContext.addTemplate("build", new RockerTemplate(buildTool.getBuildFileName(), buildGradle.template( generatorContext.getApplicationType(), @@ -94,8 +84,6 @@ public void apply(GeneratorContext generatorContext) { configureDefaultGradleProps(generatorContext); generatorContext.addTemplate("gitignore", new RockerTemplate(".gitignore", gitignore.template())); generatorContext.addTemplate("projectProperties", new RockerTemplate("gradle.properties", gradleProperties.template(generatorContext.getBuildProperties().getProperties()))); - String settingsFile = "settings.gradle"; - generatorContext.addTemplate("gradleSettings", new RockerTemplate(settingsFile, settingsGradle.template(generatorContext.getProject(), build, coordinateResolver, generatorContext.getFeatures()))); } private void configureDefaultGradleProps(GeneratorContext generatorContext) { diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleBuildSrc.java b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleBuildSrc.java new file mode 100644 index 00000000..f08725db --- /dev/null +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleBuildSrc.java @@ -0,0 +1,76 @@ +/* + * Copyright 2024 original authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.grails.forge.feature.build.gradle; + +import jakarta.inject.Singleton; +import org.grails.forge.application.ApplicationType; +import org.grails.forge.application.generator.GeneratorContext; +import org.grails.forge.build.dependencies.CoordinateResolver; +import org.grails.forge.build.gradle.GradleBuild; +import org.grails.forge.build.gradle.GradleBuildCreator; +import org.grails.forge.feature.build.gradle.templates.buildSrcBuildGradle; +import org.grails.forge.options.BuildTool; +import org.grails.forge.template.RockerTemplate; + +@Singleton +public class GradleBuildSrc implements GradleBuildSrcFeature { + + private final GradleBuildCreator dependencyResolver; + private final CoordinateResolver resolver; + + public GradleBuildSrc(GradleBuildCreator dependencyResolver, CoordinateResolver resolver) { + this.dependencyResolver = dependencyResolver; + this.resolver = resolver; + } + + @Override + public String getName() { + return "gradle-build-src"; + } + + @Override + public String getTitle() { + return "Gradle buildSrc"; + } + + @Override + public String getDescription() { + return "Use Gradle buildSrc/build.gradle instead of buildscript{} in main build.gradle"; + } + + @Override + public boolean isVisible() { + return true; + } + + @Override + public void apply(GeneratorContext generatorContext) { + BuildTool buildTool = BuildTool.DEFAULT_OPTION; + GradleBuild build = dependencyResolver.create(generatorContext); + + generatorContext.addTemplate("buildSrc/build", new RockerTemplate("buildSrc/" + buildTool.getBuildFileName(), buildSrcBuildGradle.template( + generatorContext.getApplicationType(), + generatorContext.getProject(), + generatorContext.getFeatures(), + build + ))); + } + + @Override + public boolean supports(ApplicationType applicationType) { + return true; + } +} diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleBuildSrcFeature.java b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleBuildSrcFeature.java new file mode 100644 index 00000000..38fca562 --- /dev/null +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleBuildSrcFeature.java @@ -0,0 +1,38 @@ +/* + * Copyright 2024 original authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.grails.forge.feature.build.gradle; + +import org.grails.forge.application.ApplicationType; +import org.grails.forge.feature.Category; +import org.grails.forge.feature.OneOfFeature; + +public interface GradleBuildSrcFeature extends OneOfFeature { + + @Override + default Class getFeatureClass() { + return GradleBuildSrcFeature.class; + } + + @Override + default boolean supports(ApplicationType applicationType) { + return true; + } + + @Override + default String getCategory() { + return Category.CONFIGURATION; + } +} diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleSettingsFile.java b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleSettingsFile.java new file mode 100644 index 00000000..8dbc1900 --- /dev/null +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleSettingsFile.java @@ -0,0 +1,77 @@ +/* + * Copyright 2024 original authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.grails.forge.feature.build.gradle; + +import jakarta.inject.Singleton; +import org.grails.forge.application.ApplicationType; +import org.grails.forge.application.generator.GeneratorContext; +import org.grails.forge.build.dependencies.Coordinate; +import org.grails.forge.build.dependencies.CoordinateResolver; +import org.grails.forge.build.dependencies.LookupFailedException; +import org.grails.forge.build.gradle.GradleBuild; +import org.grails.forge.build.gradle.GradleBuildCreator; +import org.grails.forge.feature.build.gradle.templates.settingsGradle; +import org.grails.forge.options.BuildTool; +import org.grails.forge.template.RockerTemplate; + +import java.util.function.Function; + +@Singleton +public class GradleSettingsFile implements GradleSettingsFileFeature { + + private final GradleBuildCreator dependencyResolver; + private final CoordinateResolver resolver; + + public GradleSettingsFile(GradleBuildCreator dependencyResolver, CoordinateResolver resolver) { + this.dependencyResolver = dependencyResolver; + this.resolver = resolver; + } + + @Override + public String getName() { + return "gradle-settings-file"; + } + + @Override + public String getTitle() { + return "Gradle Settings File"; + } + + @Override + public String getDescription() { + return "Generate Gradle Settings File for use in multi-project builds and with Gradle Settings Plugins"; + } + + @Override + public boolean isVisible() { + return true; + } + + @Override + public void apply(GeneratorContext generatorContext) { + BuildTool buildTool = BuildTool.DEFAULT_OPTION; + GradleBuild build = dependencyResolver.create(generatorContext); + + String settingsFile = "settings.gradle"; + final Function coordinateResolver = (artifactId) -> resolver.resolve(artifactId).orElseThrow(() -> new LookupFailedException(artifactId)); + generatorContext.addTemplate("gradleSettings", new RockerTemplate(settingsFile, settingsGradle.template(generatorContext.getProject(), build, coordinateResolver, generatorContext.getFeatures()))); + } + + @Override + public boolean supports(ApplicationType applicationType) { + return true; + } +} diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleSettingsFileFeature.java b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleSettingsFileFeature.java new file mode 100644 index 00000000..71ad4f05 --- /dev/null +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleSettingsFileFeature.java @@ -0,0 +1,38 @@ +/* + * Copyright 2024 original authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.grails.forge.feature.build.gradle; + +import org.grails.forge.application.ApplicationType; +import org.grails.forge.feature.Category; +import org.grails.forge.feature.OneOfFeature; + +public interface GradleSettingsFileFeature extends OneOfFeature { + + @Override + default Class getFeatureClass() { + return GradleSettingsFileFeature.class; + } + + @Override + default boolean supports(ApplicationType applicationType) { + return true; + } + + @Override + default String getCategory() { + return Category.CONFIGURATION; + } +} diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildGradle.rocker.raw b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildGradle.rocker.raw index 34125d41..4f59b135 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildGradle.rocker.raw +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildGradle.rocker.raw @@ -9,6 +9,7 @@ @import org.grails.forge.feature.Features @import org.grails.forge.options.TestFramework @import org.grails.forge.util.VersionInfo +@import org.grails.forge.build.gradle.GradleDependency @args ( ApplicationType applicationType, @@ -18,17 +19,45 @@ Features features, GradleBuild gradleBuild ) -@seleniumVersion => { @coordinateResolver.apply("selenium-api").getVersion() } +@seleniumVersion => {@coordinateResolver.apply("selenium-api").getVersion()} + + +@if (!features.contains("gradle-build-src") && !gradleBuild.getBuildscriptDependencies().isEmpty()) { +buildscript { + repositories { + maven { url "https://repo.grails.org/grails/core" } + mavenCentral() + } + dependencies { // Not Published to Gradle Plugin Portal + @for (GradleDependency dependency : gradleBuild.getBuildscriptDependencies()) { + @dependency.toSnippet() + } + } +} + +} @for (String importLine : gradleBuild.getPluginsImports()) { @(importLine) } plugins { -@for (GradlePlugin gradlePlugin : gradleBuild.getPlugins()) { +@for (GradlePlugin gradlePlugin : gradleBuild.getPluginsWithoutApply()) { + @if(gradlePlugin.getVersion() != null) { + id "@gradlePlugin.getId()" version "@gradlePlugin.getVersion()" + } else { id "@gradlePlugin.getId()" + } +} +} + +@if(!gradleBuild.getPluginsWithApply().isEmpty()) { +// Not Published to Gradle Plugin Portal +@for (GradlePlugin gradlePlugin : gradleBuild.getPluginsWithApply()) { +apply plugin: "@gradlePlugin.getId()" } } + group = "@project.getPackageName()" @if (features.contains("asciidoctor")) { diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildSrcBuildGradle.rocker.raw b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildSrcBuildGradle.rocker.raw index ca10e7ee..0ab897d8 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildSrcBuildGradle.rocker.raw +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildSrcBuildGradle.rocker.raw @@ -11,13 +11,13 @@ Features features, GradleBuild gradleBuild ) -@if(!gradleBuild.getBuildscriptDependencies().isEmpty()) { +@if(!gradleBuild.getBuildSrcDependencies().isEmpty()) { repositories { - mavenCentral() maven { url "https://repo.grails.org/grails/core/" } + mavenCentral() } dependencies { -@for (GradleDependency dependency : gradleBuild.getBuildscriptDependencies()) { +@for (GradleDependency dependency : gradleBuild.getBuildSrcDependencies()) { @dependency.toSnippet() } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/settingsGradle.rocker.raw b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/settingsGradle.rocker.raw index 0c7d9e6e..93a66bd9 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/settingsGradle.rocker.raw +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/settingsGradle.rocker.raw @@ -12,39 +12,5 @@ GradleBuild gradleBuild, Function coordinateResolver, Features features) -@grailsGradlePluginVersion => { @coordinateResolver.apply("grails-gradle-plugin").getVersion() } -@viewsGradlePluginVersion => { @coordinateResolver.apply("views-gradle").getVersion() } -@assetPipelineVersion => { @coordinateResolver.apply("asset-pipeline-grails").getVersion() } - @gradleBuild.renderSettingsExtensions() - -pluginManagement { - repositories { - mavenLocal() - maven { url "https://repo.grails.org/grails/core/" } - gradlePluginPortal() - } - plugins { - @if(features.contains("grails-web")) { - id "org.grails.grails-web" version "@grailsGradlePluginVersion" - } - @if(features.contains("grails-gsp")) { - id "org.grails.grails-gsp" version "@grailsGradlePluginVersion" - } - @if(features.contains("views-json")) { - id "org.grails.plugins.views-json" version "@viewsGradlePluginVersion" - } - @if(features.contains("views-markup")) { - id "org.grails.plugins.views-markup" version "@viewsGradlePluginVersion" - } - @if(features.contains("asset-pipeline-grails")) { - id "com.bertramlabs.asset-pipeline" version "@assetPipelineVersion" - } - - @for (GradlePlugin gradlePlugin : gradleBuild.getPluginsWithVersion()) { - id "@gradlePlugin.getId()" version "@gradlePlugin.getVersion()" - } - } -} - -rootProject.name="@project.getName()" +rootProject.name="@project.getName()" \ No newline at end of file diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java b/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java index ef0e91d2..f179b6c0 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java @@ -82,7 +82,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addBuildscriptDependency(Dependency.builder() .groupId("org.grails.plugins") .lookupArtifactId("hibernate5") - .buildscript()); + .buildSrc()); generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .artifactId("hibernate5") diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsGradlePlugin.java b/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsGradlePlugin.java index 8a2b6252..5442dc89 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsGradlePlugin.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsGradlePlugin.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 original authors + * Copyright 2017-2024 original authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -68,15 +68,15 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addBuildscriptDependency(Dependency.builder() .groupId("org.grails") .lookupArtifactId("grails-gradle-plugin") - .buildscript()); + .buildSrc()); if (applicationType == ApplicationType.PLUGIN || applicationType == ApplicationType.WEB_PLUGIN) { - generatorContext.addBuildPlugin(GradlePlugin.builder().id("org.grails.grails-plugin").build()); + generatorContext.addBuildPlugin(GradlePlugin.builder().id("org.grails.grails-plugin").version(grailsGradlePluginCoordinate.getVersion()).useApplyPlugin(true).build()); } if (generatorContext.getFeature(GrailsWeb.class).isPresent()) { - generatorContext.addBuildPlugin(GradlePlugin.builder().id("org.grails.grails-web").build()); + generatorContext.addBuildPlugin(GradlePlugin.builder().id("org.grails.grails-web").version(grailsGradlePluginCoordinate.getVersion()).useApplyPlugin(true).build()); } if (generatorContext.getFeature(GrailsGsp.class).isPresent()) { - generatorContext.addBuildPlugin(GradlePlugin.builder().id("org.grails.grails-gsp").build()); + generatorContext.addBuildPlugin(GradlePlugin.builder().id("org.grails.grails-gsp").version(grailsGradlePluginCoordinate.getVersion()).useApplyPlugin(true).build()); } generatorContext.getBuildProperties().put("grailsGradlePluginVersion", grailsGradlePluginCoordinate.getVersion()); } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/migration/DatabaseMigrationPlugin.java b/grails-forge-core/src/main/java/org/grails/forge/feature/migration/DatabaseMigrationPlugin.java index fa06e665..e30c7ad7 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/migration/DatabaseMigrationPlugin.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/migration/DatabaseMigrationPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 original authors + * Copyright 2017-2024 original authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -54,7 +54,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addBuildscriptDependency(Dependency.builder() .groupId("org.grails.plugins") .lookupArtifactId("database-migration") - .buildscript() + .buildSrc() .extension(new RockerWritable(dbMigrationGradle.template(srcDirPath)))); generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/view/GrailsGsp.java b/grails-forge-core/src/main/java/org/grails/forge/feature/view/GrailsGsp.java index 90b9b424..5a441272 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/view/GrailsGsp.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/view/GrailsGsp.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 original authors + * Copyright 2017-2024 original authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,7 +19,6 @@ import org.grails.forge.application.ApplicationType; import org.grails.forge.application.generator.GeneratorContext; import org.grails.forge.build.dependencies.Dependency; -import org.grails.forge.build.gradle.GradlePlugin; import org.grails.forge.feature.Category; import org.grails.forge.feature.DefaultFeature; import org.grails.forge.feature.Feature; @@ -101,7 +100,6 @@ public void apply(GeneratorContext generatorContext) { .groupId("org.grails.plugins") .artifactId("gsp") .compile()); - generatorContext.addBuildPlugin(GradlePlugin.builder().id("org.grails.grails-gsp").build()); final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); generatorContext.addTemplate("mainLayout", new URLTemplate(getViewFolderPath() + "layouts/main.gsp", classLoader.getResource("gsp/main.gsp"))); diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java b/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java index 48f1a73d..20a99311 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 original authors + * Copyright 2017-2024 original authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -75,9 +75,12 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addBuildscriptDependency(Dependency.builder() .groupId("org.grails.plugins") .lookupArtifactId("views-gradle") - .buildscript()); + .buildSrc()); - generatorContext.addBuildPlugin(GradlePlugin.builder().id("org.grails.plugins.views-json").build()); + generatorContext.addBuildPlugin(GradlePlugin.builder() + .id("org.grails.plugins.views-json") + .lookupArtifactId("views-gradle") + .build()); generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/view/markup/ViewMarkup.java b/grails-forge-core/src/main/java/org/grails/forge/feature/view/markup/ViewMarkup.java index 0b35810f..58079132 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/view/markup/ViewMarkup.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/view/markup/ViewMarkup.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 original authors + * Copyright 2017-2024 original authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -71,9 +71,12 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addBuildscriptDependency(Dependency.builder() .groupId("org.grails.plugins") .lookupArtifactId("views-gradle") - .buildscript()); + .buildSrc()); - generatorContext.addBuildPlugin(GradlePlugin.builder().id("org.grails.plugins.views-markup").build()); + generatorContext.addBuildPlugin(GradlePlugin.builder() + .id("org.grails.plugins.views-markup") + .lookupArtifactId("views-gradle") + .build()); generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/web/GrailsWeb.java b/grails-forge-core/src/main/java/org/grails/forge/feature/web/GrailsWeb.java index 79bdb639..5caeb962 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/web/GrailsWeb.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/web/GrailsWeb.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 original authors + * Copyright 2017-2024 original authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ import jakarta.inject.Singleton; import org.grails.forge.application.ApplicationType; import org.grails.forge.application.generator.GeneratorContext; -import org.grails.forge.build.gradle.GradlePlugin; import org.grails.forge.feature.DefaultFeature; import org.grails.forge.feature.Feature; import org.grails.forge.options.Options; @@ -53,6 +52,5 @@ public boolean supports(ApplicationType applicationType) { public void apply(GeneratorContext generatorContext) { final Map config = generatorContext.getConfiguration(); config.put("grails.views.default.codec", "html"); - generatorContext.addBuildPlugin(GradlePlugin.builder().id("org.grails.grails-web").build()); } } From 619b84f73985c8cca8c6f05f113e1fbd0dc4f8e1 Mon Sep 17 00:00:00 2001 From: James Fredley Date: Sun, 10 Nov 2024 19:07:38 -0500 Subject: [PATCH 04/37] fix failing tests after Gradle plugin configuration consolidation --- .../forge/ApplicationContextSpec.groovy | 2 +- .../org/grails/forge/BuildBuilder.groovy | 1 + .../GradleDependencyComparatorSpec.groovy | 28 +++++------ .../forge/build/gradle/GradleSpec.groovy | 46 +------------------ .../asciidoctor/AsciidoctorSpec.groovy | 3 +- .../assetPipeline/AssetPipelineSpec.groovy | 14 +----- .../forge/feature/cache/EHCacheSpec.groovy | 2 +- .../feature/database/EmbeddedMongoSpec.groovy | 2 +- .../feature/database/HibernateGormSpec.groovy | 14 +++--- .../feature/database/MongoGormSpec.groovy | 6 +-- .../feature/database/MongoSyncSpec.groovy | 4 +- .../forge/feature/database/MySQLSpec.groovy | 2 +- .../feature/database/Neo4JGormSpec.groovy | 2 +- .../feature/database/PostgresSpec.groovy | 2 +- .../feature/database/SQLServerSpec.groovy | 2 +- .../database/TestContainersSpec.groovy | 26 +++++------ .../feature/grails/GrailsBaseSpec.groovy | 6 +-- .../feature/grails/GrailsConsoleSpec.groovy | 2 +- .../grails/GrailsDefaultPluginsSpec.groovy | 10 ++-- .../grails/GrailsGradlePluginSpec.groovy | 10 ++-- .../grails/GrailsWebConsoleSpec.groovy | 2 +- .../grailsProfiles/GrailsProfilesSpec.groovy | 3 +- .../feature/lang/GrailsApplicationSpec.groovy | 2 +- .../logging/LogbackGroovyConfigSpec.groovy | 4 +- .../forge/feature/logging/LogbackSpec.groovy | 2 +- .../micronaut/MicronautHttpClientSpec.groovy | 2 +- .../MicronautInjectGroovySpec.groovy | 4 +- .../reloading/SpringBootDevToolsSpec.groovy | 2 +- .../feature/spring/SpringBootSpec.groovy | 22 ++++----- .../grails/forge/feature/test/GebSpec.groovy | 20 ++++---- .../forge/feature/test/JUnitSpec.groovy | 2 +- .../forge/feature/test/SpockSpec.groovy | 2 +- .../forge/feature/view/GrailsGspSpec.groovy | 12 ++--- .../forge/feature/view/ScaffoldingSpec.groovy | 4 +- .../feature/view/json/ViewJsonSpec.groovy | 22 ++++----- .../feature/view/json/ViewMarkupSpec.groovy | 12 ++--- .../forge/feature/web/GrailsWebSpec.groovy | 2 +- .../scaffolding/ScaffoldingSpec.groovy | 14 +++--- 38 files changed, 130 insertions(+), 187 deletions(-) diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/ApplicationContextSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/ApplicationContextSpec.groovy index 0ceb6063..a3668d8f 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/ApplicationContextSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/ApplicationContextSpec.groovy @@ -34,7 +34,7 @@ abstract class ApplicationContextSpec extends Specification implements ProjectFi for (String line : lines) { if (line.contains(groupArtifactId)) { String str = line.substring(line.indexOf(groupArtifactId) + groupArtifactId.length() + ":".length()) - String version = str.substring(0, str.indexOf("\")")) + String version = str.substring(0, str.indexOf("\"")) return Optional.of(new SemanticVersion(version)) } } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/BuildBuilder.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/BuildBuilder.groovy index a4af1118..494dc8ff 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/BuildBuilder.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/BuildBuilder.groovy @@ -101,6 +101,7 @@ class BuildBuilder implements ProjectFixture, ContextFixture { String renderBuildSrc() { List featureNames = this.features ?: [] + featureNames.add("gradle-build-src") TestFramework testFramework = this.testFramework ?: TestFramework.SPOCK ApplicationType type = this.applicationType ?: ApplicationType.WEB Project project = this.project ?: buildProject() diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy index da1c4bc0..6dd7d5f7 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy @@ -32,23 +32,23 @@ class GradleDependencyComparatorSpec extends Specification { dependencies.sort(GradleDependency.COMPARATOR) then: - "${str(dependencies[0])}" == 'implementation("io.micronaut:micronaut-http-client")' - "${str(dependencies[1])}" == 'implementation("io.micronaut:micronaut-runtime")' - "${str(dependencies[2])}" == 'implementation("io.micronaut:micronaut-validation")' - "${str(dependencies[3])}" == 'implementation("io.micronaut.sql:micronaut-jdbc-hikari")' - "${str(dependencies[4])}" == 'implementation("io.swagger.core.v3:swagger-annotations")' - "${str(dependencies[5])}" == 'implementation("jakarta.annotation:jakarta.annotation-api")' - "${str(dependencies[6])}" == 'compileOnly("io.micronaut.openapi:micronaut-openapi")' - "${str(dependencies[7])}" == 'console("org.grails:grails-console")' - "${str(dependencies[8])}" == 'runtimeOnly("ch.qos.logback:logback-classic")' - "${str(dependencies[9])}" == 'runtimeOnly("mysql:mysql-connector-java")' - "${str(dependencies[10])}" == 'testImplementation("org.testcontainers:junit-jupiter")' - "${str(dependencies[11])}" == 'testImplementation("org.testcontainers:mysql")' - "${str(dependencies[12])}" == 'testImplementation("org.testcontainers:testcontainers")' + "${str(dependencies[0])}" == 'implementation "io.micronaut:micronaut-http-client"' + "${str(dependencies[1])}" == 'implementation "io.micronaut:micronaut-runtime"' + "${str(dependencies[2])}" == 'implementation "io.micronaut:micronaut-validation"' + "${str(dependencies[3])}" == 'implementation "io.micronaut.sql:micronaut-jdbc-hikari"' + "${str(dependencies[4])}" == 'implementation "io.swagger.core.v3:swagger-annotations"' + "${str(dependencies[5])}" == 'implementation "jakarta.annotation:jakarta.annotation-api"' + "${str(dependencies[6])}" == 'compileOnly "io.micronaut.openapi:micronaut-openapi"' + "${str(dependencies[7])}" == 'console "org.grails:grails-console"' + "${str(dependencies[8])}" == 'runtimeOnly "ch.qos.logback:logback-classic"' + "${str(dependencies[9])}" == 'runtimeOnly "mysql:mysql-connector-java"' + "${str(dependencies[10])}" == 'testImplementation "org.testcontainers:junit-jupiter"' + "${str(dependencies[11])}" == 'testImplementation "org.testcontainers:mysql"' + "${str(dependencies[12])}" == 'testImplementation "org.testcontainers:testcontainers"' } private static String str(GradleDependency dependency) { - "${dependency.getConfiguration().toString()}(\"${dependency.groupId}:${dependency.artifactId}\")" + "${dependency.getConfiguration().toString()} \"${dependency.groupId}:${dependency.artifactId}\"" } private static GradleDependency dep(Dependency.Builder dependency, GeneratorContext ctx) { diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy index 1b4008b9..ed6d616e 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy @@ -34,52 +34,10 @@ class GradleSpec extends ApplicationContextSpec implements CommandOutputFixture void "test settings.gradle"() { given: - final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK, JdkVersion.JDK_11)) - final String settingsGradle = output["settings.gradle"] - - expect: - settingsGradle.contains("pluginManagement") - settingsGradle.contains("repositories") - settingsGradle.contains("mavenLocal()") - settingsGradle.contains("maven { url \"https://repo.grails.org/grails/core/\" }") - settingsGradle.contains("gradlePluginPortal()") - settingsGradle.contains("id \"org.grails.grails-web\" version \"6.2.1\"") - settingsGradle.contains("id \"org.grails.grails-gsp\" version \"6.2.1\"") - settingsGradle.contains("id \"com.bertramlabs.asset-pipeline\" version \"4.3.0\"") - } - - void "test settings.gradle for REST-API"() { - given: - final def output = generate(ApplicationType.REST_API, new Options(TestFramework.SPOCK, JdkVersion.JDK_11)) - final String settingsGradle = output["settings.gradle"] - - expect: - settingsGradle.contains("pluginManagement") - settingsGradle.contains("repositories") - settingsGradle.contains("mavenLocal()") - settingsGradle.contains("maven { url \"https://repo.grails.org/grails/core/\" }") - settingsGradle.contains("gradlePluginPortal()") - settingsGradle.contains("id \"org.grails.grails-web\" version \"6.2.1\"") - settingsGradle.contains("id \"org.grails.plugins.views-json\" version \"3.2.3\"") - !settingsGradle.contains("id \"org.grails.grails-gsp\" version \"6.2.1\"") - !settingsGradle.contains("id \"com.bertramlabs.asset-pipeline\" version \"4.3.0\"") - } - - void "test settings.gradle for REST-API for markup-views"() { - given: - final def output = generate(ApplicationType.REST_API, new Options(TestFramework.SPOCK, JdkVersion.JDK_11), ["views-markup"]) + final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK, JdkVersion.JDK_11), ["gradle-settings-file"]) final String settingsGradle = output["settings.gradle"] expect: - settingsGradle.contains("pluginManagement") - settingsGradle.contains("repositories") - settingsGradle.contains("mavenLocal()") - settingsGradle.contains("maven { url \"https://repo.grails.org/grails/core/\" }") - settingsGradle.contains("gradlePluginPortal()") - settingsGradle.contains("id \"org.grails.grails-web\" version \"6.2.1\"") - settingsGradle.contains("id \"org.grails.plugins.views-markup\" version \"3.2.3\"") - !settingsGradle.contains("id \"org.grails.plugins.views-json\" version \"3.2.3\"") - !settingsGradle.contains("id \"org.grails.grails-gsp\" version \"6.2.1\"") - !settingsGradle.contains("id \"com.bertramlabs.asset-pipeline\" version \"4.3.0\"") + settingsGradle.contains("rootProject.name") } } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/asciidoctor/AsciidoctorSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/asciidoctor/AsciidoctorSpec.groovy index 2c9ab388..cbd248d9 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/asciidoctor/AsciidoctorSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/asciidoctor/AsciidoctorSpec.groovy @@ -22,10 +22,9 @@ class AsciidoctorSpec extends ApplicationContextSpec implements CommandOutputFix given: final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK, JdkVersion.JDK_11), ["asciidoctor"]) final def buildGradle = output["build.gradle"] - final def settingGradle = output["settings.gradle"] expect: - settingGradle.contains("id \"org.asciidoctor.jvm.convert\" version \"4.0.0-alpha.1\"") + buildGradle.contains("id \"org.asciidoctor.jvm.convert\" version \"4.0.0-alpha.1\"") buildGradle.contains("apply from: \"gradle/asciidoc.gradle\"") } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy index 7b3414f5..47ca669d 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy @@ -20,18 +20,6 @@ class AssetPipelineSpec extends ApplicationContextSpec implements CommandOutputF features.contains("asset-pipeline-grails") } - void "test buildSrc is present for buildscript dependencies"() { - given: - final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK, JdkVersion.JDK_11)) - final def buildSrcBuildGradle = output["buildSrc/build.gradle"] - - expect: - buildSrcBuildGradle != null - buildSrcBuildGradle.contains("implementation(\"com.bertramlabs.plugins:asset-pipeline-gradle:4.3.0\")") - - } - - void "test dependencies are present for gradle"() { when: final String template = new BuildBuilder(beanContext) @@ -40,7 +28,7 @@ class AssetPipelineSpec extends ApplicationContextSpec implements CommandOutputF then: template.contains("id \"com.bertramlabs.asset-pipeline\"") - template.contains("runtimeOnly(\"com.bertramlabs.plugins:asset-pipeline-grails:4.3.0\")") + template.contains("runtimeOnly \"com.bertramlabs.plugins:asset-pipeline-grails:4.5.1\"") template.contains(''' assets { minifyJs = true diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/cache/EHCacheSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/cache/EHCacheSpec.groovy index efa94099..e3a6a2f3 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/cache/EHCacheSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/cache/EHCacheSpec.groovy @@ -27,7 +27,7 @@ class EHCacheSpec extends ApplicationContextSpec implements CommandOutputFixture .render() then: - template.contains('implementation("org.grails.plugins:cache-ehcache:3.0.0")') + template.contains('implementation "org.grails.plugins:cache-ehcache:3.0.0"') } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/EmbeddedMongoSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/EmbeddedMongoSpec.groovy index c1557ea7..133629a5 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/EmbeddedMongoSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/EmbeddedMongoSpec.groovy @@ -23,7 +23,7 @@ class EmbeddedMongoSpec extends ApplicationContextSpec implements CommandOutputF .render() then: - template.contains("testRuntimeOnly(\"org.grails.plugins:embedded-mongodb:2.0.1\")") + template.contains("testRuntimeOnly \"org.grails.plugins:embedded-mongodb:2.0.1\"") } void "test config"() { diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/HibernateGormSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/HibernateGormSpec.groovy index 91052970..d63552a1 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/HibernateGormSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/HibernateGormSpec.groovy @@ -29,9 +29,9 @@ class HibernateGormSpec extends ApplicationContextSpec implements CommandOutputF .render() then: - template.contains('implementation("org.grails.plugins:hibernate5")') - template.contains("runtimeOnly(\"org.apache.tomcat:tomcat-jdbc\")") - template.contains("runtimeOnly(\"com.h2database:h2\")") + template.contains('implementation "org.grails.plugins:hibernate5"') + template.contains("runtimeOnly \"org.apache.tomcat:tomcat-jdbc\"") + template.contains("runtimeOnly \"com.h2database:h2\"") } void "test dependencies are present for buildSrc"() { @@ -41,17 +41,17 @@ class HibernateGormSpec extends ApplicationContextSpec implements CommandOutputF .renderBuildSrc() then: - template.contains('implementation("org.grails.plugins:hibernate5:8.1.0")') + template.contains('implementation "org.grails.plugins:hibernate5:8.1.0"') } void "test buildSrc is present for buildscript dependencies"() { given: final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK, JdkVersion.JDK_11)) - final def buildSrcBuildGradle = output["buildSrc/build.gradle"] + final def buildGradle = output["build.gradle"] expect: - buildSrcBuildGradle != null - buildSrcBuildGradle.contains("implementation(\"org.grails.plugins:hibernate5:8.1.0\")") + buildGradle != null + buildGradle.contains("classpath \"org.grails.plugins:hibernate5:8.1.0\"") } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/MongoGormSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/MongoGormSpec.groovy index e214d543..949b87d0 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/MongoGormSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/MongoGormSpec.groovy @@ -41,7 +41,7 @@ class MongoGormSpec extends ApplicationContextSpec implements CommandOutputFixtu .render() then: - template.contains("implementation(\"org.grails.plugins:mongodb\")") + template.contains("implementation \"org.grails.plugins:mongodb\"") } void "test gorm mongodb with embedded-mongodb feature"() { @@ -51,8 +51,8 @@ class MongoGormSpec extends ApplicationContextSpec implements CommandOutputFixtu .render() then: - template.contains("implementation(\"org.grails.plugins:mongodb\")") - template.contains("testRuntimeOnly(\"org.grails.plugins:embedded-mongodb:2.0.1\")") + template.contains("implementation \"org.grails.plugins:mongodb\"") + template.contains("testRuntimeOnly \"org.grails.plugins:embedded-mongodb:2.0.1\"") } void "test config"() { diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/MongoSyncSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/MongoSyncSpec.groovy index c818075b..a60f39a3 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/MongoSyncSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/MongoSyncSpec.groovy @@ -33,7 +33,7 @@ class MongoSyncSpec extends ApplicationContextSpec implements CommandOutputFixtu .render() then: - template.contains('implementation("org.mongodb:mongodb-driver-sync:4.11.3")') - template.contains('testImplementation("org.testcontainers:mongodb")') + template.contains('implementation "org.mongodb:mongodb-driver-sync:4.11.3"') + template.contains('testImplementation "org.testcontainers:mongodb"') } } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/MySQLSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/MySQLSpec.groovy index cc7d654f..06d9d9ed 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/MySQLSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/MySQLSpec.groovy @@ -13,7 +13,7 @@ class MySQLSpec extends ApplicationContextSpec { .render() then: - template.contains('runtimeOnly("mysql:mysql-connector-java")') + template.contains('runtimeOnly "mysql:mysql-connector-java"') } void "test there can only be one of DatabaseDriverFeature"() { diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/Neo4JGormSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/Neo4JGormSpec.groovy index b56effa4..03e4978f 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/Neo4JGormSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/Neo4JGormSpec.groovy @@ -32,7 +32,7 @@ class Neo4JGormSpec extends ApplicationContextSpec implements CommandOutputFixtu .render() then: - template.contains("implementation(\"org.grails.plugins:neo4j\")") + template.contains("implementation \"org.grails.plugins:neo4j\"") } void "test config"() { diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/PostgresSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/PostgresSpec.groovy index 8991cebc..0325ce48 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/PostgresSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/PostgresSpec.groovy @@ -13,7 +13,7 @@ class PostgresSpec extends ApplicationContextSpec { .render() then: - template.contains('runtimeOnly("org.postgresql:postgresql")') + template.contains('runtimeOnly "org.postgresql:postgresql"') } void "test there can only be one of DatabaseDriverFeature"() { diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/SQLServerSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/SQLServerSpec.groovy index 658cf8ea..a2a0197f 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/SQLServerSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/SQLServerSpec.groovy @@ -13,7 +13,7 @@ class SQLServerSpec extends ApplicationContextSpec { .render() then: - template.contains('runtimeOnly("com.microsoft.sqlserver:mssql-jdbc")') + template.contains('runtimeOnly "com.microsoft.sqlserver:mssql-jdbc"') } void "test there can only be one of DatabaseDriverFeature"() { diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/TestContainersSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/TestContainersSpec.groovy index ab0e5a34..eaf96719 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/TestContainersSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/TestContainersSpec.groovy @@ -16,8 +16,8 @@ class TestContainersSpec extends ApplicationContextSpec { .render() then: - template.contains('testImplementation("org.testcontainers:mysql")') - template.contains('testImplementation("org.testcontainers:testcontainers")') + template.contains('testImplementation "org.testcontainers:mysql"') + template.contains('testImplementation "org.testcontainers:testcontainers"') } void "test postgres dependency is present for gradle"() { @@ -27,8 +27,8 @@ class TestContainersSpec extends ApplicationContextSpec { .render() then: - template.contains('testImplementation("org.testcontainers:postgresql")') - template.contains('testImplementation("org.testcontainers:testcontainers")') + template.contains('testImplementation "org.testcontainers:postgresql"') + template.contains('testImplementation "org.testcontainers:testcontainers"') } void "test sqlserver dependency is present for gradle"() { @@ -38,8 +38,8 @@ class TestContainersSpec extends ApplicationContextSpec { .render() then: - template.contains('testImplementation("org.testcontainers:mssqlserver")') - template.contains('testImplementation("org.testcontainers:testcontainers")') + template.contains('testImplementation "org.testcontainers:mssqlserver"') + template.contains('testImplementation "org.testcontainers:testcontainers"') } void "test mongo-sync dependency is present for gradle"() { @@ -49,8 +49,8 @@ class TestContainersSpec extends ApplicationContextSpec { .render() then: - template.contains('testImplementation("org.testcontainers:mongodb")') - template.contains('testImplementation("org.testcontainers:testcontainers")') + template.contains('testImplementation "org.testcontainers:mongodb"') + template.contains('testImplementation "org.testcontainers:testcontainers"') } void "test mongo-gorm dependency is present for gradle"() { @@ -60,8 +60,8 @@ class TestContainersSpec extends ApplicationContextSpec { .render() then: - template.contains('testImplementation("org.testcontainers:mongodb")') - template.contains('testImplementation("org.testcontainers:testcontainers")') + template.contains('testImplementation "org.testcontainers:mongodb"') + template.contains('testImplementation "org.testcontainers:testcontainers"') } void "test testcontainers core is present when no testcontainer modules are present for gradle"() { @@ -71,7 +71,7 @@ class TestContainersSpec extends ApplicationContextSpec { .render() then: - template.contains('testImplementation("org.testcontainers:testcontainers")') + template.contains('testImplementation "org.testcontainers:testcontainers"') } void "testframework dependency is present for gradle for feature #feature and spock framework"() { @@ -82,7 +82,7 @@ class TestContainersSpec extends ApplicationContextSpec { .render() then: - template.contains('testImplementation("org.testcontainers:spock")') + template.contains('testImplementation "org.testcontainers:spock"') where: feature << ["mongo-sync", "mysql", "postgres", "sqlserver"] @@ -97,7 +97,7 @@ class TestContainersSpec extends ApplicationContextSpec { .render() then: - template.contains('testImplementation("org.testcontainers:junit-jupiter")') + template.contains('testImplementation "org.testcontainers:junit-jupiter"') where: feature << ["mongo-sync", "mysql", "postgres", "sqlserver"] diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsBaseSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsBaseSpec.groovy index 80627b70..bf5f9d76 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsBaseSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsBaseSpec.groovy @@ -16,9 +16,9 @@ class GrailsBaseSpec extends BeanContextSpec implements CommandOutputFixture { def buildGradle = output['build.gradle'] then: - buildGradle.contains("implementation(\"org.grails:grails-core\")") - buildGradle.contains("implementation(\"org.grails:grails-web-boot\")") - buildGradle.contains("implementation(\"org.grails:grails-logging\")") + buildGradle.contains("implementation \"org.grails:grails-core\"") + buildGradle.contains("implementation \"org.grails:grails-web-boot\"") + buildGradle.contains("implementation \"org.grails:grails-logging\"") } void "test src/main directories are present"() { diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsConsoleSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsConsoleSpec.groovy index edd7a27b..58dc4e37 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsConsoleSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsConsoleSpec.groovy @@ -12,6 +12,6 @@ class GrailsConsoleSpec extends BeanContextSpec { .render() then: - template.contains("console(\"org.grails:grails-console\")") + template.contains("console \"org.grails:grails-console\"") } } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsDefaultPluginsSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsDefaultPluginsSpec.groovy index 90563626..cb3f3ee9 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsDefaultPluginsSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsDefaultPluginsSpec.groovy @@ -15,11 +15,11 @@ class GrailsDefaultPluginsSpec extends ApplicationContextSpec implements Command final String buildGradle = output["build.gradle"] expect: - buildGradle.contains("implementation(\"org.grails:grails-plugin-rest\")") - buildGradle.contains("implementation(\"org.grails:grails-plugin-databinding\")") - buildGradle.contains("implementation(\"org.grails:grails-plugin-i18n\")") - buildGradle.contains("implementation(\"org.grails:grails-plugin-services\")") - buildGradle.contains("implementation(\"org.grails:grails-plugin-interceptors\")") + buildGradle.contains("implementation \"org.grails:grails-plugin-rest\"") + buildGradle.contains("implementation \"org.grails:grails-plugin-databinding\"") + buildGradle.contains("implementation \"org.grails:grails-plugin-i18n\"") + buildGradle.contains("implementation \"org.grails:grails-plugin-services\"") + buildGradle.contains("implementation \"org.grails:grails-plugin-interceptors\"") } void "test i18n message properties files are present"() { diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy index 99474677..cb54f0a6 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy @@ -26,17 +26,17 @@ class GrailsGradlePluginSpec extends BeanContextSpec implements CommandOutputFix .renderBuildSrc() then: - template.contains('implementation("org.grails:grails-gradle-plugin:6.2.1")') + template.contains('implementation "org.grails:grails-gradle-plugin:6.2.1"') } void "test buildSrc is present for buildscript dependencies"() { given: final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK, JdkVersion.JDK_11)) - final def buildSrcBuildGradle = output["buildSrc/build.gradle"] + final def buildGradle = output["build.gradle"] expect: - buildSrcBuildGradle != null - buildSrcBuildGradle.contains("implementation(\"org.grails:grails-gradle-plugin:6.2.1\")") + buildGradle != null + buildGradle.contains("classpath \"org.grails:grails-gradle-plugin:6.2.1\"") } @@ -47,7 +47,7 @@ class GrailsGradlePluginSpec extends BeanContextSpec implements CommandOutputFix .render() then: - template.contains("id \"org.grails.grails-plugin\"") + template.contains("apply plugin: \"org.grails.grails-plugin\"") } } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsWebConsoleSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsWebConsoleSpec.groovy index 19578268..2fa343fb 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsWebConsoleSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsWebConsoleSpec.groovy @@ -22,7 +22,7 @@ class GrailsWebConsoleSpec extends BeanContextSpec { .render() then: - template.contains("runtimeOnly(\"org.grails.plugins:grails-console:2.1.1\")") + template.contains("runtimeOnly \"org.grails.plugins:grails-console:2.1.1\"") } void "test config"() { diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grailsProfiles/GrailsProfilesSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grailsProfiles/GrailsProfilesSpec.groovy index b9fa872c..515793c5 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grailsProfiles/GrailsProfilesSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grailsProfiles/GrailsProfilesSpec.groovy @@ -2,7 +2,6 @@ package org.grails.forge.feature.grailsProfiles import org.grails.forge.ApplicationContextSpec import org.grails.forge.application.ApplicationType -import org.grails.forge.application.generator.GeneratorContext import org.grails.forge.fixture.CommandOutputFixture import org.grails.forge.options.JdkVersion import org.grails.forge.options.Options @@ -19,7 +18,7 @@ class GrailsProfilesSpec extends ApplicationContextSpec implements CommandOutput then: output.containsKey("build.gradle") def build = output.get("build.gradle") - build.contains("profile(\"org.grails.profiles:${applicationType.name.replace("_", "-")}\")") + build.contains("profile \"org.grails.profiles:${applicationType.name.replace("_", "-")}\"") where: applicationType << ApplicationType.values().toList() diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy index 41766499..8a25098a 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy @@ -28,7 +28,7 @@ class GrailsApplicationSpec extends BeanContextSpec implements CommandOutputFixt def buildGradle = output['build.gradle'] then: - buildGradle.contains('mainClass.set("example.grails.Application")') + buildGradle.contains('mainClass.set("example.grails.Application"') where: applicationType << [ApplicationType.WEB, ApplicationType.REST_API] diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/logging/LogbackGroovyConfigSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/logging/LogbackGroovyConfigSpec.groovy index aab15b42..18282669 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/logging/LogbackGroovyConfigSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/logging/LogbackGroovyConfigSpec.groovy @@ -16,8 +16,8 @@ class LogbackGroovyConfigSpec extends ApplicationContextSpec implements CommandO then: output.containsKey("build.gradle") def build = output.get("build.gradle") - build.contains("implementation(\"org.grails:grails-logging\")") - build.contains("implementation(\"io.github.virtualdogbert:logback-groovy-config:1.12.4\")") + build.contains("implementation \"org.grails:grails-logging\"") + build.contains("implementation \"io.github.virtualdogbert:logback-groovy-config:1.12.4\"") where: applicationType << ApplicationType.values().toList() diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/logging/LogbackSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/logging/LogbackSpec.groovy index 00ac0600..14be25b9 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/logging/LogbackSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/logging/LogbackSpec.groovy @@ -16,7 +16,7 @@ class LogbackSpec extends ApplicationContextSpec implements CommandOutputFixture then: output.containsKey("build.gradle") def build = output.get("build.gradle") - build.contains("implementation(\"org.grails:grails-logging\")") + build.contains("implementation \"org.grails:grails-logging\"") where: applicationType << ApplicationType.values().toList() diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/micronaut/MicronautHttpClientSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/micronaut/MicronautHttpClientSpec.groovy index c2372e06..00a07e66 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/micronaut/MicronautHttpClientSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/micronaut/MicronautHttpClientSpec.groovy @@ -13,6 +13,6 @@ class MicronautHttpClientSpec extends BeanContextSpec { .render() then: - template.contains("implementation(\"io.micronaut:micronaut-http-client\")") + template.contains("implementation \"io.micronaut:micronaut-http-client\"") } } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/micronaut/MicronautInjectGroovySpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/micronaut/MicronautInjectGroovySpec.groovy index cfb2f57f..dc529a6a 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/micronaut/MicronautInjectGroovySpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/micronaut/MicronautInjectGroovySpec.groovy @@ -12,7 +12,7 @@ class MicronautInjectGroovySpec extends BeanContextSpec { .render() then: - template.contains("compileOnly(\"io.micronaut:micronaut-inject-groovy\")") - template.contains("testImplementation(\"io.micronaut:micronaut-inject-groovy\")") + template.contains("compileOnly \"io.micronaut:micronaut-inject-groovy\"") + template.contains("testImplementation \"io.micronaut:micronaut-inject-groovy\"") } } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/reloading/SpringBootDevToolsSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/reloading/SpringBootDevToolsSpec.groovy index 08033e84..349de446 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/reloading/SpringBootDevToolsSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/reloading/SpringBootDevToolsSpec.groovy @@ -24,7 +24,7 @@ class SpringBootDevToolsSpec extends ApplicationContextSpec implements CommandOu def build = output["build.gradle"] then: - build.contains("developmentOnly(\"org.springframework.boot:spring-boot-devtools\"") + build.contains("developmentOnly \"org.springframework.boot:spring-boot-devtools\"") where: applicationType << [ApplicationType.WEB, ApplicationType.REST_API] diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringBootSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringBootSpec.groovy index 5b8f61ae..818f4164 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringBootSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringBootSpec.groovy @@ -20,11 +20,11 @@ class SpringBootSpec extends BeanContextSpec implements CommandOutputFixture { final String build = output['build.gradle'] then: - build.contains("implementation(\"org.springframework.boot:spring-boot-starter\")") - build.contains("implementation(\"org.springframework.boot:spring-boot-starter-actuator\")") - build.contains("implementation(\"org.springframework.boot:spring-boot-starter-logging\")") - build.contains("implementation(\"org.springframework.boot:spring-boot-starter-validation\")") - build.contains("implementation(\"org.springframework.boot:spring-boot-autoconfigure\")") + build.contains("implementation \"org.springframework.boot:spring-boot-starter\"") + build.contains("implementation \"org.springframework.boot:spring-boot-starter-actuator\"") + build.contains("implementation \"org.springframework.boot:spring-boot-starter-logging\"") + build.contains("implementation \"org.springframework.boot:spring-boot-starter-validation\"") + build.contains("implementation \"org.springframework.boot:spring-boot-autoconfigure\"") where: applicationType << [ApplicationType.WEB, ApplicationType.REST_API, ApplicationType.WEB_PLUGIN] @@ -39,11 +39,11 @@ class SpringBootSpec extends BeanContextSpec implements CommandOutputFixture { final String build = output['build.gradle'] then: - !build.contains("implementation(\"org.springframework.boot:spring-boot-starter\")") - !build.contains("implementation(\"org.springframework.boot:spring-boot-starter-actuator\")") - build.contains("implementation(\"org.springframework.boot:spring-boot-starter-logging\")") - build.contains("implementation(\"org.springframework.boot:spring-boot-starter-validation\")") - build.contains("implementation(\"org.springframework.boot:spring-boot-autoconfigure\")") - !build.contains("implementation(\"org.springframework.boot:spring-boot-starter-tomcat\")") + !build.contains("implementation \"org.springframework.boot:spring-boot-starter\"") + !build.contains("implementation \"org.springframework.boot:spring-boot-starter-actuator\"") + build.contains("implementation \"org.springframework.boot:spring-boot-starter-logging\"") + build.contains("implementation \"org.springframework.boot:spring-boot-starter-validation\"") + build.contains("implementation \"org.springframework.boot:spring-boot-autoconfigure\"") + !build.contains("implementation \"org.springframework.boot:spring-boot-starter-tomcat\"") } } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/GebSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/GebSpec.groovy index b01b877e..1f77346b 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/GebSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/GebSpec.groovy @@ -17,12 +17,12 @@ class GebSpec extends ApplicationContextSpec implements CommandOutputFixture { final def buildGradle = output["build.gradle"] expect: - buildGradle.contains("testImplementation(\"org.grails.plugins:geb\")") - buildGradle.contains("testImplementation(\"org.seleniumhq.selenium:selenium-api:4.19.1\")") - buildGradle.contains("testImplementation(\"org.seleniumhq.selenium:selenium-support:4.19.1\")") - buildGradle.contains("testImplementation(\"org.seleniumhq.selenium:selenium-remote-driver:4.19.1\")") - buildGradle.contains("testRuntimeOnly(\"org.seleniumhq.selenium:selenium-chrome-driver:4.19.1\")") - buildGradle.contains("testRuntimeOnly(\"org.seleniumhq.selenium:selenium-firefox-driver:4.19.1\")") + buildGradle.contains("testImplementation \"org.grails.plugins:geb\"") + buildGradle.contains("testImplementation \"org.seleniumhq.selenium:selenium-api:4.19.1\"") + buildGradle.contains("testImplementation \"org.seleniumhq.selenium:selenium-support:4.19.1\"") + buildGradle.contains("testImplementation \"org.seleniumhq.selenium:selenium-remote-driver:4.19.1\"") + buildGradle.contains("testRuntimeOnly \"org.seleniumhq.selenium:selenium-chrome-driver:4.19.1\"") + buildGradle.contains("testRuntimeOnly \"org.seleniumhq.selenium:selenium-firefox-driver:4.19.1\"") } void "test GebConfig.groovy file is present"() { @@ -61,11 +61,9 @@ class GebSpec extends ApplicationContextSpec implements CommandOutputFixture { given: final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK, JdkVersion.JDK_11)) final def buildGradle = output["build.gradle"] - final def settingGradle = output["settings.gradle"] expect: - settingGradle.contains("id \"com.github.erdi.webdriver-binaries\" version \"3.2\"") - buildGradle.contains("id \"com.github.erdi.webdriver-binaries\"") + buildGradle.contains("id \"com.github.erdi.webdriver-binaries\" version \"3.2\"") buildGradle.contains("webdriverBinaries") buildGradle.contains("chromedriver '122.0.6260.0'") buildGradle.contains("geckodriver '0.33.0'") @@ -76,11 +74,9 @@ class GebSpec extends ApplicationContextSpec implements CommandOutputFixture { given: final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK, JdkVersion.JDK_11, OperatingSystem.WINDOWS)) final def buildGradle = output["build.gradle"] - final def settingGradle = output["settings.gradle"] expect: - settingGradle.contains("id \"com.github.erdi.webdriver-binaries\" version \"3.2\"") - buildGradle.contains("id \"com.github.erdi.webdriver-binaries\"") + buildGradle.contains("id \"com.github.erdi.webdriver-binaries\" version \"3.2\"") buildGradle.contains("webdriverBinaries") buildGradle.contains("chromedriver '122.0.6260.0'") buildGradle.contains("geckodriver '0.33.0'") diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/JUnitSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/JUnitSpec.groovy index f610876d..d2bbc31d 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/JUnitSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/JUnitSpec.groovy @@ -15,6 +15,6 @@ class JUnitSpec extends ApplicationContextSpec implements CommandOutputFixture { final String buildGradle = output["build.gradle"] then: - buildGradle.contains("testImplementation(\"org.junit.jupiter:junit-jupiter") + buildGradle.contains("testImplementation \"org.junit.jupiter:junit-jupiter") } } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/SpockSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/SpockSpec.groovy index 358b02c7..41c84028 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/SpockSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/SpockSpec.groovy @@ -13,7 +13,7 @@ class SpockSpec extends ApplicationContextSpec implements CommandOutputFixture { final String buildGradle = output["build.gradle"] then: - buildGradle.contains("testImplementation(\"org.spockframework:spock-core\")") + buildGradle.contains("testImplementation \"org.spockframework:spock-core\"") buildGradle.contains("useJUnitPlatform()") } } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GrailsGspSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GrailsGspSpec.groovy index 1f49790e..4972fe71 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GrailsGspSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GrailsGspSpec.groovy @@ -30,9 +30,9 @@ class GrailsGspSpec extends ApplicationContextSpec implements CommandOutputFixtu .render() then: - template.contains("id \"org.grails.grails-web\"") + template.contains("apply plugin: \"org.grails.grails-web\"") template.contains("id \"org.grails.grails-gsp\"") - template.contains("implementation(\"org.grails.plugins:gsp\")") + template.contains("implementation \"org.grails.plugins:gsp\"") } void "test gsp configuration"() { @@ -87,9 +87,9 @@ class GrailsGspSpec extends ApplicationContextSpec implements CommandOutputFixtu final String build = output['build.gradle'] then: - build.contains('id "org.grails.grails-web"') - build.contains('id "org.grails.grails-gsp"') - build.contains("implementation(\"org.grails.plugins:gsp\")") + build.contains('apply plugin: "org.grails.grails-web"') + build.contains('apply plugin: "org.grails.grails-gsp"') + build.contains("implementation \"org.grails.plugins:gsp\"") where: applicationType << [ApplicationType.WEB, ApplicationType.WEB_PLUGIN] @@ -103,7 +103,7 @@ class GrailsGspSpec extends ApplicationContextSpec implements CommandOutputFixtu then: !build.contains('id "org.grails.grails-gsp"') - !build.contains("implementation(\"org.grails.plugins:gsp\")") + !build.contains("implementation \"org.grails.plugins:gsp\"") where: applicationType << [ApplicationType.PLUGIN, ApplicationType.REST_API] diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/ScaffoldingSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/ScaffoldingSpec.groovy index 8dd3b201..0edecfa2 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/ScaffoldingSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/ScaffoldingSpec.groovy @@ -22,8 +22,8 @@ class ScaffoldingSpec extends ApplicationContextSpec implements CommandOutputFix .render() then: - template.contains('implementation("org.grails.plugins:scaffolding")') - template.contains('runtimeOnly("org.fusesource.jansi:jansi:1.18")') + template.contains('implementation "org.grails.plugins:scaffolding"') + template.contains('runtimeOnly "org.fusesource.jansi:jansi:1.18"') } } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewJsonSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewJsonSpec.groovy index 52ec73ec..d0a11588 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewJsonSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewJsonSpec.groovy @@ -29,11 +29,11 @@ class ViewJsonSpec extends ApplicationContextSpec implements CommandOutputFixtur .render() then: - template.contains("id \"org.grails.grails-web\"") + template.contains("apply plugin: \"org.grails.grails-web\"") template.contains("id \"org.grails.plugins.views-json\"") - template.contains("implementation(\"org.grails.plugins:views-json\"") - template.contains("implementation(\"org.grails.plugins:views-json-templates\"") - template.contains("testImplementation(\"org.grails:views-json-testing-support\"") + template.contains("implementation \"org.grails.plugins:views-json\"") + template.contains("implementation \"org.grails.plugins:views-json-templates\"") + template.contains("testImplementation \"org.grails:views-json-testing-support\"") } void "test default gson views are present"() { @@ -55,11 +55,11 @@ class ViewJsonSpec extends ApplicationContextSpec implements CommandOutputFixtur final String build = output['build.gradle'] then: - build.contains("id \"org.grails.grails-web\"") + build.contains("apply plugin: \"org.grails.grails-web\"") build.contains("id \"org.grails.plugins.views-json\"") - build.contains("implementation(\"org.grails.plugins:views-json\"") - build.contains("implementation(\"org.grails.plugins:views-json-templates\"") - build.contains("testImplementation(\"org.grails:views-json-testing-support\"") + build.contains("implementation \"org.grails.plugins:views-json\"") + build.contains("implementation \"org.grails.plugins:views-json-templates\"") + build.contains("testImplementation \"org.grails:views-json-testing-support\"") where: applicationType << [ApplicationType.REST_API] @@ -73,9 +73,9 @@ class ViewJsonSpec extends ApplicationContextSpec implements CommandOutputFixtur then: !build.contains("id \"org.grails.plugins.views-json\"") - !build.contains("implementation(\"org.grails.plugins:views-json\"") - !build.contains("implementation(\"org.grails.plugins:views-json-templates\"") - !build.contains("testImplementation(\"org.grails:views-json-testing-support\"") + !build.contains("implementation \"org.grails.plugins:views-json\"") + !build.contains("implementation \"org.grails.plugins:views-json-templates\"") + !build.contains("testImplementation \"org.grails:views-json-testing-support\"") where: applicationType << [ApplicationType.WEB, ApplicationType.WEB_PLUGIN, ApplicationType.PLUGIN] diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewMarkupSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewMarkupSpec.groovy index 4f7d9e1c..85c3efcd 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewMarkupSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewMarkupSpec.groovy @@ -27,9 +27,9 @@ class ViewMarkupSpec extends ApplicationContextSpec implements CommandOutputFixt .render() then: - template.contains("id \"org.grails.grails-web\"") + template.contains("apply plugin: \"org.grails.grails-web\"") template.contains("id \"org.grails.plugins.views-markup\"") - template.contains("implementation(\"org.grails.plugins:views-markup\"") + template.contains("implementation \"org.grails.plugins:views-markup\"") !template.contains("id \"org.grails.plugins.views-json\"") } @@ -52,12 +52,12 @@ class ViewMarkupSpec extends ApplicationContextSpec implements CommandOutputFixt final String build = output['build.gradle'] then: - build.contains("id \"org.grails.grails-web\"") + build.contains("apply plugin: \"org.grails.grails-web\"") build.contains("id \"org.grails.plugins.views-markup\"") - build.contains("implementation(\"org.grails.plugins:views-markup\"") + build.contains("implementation \"org.grails.plugins:views-markup\"") !build.contains("id \"org.grails.plugins.views-json\"") - !build.contains("implementation(\"org.grails.plugins:views-json\"") - !build.contains("implementation(\"org.grails:views-json-testing-support\"") + !build.contains("implementation \"org.grails.plugins:views-json\"") + !build.contains("implementation \"org.grails:views-json-testing-support\"") where: applicationType << [ApplicationType.REST_API] diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/web/GrailsWebSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/web/GrailsWebSpec.groovy index b5743afc..07353bb5 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/web/GrailsWebSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/web/GrailsWebSpec.groovy @@ -16,7 +16,7 @@ class GrailsWebSpec extends ApplicationContextSpec implements CommandOutputFixtu final def buildGradle = output["build.gradle"] expect: - buildGradle.contains("id \"org.grails.grails-web\"") + buildGradle.contains("apply plugin: \"org.grails.grails-web\"") } void "test grails-web configuration"() { diff --git a/test-core/src/test/groovy/org/grails/forge/features/scaffolding/ScaffoldingSpec.groovy b/test-core/src/test/groovy/org/grails/forge/features/scaffolding/ScaffoldingSpec.groovy index f5c0b1f8..05f794a7 100644 --- a/test-core/src/test/groovy/org/grails/forge/features/scaffolding/ScaffoldingSpec.groovy +++ b/test-core/src/test/groovy/org/grails/forge/features/scaffolding/ScaffoldingSpec.groovy @@ -1,7 +1,5 @@ package org.grails.forge.features.scaffolding -import org.gradle.testkit.runner.BuildResult -import org.grails.forge.options.Language import org.grails.forge.utils.CommandSpec class ScaffoldingSpec extends CommandSpec { @@ -23,10 +21,14 @@ class Bird { final String output = executeGradle("runCommand", "-Pargs=generate-controller example.grails.Bird").getOutput() then: - output.contains('Rendered template Controller.groovy to destination grails-app/controllers/example/grails/BirdController.groovy') - output.contains('Rendered template Service.groovy to destination grails-app/services/example/grails/BirdService.groovy') - output.contains('Rendered template Spec.groovy to destination src/test/groovy/example/grails/BirdControllerSpec.groovy') - output.contains('Rendered template ServiceSpec.groovy to destination src/test/groovy/example/grails/BirdServiceSpec.groovy') + output.contains('Rendered template Controller.groovy to destination grails-app') + output.contains('BirdController.groovy') + output.contains('Rendered template Service.groovy to destination grails-app') + output.contains('BirdService.groovy') + output.contains('Rendered template Spec.groovy to destination src') + output.contains('BirdControllerSpec.groovy') + output.contains('Rendered template ServiceSpec.groovy to destination src') + output.contains('BirdServiceSpec.groovy') new File(dir, "grails-app/controllers/example/grails/BirdController.groovy").exists() new File(dir, "grails-app/services/example/grails/BirdService.groovy").exists() new File(dir, "src/test/groovy/example/grails/BirdControllerSpec.groovy").exists() From 0b75637eff8c6a2bd84569c260465876c1d62a23 Mon Sep 17 00:00:00 2001 From: James Fredley Date: Sun, 10 Nov 2024 19:30:33 -0500 Subject: [PATCH 05/37] fix failing test after Gradle plugin configuration consolidation --- .../groovy/org/grails/forge/feature/view/GrailsGspSpec.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GrailsGspSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GrailsGspSpec.groovy index 4972fe71..3abe46e3 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GrailsGspSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GrailsGspSpec.groovy @@ -31,7 +31,7 @@ class GrailsGspSpec extends ApplicationContextSpec implements CommandOutputFixtu then: template.contains("apply plugin: \"org.grails.grails-web\"") - template.contains("id \"org.grails.grails-gsp\"") + template.contains("apply plugin: \"org.grails.grails-gsp\"") template.contains("implementation \"org.grails.plugins:gsp\"") } From 093b84c9f3178e7f67eae8f265373e15bb7c9706 Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Mon, 11 Nov 2024 09:58:17 +0100 Subject: [PATCH 06/37] fix: Tests working on Windows --- .../src/test/groovy/org/grails/forge/cli/CommandSpec.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-cli/src/test/groovy/org/grails/forge/cli/CommandSpec.groovy b/grails-cli/src/test/groovy/org/grails/forge/cli/CommandSpec.groovy index 00471e0e..5bc52268 100644 --- a/grails-cli/src/test/groovy/org/grails/forge/cli/CommandSpec.groovy +++ b/grails-cli/src/test/groovy/org/grails/forge/cli/CommandSpec.groovy @@ -47,7 +47,7 @@ class CommandSpec extends Specification { Process executeGradleCommand(String command) { StringBuilder gradleCommand = new StringBuilder() if (spock.util.environment.OperatingSystem.current.isWindows()) { - gradleCommand.append("gradlew.bat") + gradleCommand.append("cmd /c gradlew.bat") } else { gradleCommand.append("./gradlew") } From fad7db845410da6ba52a233260a861ef476484fe Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Mon, 11 Nov 2024 10:00:35 +0100 Subject: [PATCH 07/37] test: Add tests for optional build file features --- .../forge/build/gradle/GradleSpec.groovy | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy index ed6d616e..9b676fa0 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy @@ -40,4 +40,33 @@ class GradleSpec extends ApplicationContextSpec implements CommandOutputFixture expect: settingsGradle.contains("rootProject.name") } + + void "test buildSrc/build.gradle"() { + given: + def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK, JdkVersion.JDK_11), ["gradle-build-src"]) + String buildSrcGradle = output["buildSrc/build.gradle"] + + expect: + buildSrcGradle + buildSrcGradle.contains('repositories') + buildSrcGradle.contains('dependencies') + } + + void "no settings.gradle file is created without the 'gradle-settings-file' feature"() { + given: + def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK, JdkVersion.JDK_11)) + String settingsGradle = output["settings.gradle"] + + expect: + !settingsGradle + } + + void "no buildSrc/build.gradle file is created without the 'gradle-build-src' feature"() { + given: + def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK, JdkVersion.JDK_11)) + String buildSrcGradle = output["buildSrc/settings.gradle"] + + expect: + !buildSrcGradle + } } From 2747012eda371746b8c01a90c73e52fee039939b Mon Sep 17 00:00:00 2001 From: James Fredley Date: Mon, 11 Nov 2024 10:36:12 -0500 Subject: [PATCH 08/37] Update asset-pipeline to 4.5.2 --- grails-forge-core/src/main/resources/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grails-forge-core/src/main/resources/pom.xml b/grails-forge-core/src/main/resources/pom.xml index 56f7cf8a..c81d6d4a 100644 --- a/grails-forge-core/src/main/resources/pom.xml +++ b/grails-forge-core/src/main/resources/pom.xml @@ -125,12 +125,12 @@ com.bertramlabs.plugins asset-pipeline-grails - 4.5.1 + 4.5.2 com.bertramlabs.plugins asset-pipeline-gradle - 4.5.1 + 4.5.2 org.junit.jupiter From c604a96382e916830a0548b94859a1735e5adaf1 Mon Sep 17 00:00:00 2001 From: James Fredley Date: Mon, 11 Nov 2024 11:02:52 -0500 Subject: [PATCH 09/37] Update asset-pipeline to 4.5.2 in test --- .../grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy index 47ca669d..f41e4f50 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy @@ -28,7 +28,7 @@ class AssetPipelineSpec extends ApplicationContextSpec implements CommandOutputF then: template.contains("id \"com.bertramlabs.asset-pipeline\"") - template.contains("runtimeOnly \"com.bertramlabs.plugins:asset-pipeline-grails:4.5.1\"") + template.contains("runtimeOnly \"com.bertramlabs.plugins:asset-pipeline-grails:4.5.2\"") template.contains(''' assets { minifyJs = true From 23ab1bd8a253c4266faa7f8b95bbf30d93f40232 Mon Sep 17 00:00:00 2001 From: James Fredley Date: Mon, 11 Nov 2024 11:06:45 -0500 Subject: [PATCH 10/37] Adjust mainClass syntax --- .../forge/feature/build/gradle/templates/buildGradle.rocker.raw | 2 +- .../org/grails/forge/feature/lang/GrailsApplicationSpec.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildGradle.rocker.raw b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildGradle.rocker.raw index 4f59b135..483c6c9d 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildGradle.rocker.raw +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildGradle.rocker.raw @@ -85,7 +85,7 @@ configurations { @if (features.mainClass().isPresent()) { application { - mainClass.set("@features.mainClass().get()") + mainClass = "@features.mainClass().get()" } } diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy index 8a25098a..b27baffd 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy @@ -28,7 +28,7 @@ class GrailsApplicationSpec extends BeanContextSpec implements CommandOutputFixt def buildGradle = output['build.gradle'] then: - buildGradle.contains('mainClass.set("example.grails.Application"') + buildGradle.contains('mainClass = "example.grails.Application"') where: applicationType << [ApplicationType.WEB, ApplicationType.REST_API] From f1b53a1f08abbb90a1021170ad0ef62f1ee0066d Mon Sep 17 00:00:00 2001 From: James Fredley Date: Mon, 11 Nov 2024 11:30:18 -0500 Subject: [PATCH 11/37] fix spacing when using bom/platform --- .../org/grails/forge/build/gradle/GradleDependency.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java b/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java index 5e8cb5f1..769d4af1 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java +++ b/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java @@ -99,12 +99,11 @@ public int hashCode() { @NonNull public String toSnippet() { - String snippet = gradleConfiguration.getConfigurationName(); + String snippet = gradleConfiguration.getConfigurationName() + " "; if (isPom()) { - String platformPrefix = " "; - snippet += platformPrefix + "platform ("; + snippet += "platform("; } - snippet += " \"" + getGroupId() + ':' + getArtifactId() + + snippet += "\"" + getGroupId() + ':' + getArtifactId() + (getVersion() != null ? (':' + getVersion()) : "") + "\""; if (isPom()) { snippet += ")"; From e2186a24d07030d744dec2150f370f2c57d7a8fa Mon Sep 17 00:00:00 2001 From: James Fredley Date: Mon, 11 Nov 2024 14:52:32 -0500 Subject: [PATCH 12/37] back to asset-pipeline 4.5.1 --- grails-forge-core/src/main/resources/pom.xml | 4 ++-- .../forge/feature/assetPipeline/AssetPipelineSpec.groovy | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/grails-forge-core/src/main/resources/pom.xml b/grails-forge-core/src/main/resources/pom.xml index c81d6d4a..56f7cf8a 100644 --- a/grails-forge-core/src/main/resources/pom.xml +++ b/grails-forge-core/src/main/resources/pom.xml @@ -125,12 +125,12 @@ com.bertramlabs.plugins asset-pipeline-grails - 4.5.2 + 4.5.1 com.bertramlabs.plugins asset-pipeline-gradle - 4.5.2 + 4.5.1 org.junit.jupiter diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy index f41e4f50..47ca669d 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy @@ -28,7 +28,7 @@ class AssetPipelineSpec extends ApplicationContextSpec implements CommandOutputF then: template.contains("id \"com.bertramlabs.asset-pipeline\"") - template.contains("runtimeOnly \"com.bertramlabs.plugins:asset-pipeline-grails:4.5.2\"") + template.contains("runtimeOnly \"com.bertramlabs.plugins:asset-pipeline-grails:4.5.1\"") template.contains(''' assets { minifyJs = true From 3647ba8eb162a7ec692a59d84337f47a503e070d Mon Sep 17 00:00:00 2001 From: James Fredley Date: Mon, 11 Nov 2024 15:57:13 -0500 Subject: [PATCH 13/37] move hamcrest, micronaut-http-client and neo4j-harness dependencies to features instead of manually being set in dependencies.rocker.raw remove dependencies.rocker.raw since it duplicates toSnippet() rename RUNTIME to RUNTIME_ONLY, TEST to TEST_IMPLEMENTATION and TEST_RUNTIME to TEST_RUNTIME_ONLY to reflect the actual Gradle scope --- .../grails/forge/build/dependencies/Dependency.java | 12 ++++++------ .../org/grails/forge/build/dependencies/Scope.java | 6 +++--- .../forge/feature/assetPipeline/AssetPipeline.java | 2 +- .../build/gradle/templates/dependencies.rocker.raw | 12 ------------ .../build/gradle/templates/dependency.rocker.raw | 3 --- .../grails/forge/feature/database/EmbeddedMongo.java | 2 +- .../java/org/grails/forge/feature/database/H2.java | 2 +- .../grails/forge/feature/database/HibernateGorm.java | 2 +- .../org/grails/forge/feature/database/MySQL.java | 2 +- .../org/grails/forge/feature/database/Neo4jGorm.java | 5 +++++ .../grails/forge/feature/database/PostgreSQL.java | 2 +- .../org/grails/forge/feature/database/SQLServer.java | 2 +- .../forge/feature/database/TestContainers.java | 2 +- .../forge/feature/grails/GrailsWebConsole.java | 2 +- .../feature/micronaut/MicronautInjectGroovy.java | 2 +- .../forge/feature/other/MicronautHttpClient.java | 5 +++++ .../java/org/grails/forge/feature/test/AssertJ.java | 2 +- .../main/java/org/grails/forge/feature/test/Geb.java | 10 +++++----- .../forge/feature/test/GormTestingSupport.java | 2 +- .../forge/feature/test/GrailsWebTestingSupport.java | 2 +- .../java/org/grails/forge/feature/test/Hamcrest.java | 10 ++++++++++ .../java/org/grails/forge/feature/test/Junit.java | 2 +- .../java/org/grails/forge/feature/test/Mockito.java | 2 +- .../java/org/grails/forge/feature/test/Spock.java | 2 +- .../forge/feature/test/ViewsJsonTestingSupport.java | 2 +- .../org/grails/forge/feature/view/Scaffolding.java | 2 +- .../org/grails/forge/feature/view/json/ViewJson.java | 2 +- .../GradleDependencyComparatorSpec.groovy | 11 +++++------ 28 files changed, 58 insertions(+), 54 deletions(-) delete mode 100644 grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/dependency.rocker.raw diff --git a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java index 1b5f345e..d0f97be9 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java +++ b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java @@ -195,12 +195,12 @@ public Builder compileOnly() { return scope(Scope.COMPILE_ONLY); } - public Builder runtime() { - return scope(Scope.RUNTIME); + public Builder runtimeOnly() { + return scope(Scope.RUNTIME_ONLY); } - public Builder test() { - return scope(Scope.TEST); + public Builder testImplementation() { + return scope(Scope.TEST_IMPLEMENTATION); } @SuppressWarnings("unused") @@ -208,8 +208,8 @@ public Builder testCompileOnly() { return scope(Scope.TEST_COMPILE_ONLY); } - public Builder testRuntime() { - return scope(Scope.TEST_RUNTIME); + public Builder testRuntimeOnly() { + return scope(Scope.TEST_RUNTIME_ONLY); } public Builder annotationProcessor() { diff --git a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java index dab1c1ef..7710a279 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java +++ b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java @@ -30,11 +30,11 @@ public class Scope { public static final Scope COMPILE_ONLY = new Scope(Source.MAIN, Collections.singletonList(Phase.COMPILATION)); public static final Scope CONSOLE = new Scope(Source.MAIN, Collections.singletonList(Phase.CONSOLE)); public static final Scope DEVELOPMENT_ONLY = new Scope(Source.MAIN, Collections.singletonList(Phase.DEVELOPMENT_ONLY)); - public static final Scope RUNTIME = new Scope(Source.MAIN, Collections.singletonList(Phase.RUNTIME)); - public static final Scope TEST = new Scope(Source.TEST, Arrays.asList(Phase.COMPILATION, Phase.RUNTIME)); + public static final Scope RUNTIME_ONLY = new Scope(Source.MAIN, Collections.singletonList(Phase.RUNTIME)); + public static final Scope TEST_IMPLEMENTATION = new Scope(Source.TEST, Arrays.asList(Phase.COMPILATION, Phase.RUNTIME)); public static final Scope TEST_ANNOTATION_PROCESSOR = new Scope(Source.TEST, Collections.singletonList(Phase.ANNOTATION_PROCESSING)); public static final Scope TEST_COMPILE_ONLY = new Scope(Source.TEST, Collections.singletonList(Phase.COMPILATION)); - public static final Scope TEST_RUNTIME = new Scope(Source.TEST, Collections.singletonList(Phase.RUNTIME)); + public static final Scope TEST_RUNTIME_ONLY = new Scope(Source.TEST, Collections.singletonList(Phase.RUNTIME)); public static final Scope OPENREWRITE = new Scope(Source.MAIN, Collections.singletonList(Phase.OPENREWRITE)); public static final Scope PROFILE = new Scope(Source.MAIN, Collections.singletonList(Phase.PROFILE)); public static final Scope CLASSPATH = new Scope(Source.BUILDSCRIPT, Collections.singletonList(Phase.BUILD)); diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/assetPipeline/AssetPipeline.java b/grails-forge-core/src/main/java/org/grails/forge/feature/assetPipeline/AssetPipeline.java index 1c4fd299..d08eb6df 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/assetPipeline/AssetPipeline.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/assetPipeline/AssetPipeline.java @@ -70,7 +70,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("com.bertramlabs.plugins") .lookupArtifactId("asset-pipeline-grails") - .runtime()); + .runtimeOnly()); final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); generatorContext.addTemplate("advancedgrails_svg", new URLTemplate("grails-app/assets/images/advancedgrails.svg", classLoader.getResource("assets/images/advancedgrails.svg"))); diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/dependencies.rocker.raw b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/dependencies.rocker.raw index 9f5c9f21..7e5c5c02 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/dependencies.rocker.raw +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/dependencies.rocker.raw @@ -2,7 +2,6 @@ @import org.grails.forge.application.Project @import org.grails.forge.build.gradle.GradleBuild @import org.grails.forge.build.gradle.GradleDependency -@import org.grails.forge.feature.build.gradle.templates.dependency @import org.grails.forge.feature.Features @args ( @@ -16,15 +15,4 @@ dependencies { @for (GradleDependency dependency : gradleBuild.getDependencies()) { @dependency.toSnippet() } - -@if (features.contains("hamcrest")) { - @dependency.template("org.hamcrest","hamcrest", "testImplementation", null, false) -} - -@if (!features.contains("micronaut-http-client")) { - @dependency.template("io.micronaut", "micronaut-http-client", "testImplementation", null, false) -} -@if (features.contains("neo4j-bolt")) { - @dependency.template("org.neo4j.test", "neo4j-harness", "testRuntimeOnly", null, false) -} } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/dependency.rocker.raw b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/dependency.rocker.raw deleted file mode 100644 index 2b5e40b4..00000000 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/dependency.rocker.raw +++ /dev/null @@ -1,3 +0,0 @@ -@args(String groupId, String artifactId, String scope, String version, boolean pom) - -@(pom ? scope + " platform" : scope) "@groupId:@artifactId@(version != null ? ":" + version : "")" diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/database/EmbeddedMongo.java b/grails-forge-core/src/main/java/org/grails/forge/feature/database/EmbeddedMongo.java index 148baccb..18f7e9df 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/database/EmbeddedMongo.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/database/EmbeddedMongo.java @@ -83,6 +83,6 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .lookupArtifactId("embedded-mongodb") - .scope(Scope.TEST_RUNTIME)); + .scope(Scope.TEST_RUNTIME_ONLY)); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/database/H2.java b/grails-forge-core/src/main/java/org/grails/forge/feature/database/H2.java index d6656799..085051cd 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/database/H2.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/database/H2.java @@ -84,6 +84,6 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("com.h2database") .artifactId("h2") - .runtime()); + .runtimeOnly()); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java b/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java index f179b6c0..a8c28955 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java @@ -90,7 +90,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.apache.tomcat") .artifactId("tomcat-jdbc") - .runtime()); + .runtimeOnly()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/database/MySQL.java b/grails-forge-core/src/main/java/org/grails/forge/feature/database/MySQL.java index a513ffa6..b33e9fe9 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/database/MySQL.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/database/MySQL.java @@ -88,6 +88,6 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("mysql") .artifactId("mysql-connector-java") - .runtime()); + .runtimeOnly()); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/database/Neo4jGorm.java b/grails-forge-core/src/main/java/org/grails/forge/feature/database/Neo4jGorm.java index 51f829a8..59a7fddd 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/database/Neo4jGorm.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/database/Neo4jGorm.java @@ -54,6 +54,11 @@ public void apply(GeneratorContext generatorContext) { .groupId("org.grails.plugins") .artifactId("neo4j") .compile()); + + generatorContext.addDependency(Dependency.builder() + .groupId("org.neo4j.test") + .artifactId("neo4j-harness") + .testRuntimeOnly()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/database/PostgreSQL.java b/grails-forge-core/src/main/java/org/grails/forge/feature/database/PostgreSQL.java index bf7a45f9..466079b7 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/database/PostgreSQL.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/database/PostgreSQL.java @@ -89,6 +89,6 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.postgresql") .artifactId("postgresql") - .runtime()); + .runtimeOnly()); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/database/SQLServer.java b/grails-forge-core/src/main/java/org/grails/forge/feature/database/SQLServer.java index 162ce4d4..ae78d6c3 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/database/SQLServer.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/database/SQLServer.java @@ -88,6 +88,6 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("com.microsoft.sqlserver") .artifactId("mssql-jdbc") - .runtime()); + .runtimeOnly()); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/database/TestContainers.java b/grails-forge-core/src/main/java/org/grails/forge/feature/database/TestContainers.java index 1d5b4f93..e7452d7e 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/database/TestContainers.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/database/TestContainers.java @@ -83,7 +83,7 @@ private static Dependency.Builder testContainerTestDependency(@NonNull String ar return Dependency.builder() .groupId(TESTCONTAINERS_GROUP_ID) .artifactId(artifactId) - .test(); + .testImplementation(); } @NonNull diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsWebConsole.java b/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsWebConsole.java index e1af6b1f..a455a3b4 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsWebConsole.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsWebConsole.java @@ -52,7 +52,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .lookupArtifactId("grails-console") - .runtime()); + .runtimeOnly()); final Map config = generatorContext.getConfiguration(); config.put("environments.production.grails.plugin.console.enabled", false); diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/micronaut/MicronautInjectGroovy.java b/grails-forge-core/src/main/java/org/grails/forge/feature/micronaut/MicronautInjectGroovy.java index 19ebd9e6..7a98f307 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/micronaut/MicronautInjectGroovy.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/micronaut/MicronautInjectGroovy.java @@ -51,6 +51,6 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("io.micronaut") .artifactId("micronaut-inject-groovy") - .test()); + .testImplementation()); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/other/MicronautHttpClient.java b/grails-forge-core/src/main/java/org/grails/forge/feature/other/MicronautHttpClient.java index 13b0b45f..f0fe94f0 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/other/MicronautHttpClient.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/other/MicronautHttpClient.java @@ -63,5 +63,10 @@ public void apply(GeneratorContext generatorContext) { .groupId("io.micronaut") .artifactId("micronaut-http-client") .compile()); + + generatorContext.addDependency(Dependency.builder() + .groupId("io.micronaut") + .artifactId("micronaut-http-client") + .testImplementation()); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/test/AssertJ.java b/grails-forge-core/src/main/java/org/grails/forge/feature/test/AssertJ.java index 7c2654e8..aa77119a 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/test/AssertJ.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/test/AssertJ.java @@ -50,7 +50,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.assertj") .artifactId("assertj-core") - .test()); + .testImplementation()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/test/Geb.java b/grails-forge-core/src/main/java/org/grails/forge/feature/test/Geb.java index 5f6a2e9c..575cd5d0 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/test/Geb.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/test/Geb.java @@ -103,27 +103,27 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .artifactId("geb") - .test()); + .testImplementation()); Stream.of("api", "support", "remote-driver") .map(name -> "selenium-" + name) .forEach(name -> generatorContext.addDependency(Dependency.builder() .groupId("org.seleniumhq.selenium") .lookupArtifactId(name) - .test())); + .testImplementation())); generatorContext.addDependency(Dependency.builder() .groupId("org.seleniumhq.selenium") .lookupArtifactId("selenium-chrome-driver") - .testRuntime()); + .testRuntimeOnly()); generatorContext.addDependency(Dependency.builder() .groupId("org.seleniumhq.selenium") .lookupArtifactId("selenium-firefox-driver") - .testRuntime()); + .testRuntimeOnly()); generatorContext.addDependency(Dependency.builder() .groupId("org.seleniumhq.selenium") .lookupArtifactId("selenium-safari-driver") - .testRuntime()); + .testRuntimeOnly()); TestFramework testFramework = generatorContext.getTestFramework(); String integrationTestSourcePath = generatorContext.getIntegrationTestSourcePath("/{packagePath}/{className}"); diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/test/GormTestingSupport.java b/grails-forge-core/src/main/java/org/grails/forge/feature/test/GormTestingSupport.java index f7d09a42..e3d479fd 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/test/GormTestingSupport.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/test/GormTestingSupport.java @@ -52,6 +52,6 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails") .artifactId("grails-gorm-testing-support") - .test()); + .testImplementation()); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/test/GrailsWebTestingSupport.java b/grails-forge-core/src/main/java/org/grails/forge/feature/test/GrailsWebTestingSupport.java index 7b6dee35..7c8f2539 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/test/GrailsWebTestingSupport.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/test/GrailsWebTestingSupport.java @@ -52,6 +52,6 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails") .artifactId("grails-web-testing-support") - .test()); + .testImplementation()); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/test/Hamcrest.java b/grails-forge-core/src/main/java/org/grails/forge/feature/test/Hamcrest.java index 93abbdc1..55ee7006 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/test/Hamcrest.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/test/Hamcrest.java @@ -17,6 +17,8 @@ import jakarta.inject.Singleton; import org.grails.forge.application.ApplicationType; +import org.grails.forge.application.generator.GeneratorContext; +import org.grails.forge.build.dependencies.Dependency; import org.grails.forge.feature.Category; import org.grails.forge.feature.Feature; @@ -52,4 +54,12 @@ public String getCategory() { public String getThirdPartyDocumentation() { return "https://hamcrest.org/JavaHamcrest/"; } + + @Override + public void apply(GeneratorContext generatorContext) { + generatorContext.addDependency(Dependency.builder() + .groupId("org.hamcrest") + .artifactId("hamcrest") + .testImplementation()); + } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/test/Junit.java b/grails-forge-core/src/main/java/org/grails/forge/feature/test/Junit.java index 702021af..29a81c49 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/test/Junit.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/test/Junit.java @@ -52,7 +52,7 @@ public void doApply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.junit.jupiter") .lookupArtifactId("junit-jupiter") - .test()); + .testImplementation()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/test/Mockito.java b/grails-forge-core/src/main/java/org/grails/forge/feature/test/Mockito.java index f5ab592c..00d96df7 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/test/Mockito.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/test/Mockito.java @@ -69,6 +69,6 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.mockito") .artifactId("mockito-core") - .test()); + .testImplementation()); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/test/Spock.java b/grails-forge-core/src/main/java/org/grails/forge/feature/test/Spock.java index 93f0dc57..8b94ff12 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/test/Spock.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/test/Spock.java @@ -39,7 +39,7 @@ public void doApply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.spockframework") .artifactId("spock-core") - .test() + .testImplementation() .build()); } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/test/ViewsJsonTestingSupport.java b/grails-forge-core/src/main/java/org/grails/forge/feature/test/ViewsJsonTestingSupport.java index 38935ce4..3f65d627 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/test/ViewsJsonTestingSupport.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/test/ViewsJsonTestingSupport.java @@ -52,6 +52,6 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails") .artifactId("views-json-testing-support") - .test()); + .testImplementation()); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java b/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java index 4b3054ad..a45f52a0 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java @@ -82,7 +82,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.fusesource.jansi") .lookupArtifactId("jansi") - .runtime()); + .runtimeOnly()); generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java b/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java index 20a99311..8ae90125 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java @@ -94,7 +94,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails") .artifactId("views-json-testing-support") - .test()); + .testImplementation()); generatorContext.addTemplate("application_index_gson", new RockerTemplate(getViewFolderPath() + "application/index.gson", index.template())); generatorContext.addTemplate("_errors_gson", new RockerTemplate(getViewFolderPath() + "errors/_errors.gson", _errors.template())); diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy index 6dd7d5f7..b5c2c664 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy @@ -2,7 +2,6 @@ package org.grails.forge.build.dependencies import org.grails.forge.application.generator.GeneratorContext import org.grails.forge.build.gradle.GradleDependency -import org.grails.forge.options.Language import org.grails.forge.options.TestFramework import spock.lang.Specification @@ -22,11 +21,11 @@ class GradleDependencyComparatorSpec extends Specification { dep(Dependency.builder().groupId("io.micronaut.openapi").artifactId("micronaut-openapi").annotationProcessor(), ctx), dep(Dependency.builder().groupId("io.micronaut.sql").artifactId("micronaut-jdbc-hikari").compile(), ctx), dep(Dependency.builder().groupId("org.grails").artifactId("grails-console").console(), ctx), - dep(Dependency.builder().groupId("org.testcontainers").artifactId("testcontainers").test(), ctx), - dep(Dependency.builder().groupId("mysql").artifactId("mysql-connector-java").runtime(), ctx), - dep(Dependency.builder().groupId("org.testcontainers").artifactId("junit-jupiter").test(), ctx), - dep(Dependency.builder().groupId("org.testcontainers").artifactId("mysql").test(), ctx), - dep(Dependency.builder().groupId("ch.qos.logback").artifactId("logback-classic").runtime(), ctx)] + dep(Dependency.builder().groupId("org.testcontainers").artifactId("testcontainers").testImplementation(), ctx), + dep(Dependency.builder().groupId("mysql").artifactId("mysql-connector-java").runtimeOnly(), ctx), + dep(Dependency.builder().groupId("org.testcontainers").artifactId("junit-jupiter").testImplementation(), ctx), + dep(Dependency.builder().groupId("org.testcontainers").artifactId("mysql").testImplementation(), ctx), + dep(Dependency.builder().groupId("ch.qos.logback").artifactId("logback-classic").runtimeOnly(), ctx)] when: dependencies.sort(GradleDependency.COMPARATOR) From a6903a170eac5199a39c8414771e0e3ec3158c4b Mon Sep 17 00:00:00 2001 From: James Fredley Date: Mon, 11 Nov 2024 17:51:43 -0500 Subject: [PATCH 14/37] rename compile to implementation --- .../grails/forge/build/dependencies/Dependency.java | 4 ++-- .../org/grails/forge/build/dependencies/Scope.java | 2 +- .../java/org/grails/forge/feature/cache/EHCache.java | 2 +- .../org/grails/forge/feature/cache/GrailsCache.java | 2 +- .../grails/forge/feature/database/HibernateGorm.java | 2 +- .../org/grails/forge/feature/database/MongoGorm.java | 2 +- .../org/grails/forge/feature/database/MongoSync.java | 2 +- .../org/grails/forge/feature/database/Neo4jGorm.java | 2 +- .../org/grails/forge/feature/grails/GrailsBase.java | 6 +++--- .../forge/feature/grails/GrailsDefaultPlugins.java | 2 +- .../org/grails/forge/feature/logging/Logback.java | 2 +- .../grails/forge/feature/logging/LogbackGroovy.java | 4 ++-- .../feature/migration/DatabaseMigrationPlugin.java | 2 +- .../org/grails/forge/feature/other/GrailsQuartz.java | 2 +- .../forge/feature/other/HibernateValidator.java | 2 +- .../forge/feature/other/MicronautHttpClient.java | 2 +- .../feature/spring/SpringBootAutoconfigure.java | 2 +- .../forge/feature/spring/SpringBootJettyFeature.java | 2 +- .../feature/spring/SpringBootStarterFeature.java | 8 ++++---- .../feature/spring/SpringBootTomcatFeature.java | 2 +- .../feature/spring/SpringBootUndertowFeature.java | 2 +- .../org/grails/forge/feature/view/GrailsGsp.java | 2 +- .../org/grails/forge/feature/view/Scaffolding.java | 2 +- .../org/grails/forge/feature/view/json/ViewJson.java | 4 ++-- .../grails/forge/feature/view/markup/ViewMarkup.java | 2 +- .../GradleDependencyComparatorSpec.groovy | 12 ++++++------ 26 files changed, 39 insertions(+), 39 deletions(-) diff --git a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java index d0f97be9..dd266bb5 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java +++ b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java @@ -183,8 +183,8 @@ public Builder buildSrc() { return scope(Scope.BUILD); } - public Builder compile() { - return scope(Scope.COMPILE); + public Builder implementation() { + return scope(Scope.IMPLEMENTATION); } public Builder console() { diff --git a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java index 7710a279..2aa3f6ef 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java +++ b/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java @@ -26,7 +26,7 @@ public class Scope { public static final Scope ANNOTATION_PROCESSOR = new Scope(Source.MAIN, Collections.singletonList(Phase.ANNOTATION_PROCESSING)); public static final Scope BUILD = new Scope(Source.BUILD_SRC, Arrays.asList(Phase.BUILD)); - public static final Scope COMPILE = new Scope(Source.MAIN, Arrays.asList(Phase.COMPILATION, Phase.RUNTIME)); + public static final Scope IMPLEMENTATION = new Scope(Source.MAIN, Arrays.asList(Phase.COMPILATION, Phase.RUNTIME)); public static final Scope COMPILE_ONLY = new Scope(Source.MAIN, Collections.singletonList(Phase.COMPILATION)); public static final Scope CONSOLE = new Scope(Source.MAIN, Collections.singletonList(Phase.CONSOLE)); public static final Scope DEVELOPMENT_ONLY = new Scope(Source.MAIN, Collections.singletonList(Phase.DEVELOPMENT_ONLY)); diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/cache/EHCache.java b/grails-forge-core/src/main/java/org/grails/forge/feature/cache/EHCache.java index a4010f9e..d6899a92 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/cache/EHCache.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/cache/EHCache.java @@ -47,7 +47,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .lookupArtifactId("cache-ehcache") - .compile()); + .implementation()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/cache/GrailsCache.java b/grails-forge-core/src/main/java/org/grails/forge/feature/cache/GrailsCache.java index 1517660c..f6933400 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/cache/GrailsCache.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/cache/GrailsCache.java @@ -51,7 +51,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .lookupArtifactId("cache") - .compile()); + .implementation()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java b/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java index a8c28955..9725c72c 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java @@ -86,7 +86,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .artifactId("hibernate5") - .compile()); + .implementation()); generatorContext.addDependency(Dependency.builder() .groupId("org.apache.tomcat") .artifactId("tomcat-jdbc") diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoGorm.java b/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoGorm.java index be590b0a..39fc73e3 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoGorm.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoGorm.java @@ -68,7 +68,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .artifactId("mongodb") - .compile()); + .implementation()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoSync.java b/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoSync.java index 4b2f2790..5177d3d7 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoSync.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoSync.java @@ -52,7 +52,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.mongodb") .lookupArtifactId("mongodb-driver-sync") - .compile() + .implementation() ); } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/database/Neo4jGorm.java b/grails-forge-core/src/main/java/org/grails/forge/feature/database/Neo4jGorm.java index 59a7fddd..13e0f3cd 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/database/Neo4jGorm.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/database/Neo4jGorm.java @@ -53,7 +53,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .artifactId("neo4j") - .compile()); + .implementation()); generatorContext.addDependency(Dependency.builder() .groupId("org.neo4j.test") diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsBase.java b/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsBase.java index 32e6d7a8..955c0119 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsBase.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsBase.java @@ -54,15 +54,15 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails") .artifactId("grails-core") - .compile()); + .implementation()); generatorContext.addDependency(Dependency.builder() .groupId("org.grails") .artifactId("grails-web-boot") - .compile()); + .implementation()); generatorContext.addDependency(Dependency.builder() .groupId("org.grails") .artifactId("grails-logging") - .compile()); + .implementation()); final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); generatorContext.addTemplate("src/main/groovy", new URLTemplate("src/main/groovy/.gitkeep", classLoader.getResource(".gitkeep"))); diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsDefaultPlugins.java b/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsDefaultPlugins.java index f8a71370..5744e978 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsDefaultPlugins.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsDefaultPlugins.java @@ -57,7 +57,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails") .artifactId("grails-plugin-" + artifact) - .compile()); + .implementation()); }); final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); generatorContext.addTemplate("messages_properties", new URLTemplate("grails-app/i18n/messages.properties", classLoader.getResource("i18n/messages.properties"), false)); diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/logging/Logback.java b/grails-forge-core/src/main/java/org/grails/forge/feature/logging/Logback.java index 1c5f4c99..2a38041c 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/logging/Logback.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/logging/Logback.java @@ -67,7 +67,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails") .artifactId("grails-logging") - .compile()); + .implementation()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/logging/LogbackGroovy.java b/grails-forge-core/src/main/java/org/grails/forge/feature/logging/LogbackGroovy.java index 86d666f5..e0de61e2 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/logging/LogbackGroovy.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/logging/LogbackGroovy.java @@ -64,13 +64,13 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails") .artifactId("grails-logging") - .compile()); + .implementation()); generatorContext.addDependency(Dependency.builder() .groupId("io.github.virtualdogbert") .artifactId("logback-groovy-config") .version("1.12.4") - .compile()); + .implementation()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/migration/DatabaseMigrationPlugin.java b/grails-forge-core/src/main/java/org/grails/forge/feature/migration/DatabaseMigrationPlugin.java index e30c7ad7..4d39f60f 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/migration/DatabaseMigrationPlugin.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/migration/DatabaseMigrationPlugin.java @@ -59,7 +59,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .lookupArtifactId("database-migration") - .compile()); + .implementation()); } private String getSrcDirPath() { diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/other/GrailsQuartz.java b/grails-forge-core/src/main/java/org/grails/forge/feature/other/GrailsQuartz.java index 249963d7..d1c9bea0 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/other/GrailsQuartz.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/other/GrailsQuartz.java @@ -48,7 +48,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .lookupArtifactId("quartz") - .compile()); + .implementation()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/other/HibernateValidator.java b/grails-forge-core/src/main/java/org/grails/forge/feature/other/HibernateValidator.java index d41415ba..2f427c04 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/other/HibernateValidator.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/other/HibernateValidator.java @@ -50,7 +50,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.hibernate") .lookupArtifactId("hibernate-validator") - .compile()); + .implementation()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/other/MicronautHttpClient.java b/grails-forge-core/src/main/java/org/grails/forge/feature/other/MicronautHttpClient.java index f0fe94f0..78c0aa29 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/other/MicronautHttpClient.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/other/MicronautHttpClient.java @@ -62,7 +62,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("io.micronaut") .artifactId("micronaut-http-client") - .compile()); + .implementation()); generatorContext.addDependency(Dependency.builder() .groupId("io.micronaut") diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootAutoconfigure.java b/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootAutoconfigure.java index b1a29371..9b9b698c 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootAutoconfigure.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootAutoconfigure.java @@ -53,7 +53,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.springframework.boot") .artifactId("spring-boot-autoconfigure") - .compile()); + .implementation()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootJettyFeature.java b/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootJettyFeature.java index 8ce8b89b..f920440b 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootJettyFeature.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootJettyFeature.java @@ -50,7 +50,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.springframework.boot") .artifactId("spring-boot-starter-jetty") - .compile()); + .implementation()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootStarterFeature.java b/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootStarterFeature.java index d6eb9e5e..b9564e96 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootStarterFeature.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootStarterFeature.java @@ -55,19 +55,19 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.springframework.boot") .artifactId("spring-boot-starter") - .compile()); + .implementation()); generatorContext.addDependency(Dependency.builder() .groupId("org.springframework.boot") .artifactId("spring-boot-starter-actuator") - .compile()); + .implementation()); } generatorContext.addDependency(Dependency.builder() .groupId("org.springframework.boot") .artifactId("spring-boot-starter-validation") - .compile()); + .implementation()); generatorContext.addDependency(Dependency.builder() .groupId("org.springframework.boot") .artifactId("spring-boot-starter-logging") - .compile()); + .implementation()); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootTomcatFeature.java b/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootTomcatFeature.java index 38110b82..3fb31326 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootTomcatFeature.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootTomcatFeature.java @@ -52,7 +52,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.springframework.boot") .artifactId("spring-boot-starter-tomcat") - .compile()); + .implementation()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootUndertowFeature.java b/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootUndertowFeature.java index 7fa3d33f..50cf1802 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootUndertowFeature.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootUndertowFeature.java @@ -50,7 +50,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.springframework.boot") .artifactId("spring-boot-starter-undertow") - .compile()); + .implementation()); } @Override diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/view/GrailsGsp.java b/grails-forge-core/src/main/java/org/grails/forge/feature/view/GrailsGsp.java index 5a441272..1fe466b4 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/view/GrailsGsp.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/view/GrailsGsp.java @@ -99,7 +99,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .artifactId("gsp") - .compile()); + .implementation()); final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); generatorContext.addTemplate("mainLayout", new URLTemplate(getViewFolderPath() + "layouts/main.gsp", classLoader.getResource("gsp/main.gsp"))); diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java b/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java index a45f52a0..fc33e114 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java @@ -87,6 +87,6 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .artifactId("scaffolding") - .compile()); + .implementation()); } } diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java b/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java index 8ae90125..cdb3eae3 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java @@ -85,11 +85,11 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .artifactId("views-json") - .compile()); + .implementation()); generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .artifactId("views-json-templates") - .compile()); + .implementation()); generatorContext.addDependency(Dependency.builder() .groupId("org.grails") diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/view/markup/ViewMarkup.java b/grails-forge-core/src/main/java/org/grails/forge/feature/view/markup/ViewMarkup.java index 58079132..49ec8d54 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/view/markup/ViewMarkup.java +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/view/markup/ViewMarkup.java @@ -81,7 +81,7 @@ public void apply(GeneratorContext generatorContext) { generatorContext.addDependency(Dependency.builder() .groupId("org.grails.plugins") .artifactId("views-markup") - .compile()); + .implementation()); generatorContext.addTemplate("application_index_gml", new RockerTemplate(getViewFolderPath() + "application/index.gml", index.template())); generatorContext.addTemplate("_errors_gml", new RockerTemplate(getViewFolderPath() + "errors/_errors.gml", _errors.template())); diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy index b5c2c664..e641674e 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy @@ -13,13 +13,13 @@ class GradleDependencyComparatorSpec extends Specification { getTestFramework() >> TestFramework.JUNIT } List dependencies = - [dep(Dependency.builder().groupId("io.micronaut").artifactId("micronaut-validation").compile(), ctx), - dep(Dependency.builder().groupId("io.swagger.core.v3").artifactId("swagger-annotations").compile(), ctx), - dep(Dependency.builder().groupId("io.micronaut").artifactId("micronaut-runtime").compile(), ctx), - dep(Dependency.builder().groupId("jakarta.annotation").artifactId("jakarta.annotation-api").compile(), ctx), - dep(Dependency.builder().groupId("io.micronaut").artifactId("micronaut-http-client").compile(), ctx), + [dep(Dependency.builder().groupId("io.micronaut").artifactId("micronaut-validation").implementation(), ctx), + dep(Dependency.builder().groupId("io.swagger.core.v3").artifactId("swagger-annotations").implementation(), ctx), + dep(Dependency.builder().groupId("io.micronaut").artifactId("micronaut-runtime").implementation(), ctx), + dep(Dependency.builder().groupId("jakarta.annotation").artifactId("jakarta.annotation-api").implementation(), ctx), + dep(Dependency.builder().groupId("io.micronaut").artifactId("micronaut-http-client").implementation(), ctx), dep(Dependency.builder().groupId("io.micronaut.openapi").artifactId("micronaut-openapi").annotationProcessor(), ctx), - dep(Dependency.builder().groupId("io.micronaut.sql").artifactId("micronaut-jdbc-hikari").compile(), ctx), + dep(Dependency.builder().groupId("io.micronaut.sql").artifactId("micronaut-jdbc-hikari").implementation(), ctx), dep(Dependency.builder().groupId("org.grails").artifactId("grails-console").console(), ctx), dep(Dependency.builder().groupId("org.testcontainers").artifactId("testcontainers").testImplementation(), ctx), dep(Dependency.builder().groupId("mysql").artifactId("mysql-connector-java").runtimeOnly(), ctx), From f30d3cb4935adc14924d3a43b614297866e47767 Mon Sep 17 00:00:00 2001 From: James Fredley Date: Thu, 14 Nov 2024 17:40:21 -0500 Subject: [PATCH 15/37] add grails-bom to buildSrc/build.gradle to set dependency versions the same as main build.gradle file this is the only Gradle build dependency that is needed in buildSrc/build.gradle and not in buildscript{} --- .../build/gradle/templates/buildSrcBuildGradle.rocker.raw | 2 ++ 1 file changed, 2 insertions(+) diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildSrcBuildGradle.rocker.raw b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildSrcBuildGradle.rocker.raw index 0ab897d8..76d5a2f7 100644 --- a/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildSrcBuildGradle.rocker.raw +++ b/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildSrcBuildGradle.rocker.raw @@ -3,6 +3,7 @@ @import org.grails.forge.feature.Features @import org.grails.forge.build.gradle.GradleBuild @import org.grails.forge.build.gradle.GradleDependency +@import org.grails.forge.util.VersionInfo @args ( ApplicationType applicationType, @@ -17,6 +18,7 @@ repositories { mavenCentral() } dependencies { + implementation platform("org.grails:grails-bom:@VersionInfo.getGrailsVersion()") @for (GradleDependency dependency : gradleBuild.getBuildSrcDependencies()) { @dependency.toSnippet() } From d36f38845632a40dd0123b550d2ef7481f7deadd Mon Sep 17 00:00:00 2001 From: James Fredley Date: Wed, 20 Nov 2024 15:38:30 -0500 Subject: [PATCH 16/37] update to grails 6.2.2 and grails-gradle-plugin 6.2.3 --- gradle.properties | 2 +- grails-forge-core/src/main/resources/pom.xml | 2 +- .../forge/feature/grails/GrailsGradlePluginSpec.groovy | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gradle.properties b/gradle.properties index 52ca92d0..065cb6d1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ micronautDocsVersion=2.0.0 micronautVersion=3.10.4 rockerVersion=1.4.0 groovyVersion=3.0.22 -grailsVersion=6.2.2-SNAPSHOT +grailsVersion=6.2.2 spockVersion=2.0-groovy-3.0 title=Grails Application Forge projectDesc=Generates Grails applications diff --git a/grails-forge-core/src/main/resources/pom.xml b/grails-forge-core/src/main/resources/pom.xml index 56f7cf8a..5f2ac0f6 100644 --- a/grails-forge-core/src/main/resources/pom.xml +++ b/grails-forge-core/src/main/resources/pom.xml @@ -20,7 +20,7 @@ org.grails grails-gradle-plugin - 6.2.1 + 6.2.3 org.grails.plugins diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy index cb54f0a6..8c5c52f9 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy @@ -16,8 +16,8 @@ class GrailsGradlePluginSpec extends BeanContextSpec implements CommandOutputFix final String gradleProps = output["gradle.properties"] then: - gradleProps.contains("grailsGradlePluginVersion=6.2.1") - gradleProps.contains("grailsVersion=6.2.2-SNAPSHOT") + gradleProps.contains("grailsGradlePluginVersion=6.2.3") + gradleProps.contains("grailsVersion=6.2.2") } void "test dependencies are present for buildSrc"() { @@ -26,7 +26,7 @@ class GrailsGradlePluginSpec extends BeanContextSpec implements CommandOutputFix .renderBuildSrc() then: - template.contains('implementation "org.grails:grails-gradle-plugin:6.2.1"') + template.contains('implementation "org.grails:grails-gradle-plugin:6.2.3"') } void "test buildSrc is present for buildscript dependencies"() { @@ -36,7 +36,7 @@ class GrailsGradlePluginSpec extends BeanContextSpec implements CommandOutputFix expect: buildGradle != null - buildGradle.contains("classpath \"org.grails:grails-gradle-plugin:6.2.1\"") + buildGradle.contains("classpath \"org.grails:grails-gradle-plugin:6.2.3\"") } From 57c3a75ae9feea93ac4eb15455db92b8bbf02672 Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Wed, 20 Nov 2024 22:27:23 +0100 Subject: [PATCH 17/37] ci: disable macos-arm Related: 5dfd78baebc3cd84fd69781e3d2618eccb08c59f --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 851d4cc1..79972bab 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -311,6 +311,7 @@ jobs: asset_name: grails-darwin-amd64-${{ github.event.release.tag_name }}.zip asset_content_type: application/zip macos-arm: + if: false # Graalvm cannot build Java 11 OS X Arm Native Image name: "Release OS X Arm Native CLI" runs-on: macos-latest env: @@ -409,7 +410,7 @@ jobs: runs-on: ubuntu-latest env: GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} - needs: [build, linux, macos, macos-arm, windows] + needs: [build, linux, macos, windows] # macos-arm is disabled steps: - name: "📥 Checkout repository" uses: actions/checkout@v4 From a431e5e2cab65434065cbd1bd3b59848b53648c3 Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Wed, 20 Nov 2024 22:46:05 +0100 Subject: [PATCH 18/37] ci: temporarily disable publish to ossrh Temporary measure to get a successful release workflow with an already published version. --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 79972bab..cbf7e17a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -51,6 +51,7 @@ jobs: SECRING_FILE: ${{ secrets.SECRING_FILE }} run: echo $SECRING_FILE | base64 -d > ${{ github.workspace }}/secring.gpg - name: "📤 Publish to Sonatype OSSRH" + if: false # Temporary disable to prevent failure when re-running with the same version env: SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} From d478720e9df969352413722e33a9bdf590cdece5 Mon Sep 17 00:00:00 2001 From: grails-build Date: Wed, 20 Nov 2024 21:59:57 +0000 Subject: [PATCH 19/37] [skip ci] Release v6.2.2 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 065cb6d1..580eedf2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -projectVersion=6.2.2-SNAPSHOT +projectVersion=6.2.2 micronautBuildVersion=1.1.5 micronautDocsVersion=2.0.0 micronautVersion=3.10.4 From 2ab711d5a1e93beb0ae7e4fc48ca4ff18bded727 Mon Sep 17 00:00:00 2001 From: James Fredley Date: Wed, 20 Nov 2024 17:00:02 -0500 Subject: [PATCH 20/37] Update to grails 6.2.3-SNAPSHOT and grails-gradle-plugin 6.2.4-SNAPSHOT --- gradle.properties | 4 ++-- grails-forge-core/src/main/resources/pom.xml | 2 +- .../forge/feature/grails/GrailsGradlePluginSpec.groovy | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/gradle.properties b/gradle.properties index 065cb6d1..ecac0be7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,10 @@ -projectVersion=6.2.2-SNAPSHOT +projectVersion=6.2.3-SNAPSHOT micronautBuildVersion=1.1.5 micronautDocsVersion=2.0.0 micronautVersion=3.10.4 rockerVersion=1.4.0 groovyVersion=3.0.22 -grailsVersion=6.2.2 +grailsVersion=6.2.3-SNAPSHOT spockVersion=2.0-groovy-3.0 title=Grails Application Forge projectDesc=Generates Grails applications diff --git a/grails-forge-core/src/main/resources/pom.xml b/grails-forge-core/src/main/resources/pom.xml index 5f2ac0f6..aa34cbe9 100644 --- a/grails-forge-core/src/main/resources/pom.xml +++ b/grails-forge-core/src/main/resources/pom.xml @@ -20,7 +20,7 @@ org.grails grails-gradle-plugin - 6.2.3 + 6.2.4-SNAPSHOT org.grails.plugins diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy index 8c5c52f9..b264d131 100644 --- a/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy +++ b/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy @@ -16,8 +16,8 @@ class GrailsGradlePluginSpec extends BeanContextSpec implements CommandOutputFix final String gradleProps = output["gradle.properties"] then: - gradleProps.contains("grailsGradlePluginVersion=6.2.3") - gradleProps.contains("grailsVersion=6.2.2") + gradleProps.contains("grailsGradlePluginVersion=6.2.4-SNAPSHOT") + gradleProps.contains("grailsVersion=6.2.3-SNAPSHOT") } void "test dependencies are present for buildSrc"() { @@ -26,7 +26,7 @@ class GrailsGradlePluginSpec extends BeanContextSpec implements CommandOutputFix .renderBuildSrc() then: - template.contains('implementation "org.grails:grails-gradle-plugin:6.2.3"') + template.contains('implementation "org.grails:grails-gradle-plugin:6.2.4-SNAPSHOT"') } void "test buildSrc is present for buildscript dependencies"() { @@ -36,7 +36,7 @@ class GrailsGradlePluginSpec extends BeanContextSpec implements CommandOutputFix expect: buildGradle != null - buildGradle.contains("classpath \"org.grails:grails-gradle-plugin:6.2.3\"") + buildGradle.contains("classpath \"org.grails:grails-gradle-plugin:6.2.4-SNAPSHOT\"") } From 9d0866cbf269895dcb6b790a7816cee39d915fd9 Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Wed, 20 Nov 2024 23:12:39 +0100 Subject: [PATCH 21/37] ci: temporarily disable docs (#429) Temporary measure to get a successful release workflow with an already published version. --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cbf7e17a..6b622d6e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -76,6 +76,7 @@ jobs: asset_name: grails-cli-${{ steps.release_version.outputs.value }}.zip asset_content_type: application/zip - name: "📤 Publish to Github Pages" + if: false # Temp disable for re-release uses: micronaut-projects/github-pages-deploy-action@master env: BETA: ${{ contains(steps.release_version.outputs.value, 'M') }} From 957263add8f784e1445f88ca5dfc715513c7b2a6 Mon Sep 17 00:00:00 2001 From: grails-build Date: Wed, 20 Nov 2024 22:16:13 +0000 Subject: [PATCH 22/37] chore: Bump version to 6.2.3-SNAPSHOT --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 580eedf2..c4ad14f0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -projectVersion=6.2.2 +projectVersion=6.2.3-SNAPSHOT micronautBuildVersion=1.1.5 micronautDocsVersion=2.0.0 micronautVersion=3.10.4 From 82835dd2d6fb5376b17c4b01ddde8525389db2cd Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Thu, 21 Nov 2024 09:20:07 +0100 Subject: [PATCH 23/37] Revert "ci: temporarily disable publish to ossrh" This reverts commit a431e5e2cab65434065cbd1bd3b59848b53648c3. --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6b622d6e..2da21f2c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -51,7 +51,6 @@ jobs: SECRING_FILE: ${{ secrets.SECRING_FILE }} run: echo $SECRING_FILE | base64 -d > ${{ github.workspace }}/secring.gpg - name: "📤 Publish to Sonatype OSSRH" - if: false # Temporary disable to prevent failure when re-running with the same version env: SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} From ec14f5eb625d3e0896807362840d7ce21447a48b Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Thu, 21 Nov 2024 09:20:58 +0100 Subject: [PATCH 24/37] Revert "ci: temporarily disable docs (#429)" This reverts commit 9d0866cbf269895dcb6b790a7816cee39d915fd9. --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2da21f2c..79972bab 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -75,7 +75,6 @@ jobs: asset_name: grails-cli-${{ steps.release_version.outputs.value }}.zip asset_content_type: application/zip - name: "📤 Publish to Github Pages" - if: false # Temp disable for re-release uses: micronaut-projects/github-pages-deploy-action@master env: BETA: ${{ contains(steps.release_version.outputs.value, 'M') }} From 8ec954ebcc91429730bbdc9c1759db6bc930eb42 Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Thu, 21 Nov 2024 09:28:11 +0100 Subject: [PATCH 25/37] build: remove macOS ARM version from SDKMAN publishing Java 11 lacks support for compiling to macOS ARM, necessitating its removal from the publish process. Related commits: 57c3a75ae9feea93ac4eb15455db92b8bbf02672, 5dfd78baebc3cd84fd69781e3d2618eccb08c59f --- grails-cli/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/grails-cli/build.gradle b/grails-cli/build.gradle index 149c2d8a..818c5727 100644 --- a/grails-cli/build.gradle +++ b/grails-cli/build.gradle @@ -92,7 +92,6 @@ sdkman { version = project.version hashtag = "#grailsfw" platforms = [ - "MAC_ARM64":"https://github.com/grails/grails-forge/releases/download/v${project.version}/grails-darwin-aarch64-v${project.version}.zip", "MAC_OSX":"https://github.com/grails/grails-forge/releases/download/v${project.version}/grails-darwin-amd64-v${project.version}.zip", "WINDOWS_64":"https://github.com/grails/grails-forge/releases/download/v${project.version}/grails-win-amd64-v${project.version}.zip", "LINUX_64":"https://github.com/grails/grails-forge/releases/download/v${project.version}/grails-linux-amd64-v${project.version}.zip" From 834c30ed0fa4595aaf860b7e182de730be2cd36c Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Mon, 25 Nov 2024 19:24:30 +0100 Subject: [PATCH 26/37] ci: Remove automatic snapshot publishing Only the latest release branch should automatically publish snapshots as it updates https://start.grails.org. --- .github/workflows/snapshot.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml index 104e5eb1..d3d7b6fb 100644 --- a/.github/workflows/snapshot.yml +++ b/.github/workflows/snapshot.yml @@ -1,11 +1,9 @@ name: Snapshot on: - push: - branches: - - '[6-9]+.[0-9]+.x' - pull_request: - branches: - - '[6-9]+.[0-9]+.x' + # Snapshots should only be published automatically from the latest branch + # as it updates the snapshot version on https://start.grails.org. + # However, if you need, you can still run this workflow manually for this branch on: + # https://github.com/grails/grails-forge/actions/workflows/snapshot.yml workflow_dispatch: jobs: build: From 1181588507a68e73b9cd05728bbcdd78f0182a44 Mon Sep 17 00:00:00 2001 From: James Daugherty Date: Mon, 25 Nov 2024 15:08:25 -0500 Subject: [PATCH 27/37] 6.2.x - Do not default the java version from the grails cli version (#434) --- .github/workflows/mavenCentral.yml | 4 +-- .github/workflows/release.yml | 35 +++++++++---------- .github/workflows/sdkman.yml | 4 +-- .github/workflows/snapshot.yml | 29 ++++++++------- grails-cli/build.gradle | 5 +-- .../org/grails/forge/cli/CodeGenConfig.java | 4 +-- .../forge/cli/command/CreateCommand.java | 3 +- .../forge/cli/util/GrailsVersionProvider.java | 4 ++- .../cli/command/ApplicationCommandSpec.groovy | 2 +- .../workflows/templates/javaSetup.rocker.raw | 2 +- .../org/grails/forge/options/Options.java | 4 +-- 11 files changed, 48 insertions(+), 48 deletions(-) diff --git a/.github/workflows/mavenCentral.yml b/.github/workflows/mavenCentral.yml index 75e1c9ee..9baec0cf 100644 --- a/.github/workflows/mavenCentral.yml +++ b/.github/workflows/mavenCentral.yml @@ -17,8 +17,8 @@ jobs: - name: "☕️ Setup JDK" uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: 'liberica' + java-version: '17' - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 - name: "🔐 Generate secring file" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 79972bab..c323af37 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,8 +20,8 @@ jobs: - name: "☕️ Setup JDK" uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: 'liberica' + java-version: '17' - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 - name: "🔢 Set the current release version" @@ -127,8 +127,8 @@ jobs: - name: "☕️ Setup JDK" uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: 'liberica' + java-version: '17' - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 - name: "✅ Run Tests" @@ -185,8 +185,8 @@ jobs: - name: "☕️ Setup JDK" uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: 'liberica' + java-version: '17' - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 - name: "✅ Run Tests" @@ -235,10 +235,10 @@ jobs: - name: "☕️ Setup GraalVM CE" uses: graalvm/setup-graalvm@v1 with: - java-version: '11' + java-version: '17' + distribution: 'graalvm-community' native-image-musl: 'true' components: 'native-image' - version: '22.3.3' github-token: ${{ secrets.GITHUB_TOKEN }} - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 @@ -280,9 +280,9 @@ jobs: - name: "☕️ Setup GraalVM CE" uses: graalvm/setup-graalvm@v1 with: - java-version: '11' + java-version: '17' + distribution: 'graalvm-community' components: 'native-image' - version: '22.3.3' github-token: ${{ secrets.GITHUB_TOKEN }} - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 @@ -311,7 +311,6 @@ jobs: asset_name: grails-darwin-amd64-${{ github.event.release.tag_name }}.zip asset_content_type: application/zip macos-arm: - if: false # Graalvm cannot build Java 11 OS X Arm Native Image name: "Release OS X Arm Native CLI" runs-on: macos-latest env: @@ -325,9 +324,9 @@ jobs: - name: "☕️ Setup GraalVM CE" uses: graalvm/setup-graalvm@v1 with: - java-version: '11' + java-version: '17' + distribution: 'graalvm-community' components: 'native-image' - version: '22.3.3' github-token: ${{ secrets.GITHUB_TOKEN }} - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 @@ -369,9 +368,9 @@ jobs: - name: "☕️ Setup GraalVM CE" uses: graalvm/setup-graalvm@v1 with: - java-version: '11' + java-version: '17' + distribution: 'graalvm-community' components: 'native-image' - version: '22.3.3' github-token: ${{ secrets.GITHUB_TOKEN }} - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 @@ -410,7 +409,7 @@ jobs: runs-on: ubuntu-latest env: GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} - needs: [build, linux, macos, windows] # macos-arm is disabled + needs: [build, linux, macos, macos-arm, windows] steps: - name: "📥 Checkout repository" uses: actions/checkout@v4 @@ -419,8 +418,8 @@ jobs: - name: "☕️ Setup JDK" uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: 'liberica' + java-version: '17' - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 - name: "🚀 Grails SDK Minor Release" diff --git a/.github/workflows/sdkman.yml b/.github/workflows/sdkman.yml index b6fc0c66..9019e8a4 100644 --- a/.github/workflows/sdkman.yml +++ b/.github/workflows/sdkman.yml @@ -18,8 +18,8 @@ jobs: - name: "☕️ Setup JDK" uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: 'liberica' + java-version: '17' - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 - name: "🚀 Grails SDK Minor Release" diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml index d2597184..725f0d11 100644 --- a/.github/workflows/snapshot.yml +++ b/.github/workflows/snapshot.yml @@ -16,8 +16,8 @@ jobs: - name: "☕️ Setup JDK" uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: 'liberica' + java-version: '17' - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 - name: "🔨 Run Build" @@ -61,8 +61,8 @@ jobs: - name: "☕️ Setup JDK" uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: 'liberica' + java-version: '17' - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 - name: "✅ Run Tests" @@ -117,8 +117,8 @@ jobs: - name: "☕️ Setup JDK" uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: 'liberica' + java-version: '17' - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 - name: "✅ Run Tests" @@ -155,9 +155,9 @@ jobs: - name: "☕️ Setup GraalVM CE" uses: graalvm/setup-graalvm@v1 with: - java-version: '11' + java-version: '17' + distribution: 'graalvm-community' components: 'native-image' - version: '22.3.3' github-token: ${{ secrets.GITHUB_TOKEN }} - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 @@ -191,9 +191,9 @@ jobs: - name: "☕️ Setup GraalVM CE" uses: graalvm/setup-graalvm@v1 with: - java-version: '11' + java-version: '17' + distribution: 'graalvm-community' components: 'native-image' - version: '22.3.3' github-token: ${{ secrets.GITHUB_TOKEN }} - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 @@ -218,7 +218,6 @@ jobs: name: grails-darwin-amd64-snapshot path: grails-darwin-amd64-snapshot.zip macos-arm: - if: false # Graalvm cannot build Java 11 OS X Arm Native Image name: "Build OS X Arm Native CLI" runs-on: macos-latest env: @@ -230,9 +229,9 @@ jobs: - name: "☕️ Setup GraalVM CE" uses: graalvm/setup-graalvm@v1 with: - java-version: '11' + java-version: '17' + distribution: 'graalvm-community' components: 'native-image' - version: '22.3.3' github-token: ${{ secrets.GITHUB_TOKEN }} - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 @@ -266,9 +265,9 @@ jobs: - name: "☕️ Setup GraalVM CE" uses: graalvm/setup-graalvm@v1 with: - java-version: '11' + java-version: '17' + distribution: 'graalvm-community' components: 'native-image' - version: '22.3.3' github-token: ${{ secrets.GITHUB_TOKEN }} - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v4 diff --git a/grails-cli/build.gradle b/grails-cli/build.gradle index 818c5727..ebe4ecc2 100644 --- a/grails-cli/build.gradle +++ b/grails-cli/build.gradle @@ -1,6 +1,6 @@ plugins { id "org.grails.forge.internal.build.cli-module" - id 'org.graalvm.buildtools.native' version '0.10.2' + id 'org.graalvm.buildtools.native' version '0.10.3' } sourceSets { @@ -34,7 +34,7 @@ dependencies { api "info.picocli:picocli-shell-jline3:${picocliVersion}" api "com.fizzed:rocker-runtime:$rockerVersion" implementation "org.slf4j:slf4j-nop:2.0.16" - implementation "org.fusesource.jansi:jansi:2.4.0" + implementation "org.fusesource.jansi:jansi:2.4.1" implementation "org.yaml:snakeyaml:2.2" implementation group: 'javax.inject', name: 'javax.inject', version: '1' implementation 'org.shredzone.acme4j:acme4j-client:3.2.1' @@ -92,6 +92,7 @@ sdkman { version = project.version hashtag = "#grailsfw" platforms = [ + "MAC_ARM64":"https://github.com/grails/grails-forge/releases/download/v${project.version}/grails-darwin-aarch64-v${project.version}.zip", "MAC_OSX":"https://github.com/grails/grails-forge/releases/download/v${project.version}/grails-darwin-amd64-v${project.version}.zip", "WINDOWS_64":"https://github.com/grails/grails-forge/releases/download/v${project.version}/grails-win-amd64-v${project.version}.zip", "LINUX_64":"https://github.com/grails/grails-forge/releases/download/v${project.version}/grails-linux-amd64-v${project.version}.zip" diff --git a/grails-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java b/grails-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java index 616326f1..c0307a62 100644 --- a/grails-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java +++ b/grails-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java @@ -25,10 +25,10 @@ import org.grails.forge.feature.Feature; import org.grails.forge.io.ConsoleOutput; import org.grails.forge.io.FileSystemOutputHandler; +import org.grails.forge.options.JdkVersion; import org.grails.forge.options.Language; import org.grails.forge.options.Options; import org.grails.forge.options.TestFramework; -import org.grails.forge.util.VersionInfo; import org.yaml.snakeyaml.Yaml; import java.io.File; @@ -149,7 +149,7 @@ public static CodeGenConfig load(BeanContext beanContext, File directory, Consol .map(DefaultFeature.class::cast) .filter(f -> f.shouldApply( codeGenConfig.getApplicationType(), - new Options(codeGenConfig.getTestFramework(), VersionInfo.getJavaVersion()), + new Options(codeGenConfig.getTestFramework(), JdkVersion.DEFAULT_OPTION), new HashSet<>())) .map(Feature::getName) .collect(Collectors.toList())); diff --git a/grails-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java b/grails-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java index f8d552e8..107678ba 100644 --- a/grails-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java +++ b/grails-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java @@ -27,7 +27,6 @@ import org.grails.forge.io.OutputHandler; import org.grails.forge.options.*; import org.grails.forge.util.NameUtils; -import org.grails.forge.util.VersionInfo; import picocli.CommandLine; import java.util.Collections; @@ -127,7 +126,7 @@ public void generate(Project project, OutputHandler outputHandler) throws Except private JdkVersion getJdkVersion() { if (javaVersion == null) { - return VersionInfo.getJavaVersion(); + return JdkVersion.DEFAULT_OPTION; } else { return JdkVersion.valueOf(javaVersion); } diff --git a/grails-cli/src/main/java/org/grails/forge/cli/util/GrailsVersionProvider.java b/grails-cli/src/main/java/org/grails/forge/cli/util/GrailsVersionProvider.java index 45711e55..c3b91882 100644 --- a/grails-cli/src/main/java/org/grails/forge/cli/util/GrailsVersionProvider.java +++ b/grails-cli/src/main/java/org/grails/forge/cli/util/GrailsVersionProvider.java @@ -19,6 +19,8 @@ import org.grails.forge.util.VersionInfo; import picocli.CommandLine.IVersionProvider; +import java.util.Objects; + /** * Generates version information. Example usage: *
@@ -45,7 +47,7 @@ public class GrailsVersionProvider implements IVersionProvider {
     public String[] getVersion() {
         return new String[] {
                 "Grails Version: " + VersionInfo.getGrailsVersion(),
-                "JVM Version: " + System.getProperty("java.version")
+                "JVM Version: " + Objects.requireNonNullElse(System.getProperty("java.version"), "")
         };
     }
 }
diff --git a/grails-cli/src/test/groovy/org/grails/forge/cli/command/ApplicationCommandSpec.groovy b/grails-cli/src/test/groovy/org/grails/forge/cli/command/ApplicationCommandSpec.groovy
index 24965ff6..31c9c245 100644
--- a/grails-cli/src/test/groovy/org/grails/forge/cli/command/ApplicationCommandSpec.groovy
+++ b/grails-cli/src/test/groovy/org/grails/forge/cli/command/ApplicationCommandSpec.groovy
@@ -31,7 +31,7 @@ class ApplicationCommandSpec extends CommandSpec implements CommandFixture {
         then:
         noExceptionThrown()
         out.toString().contains("Grails Version: " + VersionInfo.getGrailsVersion())
-        out.toString().contains("JVM Version: " + System.getProperty("java.version"))
+        out.toString().contains("JVM Version: " + Objects.requireNonNullElse(System.getProperty("java.version"), "" ))
 
         where:
         args        | _
diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/templates/javaSetup.rocker.raw b/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/templates/javaSetup.rocker.raw
index 3aa954a0..0c3cd7b6 100644
--- a/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/templates/javaSetup.rocker.raw
+++ b/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/templates/javaSetup.rocker.raw
@@ -9,5 +9,5 @@ JdkVersion jdkVersion
       - name: Set up JDK @jdkVersion.majorVersion()
         uses: actions/setup-java@@v4
         with:
-          distribution: 'temurin'
+          distribution: 'liberica'
           java-version: @jdkVersion.majorVersion()
diff --git a/grails-forge-core/src/main/java/org/grails/forge/options/Options.java b/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
index d965d80a..6043ed0f 100644
--- a/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
+++ b/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
@@ -81,11 +81,11 @@ public Options(TestFramework testFramework,
     }
 
     public Options(TestFramework testFramework) {
-        this(testFramework, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, VersionInfo.getJavaVersion(), OperatingSystem.DEFAULT, Collections.emptyMap());
+        this(testFramework, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, JdkVersion.DEFAULT_OPTION, OperatingSystem.DEFAULT, Collections.emptyMap());
     }
 
     public Options() {
-        this(TestFramework.DEFAULT_OPTION, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, VersionInfo.getJavaVersion(), OperatingSystem.DEFAULT, Collections.emptyMap());
+        this(TestFramework.DEFAULT_OPTION, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, JdkVersion.DEFAULT_OPTION, OperatingSystem.DEFAULT, Collections.emptyMap());
     }
 
     public OperatingSystem getOperatingSystem() {

From 6e502ac509461c2a7d408e8fe94263bacf1e0371 Mon Sep 17 00:00:00 2001
From: Mattias Reichel 
Date: Tue, 26 Nov 2024 11:01:38 +0100
Subject: [PATCH 28/37] ci: feedback - only prevent deploy to GCR

Change to only prevent the deployment to Google Cloud Run.

We still want to the snapshot workflow to run as it builds, tests, publishes to sonatype ossrh, and uploads the built artifacts in the workflow summary.
---
 .github/workflows/snapshot.yml | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml
index d3d7b6fb..551bc58f 100644
--- a/.github/workflows/snapshot.yml
+++ b/.github/workflows/snapshot.yml
@@ -1,9 +1,11 @@
 name: Snapshot
 on:
-  # Snapshots should only be published automatically from the latest branch
-  # as it updates the snapshot version on https://start.grails.org.
-  # However, if you need, you can still run this workflow manually for this branch on:
-  # https://github.com/grails/grails-forge/actions/workflows/snapshot.yml
+  push:
+    branches:
+      - '[6-9]+.[0-9]+.x'
+  pull_request:
+    branches:
+      - '[6-9]+.[0-9]+.x'
   workflow_dispatch:
 jobs:
   build:
@@ -60,7 +62,9 @@ jobs:
   deploy:
     name: Deploy To Google Cloud Run
     runs-on: ubuntu-latest
-    if: github.event_name != 'pull_request'
+    # Snapshots should only be deployed from the latest release branch
+    # as it updates the snapshot version on https://start.grails.org.
+    if: false # github.event_name != 'pull_request'
     needs: [build]
     env:
       IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}:snapshot
@@ -110,7 +114,9 @@ jobs:
   deployAnalytics:
     name: Deploy Analytics To Google Cloud Run
     runs-on: ubuntu-latest
-    if: github.event_name != 'pull_request'
+    # Snapshots should only be deployed from the latest release branch
+    # as it updates the snapshot version on https://start.grails.org.
+    if: false # github.event_name != 'pull_request'
     needs: [build]
     env:
       IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}-analytics:snapshot

From 57d92a941105bbfdd4b56ddf258bca3e7658df1c Mon Sep 17 00:00:00 2001
From: Mattias Reichel 
Date: Tue, 26 Nov 2024 11:42:57 +0100
Subject: [PATCH 29/37] ci: Update snapshot.yml to latest standards

---
 .github/workflows/snapshot.yml | 357 ++++++++++++++++++---------------
 1 file changed, 197 insertions(+), 160 deletions(-)

diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml
index 551bc58f..9babfcbf 100644
--- a/.github/workflows/snapshot.yml
+++ b/.github/workflows/snapshot.yml
@@ -1,4 +1,4 @@
-name: Snapshot
+name: "Snapshot"
 on:
   push:
     branches:
@@ -9,291 +9,328 @@ on:
   workflow_dispatch:
 jobs:
   build:
+    name: "Build Project"
     runs-on: ubuntu-latest
     strategy:
       matrix:
-        java: ['11']
+        java: ['11', '17']
     steps:
-      - uses: actions/checkout@v3.5.3
-      - name: Set up JDK
-        uses: actions/setup-java@v3
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
+      - name: "☕️ Setup JDK"
+        uses: actions/setup-java@v4
         with:
-          distribution: 'adopt'
+          distribution: 'liberica'
           java-version: ${{ matrix.java }}
-      - name: Run Tests
-        if: github.event_name == 'pull_request'
-        id: tests
-        uses: gradle/gradle-build-action@v2
-        env:
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
         with:
-          arguments: check
-      - name: Run Build
-        if: github.event_name == 'push'
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "🔨 Run Build"
         id: build
-        uses: gradle/gradle-build-action@v2
         env:
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: build
-      - name: Verify CLI
-        if: steps.build.outcome == 'success' && github.event_name == 'push'
+        run: ./gradlew build
+      - name: "✅ Verify CLI"
+        if: success()
         run: |
           cp grails-cli/build/distributions/grails-cli-*.zip cli.zip
           unzip cli -d tmp
           mv tmp/grails-cli-* tmp/cli
           ./tmp/cli/bin/grails --version
-      - name: Publish to Sonatype OSSRH
+      - name: "📤 Publish to Sonatype OSSRH"
         id: publish
-        if: steps.build.outcome == 'success' && github.event_name == 'push'
-        uses: gradle/gradle-build-action@v2
+        if: success() && github.event_name == 'push' && matrix.java == '11'
         env:
           SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
           SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: publishToSonatype
+        run: ./gradlew publishToSonatype
   deploy:
-    name: Deploy To Google Cloud Run
-    runs-on: ubuntu-latest
     # Snapshots should only be deployed from the latest release branch
     # as it updates the snapshot version on https://start.grails.org.
     if: false # github.event_name != 'pull_request'
-    needs: [build]
+    name: "Deploy To Google Cloud Run"
+    runs-on: ubuntu-latest
+    needs: build
     env:
       IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}:snapshot
     steps:
-      - name: Login
+      - name: "🔑 Login"
         uses: google-github-actions/setup-gcloud@v0
         with:
           project_id: ${{ secrets.GCP_PROJECT_ID }}
           service_account_email: ${{ secrets.GCP_EMAIL }}
           service_account_key: ${{ secrets.GCP_CREDENTIALS }}
-      - name: Configure Docker
+      - name: "🐋 Configure Docker"
         run: gcloud auth configure-docker --quiet
-      - name: Checkout repository
-        uses: actions/checkout@v3
-      - name: Set up JDK
-        uses: actions/setup-java@v3.11.0
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
+      - name: "☕️ Setup JDK"
+        uses: actions/setup-java@v4
         with:
-          distribution: 'adopt'
+          distribution: 'liberica'
           java-version: '11'
-      - name: Run Tests
-        uses: gradle/gradle-build-action@v2
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "✅ Run Tests"
         env:
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-forge-api:test grails-forge-web-netty:test
-      - name: Build Docker image
+        run: >
+          ./gradlew
+          grails-forge-api:test
+          grails-forge-web-netty:test
+      - name: "🔨 Build Docker image"
         # To deploy native executables built with GraalVM replace dockerBuild with dockerBuildNative and dockerPush with dockerPushNative. First, try that it works locally.
-        uses: gradle/gradle-build-action@v2
         env:
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-forge-web-netty:dockerBuildNative -PdockerImageName=${{ env.IMAGE_NAME }}
-      - name: Push image to Google Cloud Container Registry
-        uses: gradle/gradle-build-action@v2
+        run: >
+          ./gradlew
+          grails-forge-web-netty:dockerBuildNative
+          -PdockerImageName=${{ env.IMAGE_NAME }}
+      - name: "📤 Push image to Google Cloud Container Registry"
         env:
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-forge-web-netty:dockerPushNative -PdockerImageName=${{ env.IMAGE_NAME }}
-      - name: Deploy Docker image
-        run: gcloud run deploy ${{ secrets.GCP_PROJECT_ID }}-snapshot --image $IMAGE_NAME --region us-central1 --update-env-vars=HOSTNAME="snapshot.grails.org",GITHUB_OAUTH_APP_CLIENT_ID=${{ secrets.GH_OAUTH_SNAPSHOT_CLIENT_ID }},GITHUB_OAUTH_APP_CLIENT_SECRET=${{ secrets.GH_OAUTH_SNAPSHOT_CLIENT_SECRET }},GITHUB_USER_AGENT=${{ secrets.GH_USER_AGENT }},GITHUB_REDIRECT_URL=${{ secrets.GH_REDIRECT_URL }} --platform managed --allow-unauthenticated --service-account=${{ secrets.GCLOUD_EMAIL }}
+        run: >
+          ./gradlew
+          grails-forge-web-netty:dockerPushNative
+          -PdockerImageName=${{ env.IMAGE_NAME }}
+      - name: "🚀 Deploy Docker image"
+        run: >
+          gcloud run deploy ${{ secrets.GCP_PROJECT_ID }}-snapshot
+          --image $IMAGE_NAME
+          --region us-central1
+          --update-env-vars=HOSTNAME="snapshot.grails.org",CORS_ALLOWED_ORIGIN="https://start.grails.org",GITHUB_OAUTH_APP_CLIENT_ID=${{ secrets.GH_OAUTH_SNAPSHOT_CLIENT_ID }},GITHUB_OAUTH_APP_CLIENT_SECRET=${{ secrets.GH_OAUTH_SNAPSHOT_CLIENT_SECRET }},GITHUB_USER_AGENT=${{ secrets.GH_USER_AGENT }},GITHUB_REDIRECT_URL=${{ secrets.GH_REDIRECT_URL }}
+          --platform managed
+          --allow-unauthenticated
+          --service-account=${{ secrets.GCLOUD_EMAIL }}
   deployAnalytics:
-    name: Deploy Analytics To Google Cloud Run
-    runs-on: ubuntu-latest
     # Snapshots should only be deployed from the latest release branch
     # as it updates the snapshot version on https://start.grails.org.
     if: false # github.event_name != 'pull_request'
-    needs: [build]
+    name: "Deploy Analytics To Google Cloud Run"
+    runs-on: ubuntu-latest
+    needs: build
     env:
       IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}-analytics:snapshot
     steps:
-      - name: Login
+      - name: "🔑 Login"
         uses: google-github-actions/setup-gcloud@v0
         with:
           project_id: ${{ secrets.GCP_PROJECT_ID }}
           service_account_email: ${{ secrets.GCP_EMAIL }}
           service_account_key: ${{ secrets.GCP_CREDENTIALS }}
-      - name: Configure Docker
+      - name: "🐋 Configure Docker"
         run: gcloud auth configure-docker --quiet
-      - name: Checkout repository
-        uses: actions/checkout@v3
-      - name: Set up JDK
-        uses: actions/setup-java@v3.11.0
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
+      - name: "☕️ Setup JDK"
+        uses: actions/setup-java@v4
         with:
-          distribution: 'adopt'
-          java-version: '11'
-      - name: Run Tests
-        uses: gradle/gradle-build-action@v2
+          distribution: 'liberica'
+          java-version: '17'
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "✅ Run Tests"
         env:
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-forge-analytics-postgres:test
-      - name: Build Docker image
-        uses: gradle/gradle-build-action@v2
+        run: ./gradlew grails-forge-analytics-postgres:test
+      - name: "🔨 Build Docker image"
         # To deploy native executables built with GraalVM replace dockerBuild with dockerBuildNative and dockerPush with dockerPushNative. First, try that it works locally.
         env:
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-forge-analytics-postgres:dockerBuildNative -PdockerImageName=${{ env.IMAGE_NAME }}
-      - name: Push image to Google Cloud Container Registry
-        uses: gradle/gradle-build-action@v2
+        run: >
+          ./gradlew
+          grails-forge-analytics-postgres:dockerBuildNative
+          -PdockerImageName=${{ env.IMAGE_NAME }}
+      - name: "📤 Push image to Google Cloud Container Registry"
         env:
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-forge-analytics-postgres:dockerPushNative -PdockerImageName=${{ env.IMAGE_NAME }}
-      - name: Deploy Docker image
+        run: >
+          ./gradlew
+          grails-forge-analytics-postgres:dockerPushNative
+          -PdockerImageName=${{ env.IMAGE_NAME }}
+      - name: "🚀 Deploy Docker image"
         run: |
           gcloud components install beta --quiet
           gcloud run deploy ${{ secrets.GCP_PROJECT_ID }}-analytics-snapshot --image $IMAGE_NAME --region us-central1 --platform managed --allow-unauthenticated --service-account=${{ secrets.GCLOUD_EMAIL }}
-
   linux:
-    name: Builds Linux Native CLI
+    name: "Build Linux Native CLI"
     runs-on: ubuntu-latest
-    needs: [build]
+    needs: build
     steps:
-      - name: Checkout the repository
-        uses: actions/checkout@v3
-      - name: Setup GraalVM CE
-        uses: graalvm/setup-graalvm@v1.0.12
+      - name: "📥 Checkout the repository"
+        uses: actions/checkout@v4
+      - name: "☕️ Setup GraalVM CE"
+        uses: graalvm/setup-graalvm@v1
         with:
-          version: '21.3.3.1'
-          java-version: '11'
+          java-version: '17'
+          distribution: 'graalvm-community'
           components: 'native-image'
           github-token: ${{ secrets.GITHUB_TOKEN }}
-      - name: Build the JAR
-        uses: gradle/gradle-build-action@v2
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "📸 Build the Native Image"
         env:
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-cli:shadowJar --no-daemon
-      - name: Build Native Image
-        run: native-image --no-fallback --allow-incomplete-classpath -cp grails-cli/build/libs/grails-cli-*-all.jar
-      - name: Verify Build
-        run: ./grails --version
-      - name: Verify Create App
-        run: ./grails create-app test
-      - name: Package Build
+        run: ./gradlew grails-cli:nativeCompile --no-daemon
+      - name: "✅ Verify Build"
+        run: ./grails-cli/build/native/nativeCompile/grails --version
+      - name: "✅ Verify Create App"
+        run: ./grails-cli/build/native/nativeCompile/grails create-app test
+      - name: "📦 Package Build"
         env:
           VERSION: ${{ github.event.release.tag_name }}
         run: |
           mkdir -p grails-linux-amd64-snapshot/bin
-          mv ./grails grails-linux-amd64-snapshot/bin
+          mv ./grails-cli/build/native/nativeCompile/grails grails-linux-amd64-snapshot/bin
           cp ./LICENSE grails-linux-amd64-snapshot/
           zip -r grails-linux-amd64-snapshot.zip ./grails-linux-amd64-snapshot
-      - name: Upload Snapshot
+      - name: "📤 Upload Artifact to Workflow Summary Page"
         if: success() && github.event_name == 'push' && github.ref == 'refs/heads/6.0.x'
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
           name: grails-linux-amd64-snapshot
           path: grails-linux-amd64-snapshot.zip
   macos:
-    name: Builds OS X Native CLI
-    runs-on: macos-latest
-    needs: [build]
+    name: "Build OS X Intel Native CLI"
+    runs-on: macos-13
+    needs: build
     steps:
-      - name: Checkout the repository
-        uses: actions/checkout@v3
-      - name: Setup GraalVM CE
-        uses: graalvm/setup-graalvm@v1.0.12
+      - name: "📥 Checkout the repository"
+        uses: actions/checkout@v4
+      - name: "☕️ Setup GraalVM CE"
+        uses: graalvm/setup-graalvm@v1
         with:
-          version: '21.3.3.1'
-          java-version: '11'
+          java-version: '17'
+          distribution: 'graalvm-community'
           components: 'native-image'
           github-token: ${{ secrets.GITHUB_TOKEN }}
-      - name: Build the JAR
-        uses: gradle/gradle-build-action@v2
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "📸 Build the Native Image"
         env:
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-cli:shadowJar --no-daemon
-      - name: Build Native Image
-        run: native-image --no-fallback --allow-incomplete-classpath -cp grails-cli/build/libs/grails-cli-*-all.jar
-      - name: Verify Build
-        run: ./grails --version
-      - name: Verify Create App
-        run: ./grails create-app test
-      - name: Package Build
+        run: ./gradlew grails-cli:nativeCompile --no-daemon
+      - name: "✅ Verify Build"
+        run: ./grails-cli/build/native/nativeCompile/grails --version
+      - name: "✅ Verify Create App"
+        run: ./grails-cli/build/native/nativeCompile/grails create-app test
+      - name: "📦 Package Build"
         env:
           VERSION: ${{ github.event.release.tag_name }}
         run: |
           mkdir -p grails-darwin-amd64-snapshot/bin
-          mv ./grails grails-darwin-amd64-snapshot/bin
+          mv ./grails-cli/build/native/nativeCompile/grails grails-darwin-amd64-snapshot/bin
           cp ./LICENSE grails-darwin-amd64-snapshot/
           zip -r grails-darwin-amd64-snapshot.zip ./grails-darwin-amd64-snapshot -x '*.DS_Store*' -x '__MAC_OSX'
-      - name: Upload Snapshot
+      - name: "📤 Upload Artifact to Workflow Summary Page"
         if: success() && github.event_name == 'push' && github.ref == 'refs/heads/6.0.x'
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
           name: grails-darwin-amd64-snapshot
           path: grails-darwin-amd64-snapshot.zip
-  windows:
-    name: Builds Windows Native CLI
-    runs-on: windows-latest
+  macos-arm:
+    name: "Build OS X Arm Native CLI"
+    runs-on: macos-latest
     needs: [build]
     steps:
-      - uses: actions/checkout@v3
-      - name: Setup GraalVM CE
-        uses: graalvm/setup-graalvm@v1.0.12
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
+      - name: "☕️ Setup GraalVM CE"
+        uses: graalvm/setup-graalvm@v1
         with:
-          version: '21.3.3.1'
-          java-version: '11'
+          java-version: '17'
+          distribution: 'graalvm-community'
           components: 'native-image'
           github-token: ${{ secrets.GITHUB_TOKEN }}
-      - name: Build JAR File
-        uses: gradle/gradle-build-action@v2
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "📸 Build the Native Image"
         env:
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+        run: ./gradlew grails-cli:nativeCompile --no-daemon
+      - name: "✅ Verify Build"
+        run: ./grails-cli/build/native/nativeCompile/grails --version
+      - name: "✅ Verify Create App"
+        run: ./grails-cli/build/native/nativeCompile/grails create-app test
+      - name: "📦 Package Build"
+        env:
+          VERSION: ${{ github.event.release.tag_name }}
+        run: |
+          mkdir -p grails-darwin-aarch64-snapshot/bin
+          mv ./grails-cli/build/native/nativeCompile/grails grails-darwin-aarch64-snapshot/bin
+          cp ./LICENSE grails-darwin-aarch64-snapshot/
+          zip -r grails-darwin-aarch64-snapshot.zip grails-darwin-aarch64-snapshot/ -x '*.DS_Store*' -x '__MAC_OSX'
+      - name: "📤 Upload Artifact to Workflow Summary Page"
+        if: success() && github.event_name == 'push' && github.ref == 'refs/heads/6.0.x'
+        uses: actions/upload-artifact@v4
+        with:
+          name: grails-darwin-aarch64-snapshot
+          path: grails-darwin-aarch64-snapshot.zip
+  windows:
+    name: "Build Windows Native CLI"
+    runs-on: windows-latest
+    needs: build
+    steps:
+      - name: "📥 Checkout the repository"
+        uses: actions/checkout@v4
+      - name: "☕️ Setup GraalVM CE"
+        uses: graalvm/setup-graalvm@v1
         with:
-          arguments: grails-cli:copyShadowJar --no-daemon
-      - name: Build Native Image
+          java-version: '17'
+          distribution: 'graalvm-community'
+          components: 'native-image'
+          github-token: ${{ secrets.GITHUB_TOKEN }}
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "📸 Build the Native Image"
+        env:
+          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+        run: ./gradlew grails-cli:nativeCompile --no-daemon
+      - name: "✅ Verify Build (Powershell)"
         shell: powershell
-        run: native-image.cmd --no-fallback --allow-incomplete-classpath -cp build/libs/cli.jar
-      - name: Verify Build (Powershell)
+        run: ./grails-cli/build/native/nativeCompile/grails.exe --version
+      - name: "✅ Verify Create App (Powershell)"
         shell: powershell
-        run: ./grails.exe --version
-      - name: Verify Create App (Powershell)
-        run: ./grails.exe create-app test
-      - name: Verify Build (CMD)
+        run: ./grails-cli/build/native/nativeCompile/grails.exe create-app test
+      - name: "✅ Verify Build (CMD)"
         shell: cmd
-        run: grails --version
-      - name: Verify Create App (CMD)
+        run: grails-cli\\build\\native\\nativeCompile\\grails --version
+      - name: "✅ Verify Create App (CMD)"
         shell: cmd
-        run: grails create-app test2
-      - name: ZIP Archive
+        run: grails-cli\\build\\native\\nativeCompile\\grails create-app test2
+      - name: "📦 ZIP Archive"
         run: |
           New-Item "./grails-win-amd64-snapshot/bin" -ItemType Directory -ea 0
-          Move-Item -Path ./grails.exe -Destination "./grails-win-amd64-snapshot/bin"
+          Move-Item -Path ./grails-cli/build/native/nativeCompile/grails.exe -Destination "./grails-win-amd64-snapshot/bin"
           Copy-Item "./LICENSE" -Destination "./grails-win-amd64-snapshot"
           Compress-Archive -Path "./grails-win-amd64-snapshot" -Update -DestinationPath ./grails-win-amd64-snapshot.zip
-      - name: Publish artifact
+      - name: "📤 Upload Artifact to Workflow Summary Page"
         if: success() && github.event_name == 'push' && github.ref == 'refs/heads/6.0.x'
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
           name: grails-win-amd64-snapshot
-          path: ./grails-win-amd64-snapshot.zip
+          path: ./grails-win-amd64-snapshot.zip
\ No newline at end of file

From f7fa9cc2d6119466dab98b4db56ffdebffb52363 Mon Sep 17 00:00:00 2001
From: Mattias Reichel 
Date: Tue, 26 Nov 2024 11:57:22 +0100
Subject: [PATCH 30/37] build: Update develocity gradle plugins

---
 .github/workflows/mavenCentral.yml |  6 +--
 .github/workflows/release.yml      | 78 +++++++++++++++---------------
 .github/workflows/snapshot.yml     | 44 ++++++++---------
 settings.gradle                    | 40 +++++++--------
 4 files changed, 85 insertions(+), 83 deletions(-)

diff --git a/.github/workflows/mavenCentral.yml b/.github/workflows/mavenCentral.yml
index 42188c8c..ae3bc675 100644
--- a/.github/workflows/mavenCentral.yml
+++ b/.github/workflows/mavenCentral.yml
@@ -30,8 +30,8 @@ jobs:
           SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
           SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
           SIGNING_PASSPHRASE: ${{ secrets.SIGNING_PASSPHRASE }}
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         with:
           arguments: -Psigning.secretKeyRingFile=${{ github.workspace }}/secring.gpg publishToSonatype closeAndReleaseSonatypeStagingRepository
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 876567fe..1c5277ec 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -9,9 +9,9 @@ jobs:
     permissions:
       contents: write
     env:
-      GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
       GIT_USER_NAME: puneetbehl
       GIT_USER_EMAIL: behlp@objectcomputing.com
     steps:
@@ -95,9 +95,9 @@ jobs:
     runs-on: ubuntu-latest
     needs: [build]
     env:
-      GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
     steps:
       - name: Checkout repository
         uses: actions/checkout@v3
@@ -123,9 +123,9 @@ jobs:
       - name: Run Tests
         uses: gradle/gradle-build-action@v2
         env:
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         with:
           arguments: grails-forge-api:test grails-forge-web-netty:test
       - name: Build Docker image
@@ -133,18 +133,18 @@ jobs:
         uses: gradle/gradle-build-action@v2
         env:
           IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}:${{ steps.release_version.outputs.release_version }}
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         with:
           arguments: grails-forge-web-netty:dockerBuildNative -PdockerImageName=${{ env.IMAGE_NAME }}
       - name: Push image to Google Cloud Container Registry
         uses: gradle/gradle-build-action@v2
         env:
           IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}:${{ steps.release_version.outputs.release_version }}
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOVITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         with:
           arguments: grails-forge-web-netty:dockerPushNative -PdockerImageName=${{ env.IMAGE_NAME }}
       - name: Deploy Docker image
@@ -160,9 +160,9 @@ jobs:
     runs-on: ubuntu-latest
     needs: [build]
     env:
-      GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
     steps:
       - name: Checkout repository
         uses: actions/checkout@v3
@@ -188,9 +188,9 @@ jobs:
       - name: Run Tests
         uses: gradle/gradle-build-action@v2
         env:
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         with:
           arguments: grails-forge-analytics-postgres:test
       - name: Build Docker image
@@ -198,18 +198,18 @@ jobs:
         # To deploy native executables built with GraalVM replace dockerBuild with dockerBuildNative and dockerPush with dockerPushNative. First, try that it works locally.
         env:
           IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}-analytics:${{ steps.release_version.outputs.release_version }}
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         with:
           arguments: grails-forge-analytics-postgres:dockerBuildNative -PdockerImageName=${{ env.IMAGE_NAME }}
       - name: Push image to Google Cloud Container Registry
         uses: gradle/gradle-build-action@v2
         env:
           IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}-analytics:${{ steps.release_version.outputs.release_version }}
-          GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         with:
           arguments: grails-forge-analytics-postgres:dockerPushNative -PdockerImageName=${{ env.IMAGE_NAME }}
       - name: Deploy Docker image
@@ -225,9 +225,9 @@ jobs:
     name: Release Linux Native CLI
     runs-on: ubuntu-latest
     env:
-      GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
     needs: [build]
     steps:
       - name: Checkout repository
@@ -277,9 +277,9 @@ jobs:
     name: Release OS X Native CLI
     runs-on: macos-latest
     env:
-      GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
     needs: [build]
     steps:
       - name: Checkout repository
@@ -329,9 +329,9 @@ jobs:
     name: Release Windows Native CLI
     runs-on: windows-latest
     env:
-      GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
     needs: [build]
     steps:
       - name: Checkout repository
@@ -382,9 +382,9 @@ jobs:
     name: Release to SDKMAN!
     runs-on: ubuntu-latest
     env:
-      GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
     needs: [linux, macos, windows]
     steps:
       - name: Checkout repository
diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml
index 9babfcbf..f950568a 100644
--- a/.github/workflows/snapshot.yml
+++ b/.github/workflows/snapshot.yml
@@ -29,8 +29,8 @@ jobs:
       - name: "🔨 Run Build"
         id: build
         env:
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         run: ./gradlew build
       - name: "✅ Verify CLI"
         if: success()
@@ -77,8 +77,8 @@ jobs:
           develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
       - name: "✅ Run Tests"
         env:
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         run: >
           ./gradlew
           grails-forge-api:test
@@ -86,16 +86,16 @@ jobs:
       - name: "🔨 Build Docker image"
         # To deploy native executables built with GraalVM replace dockerBuild with dockerBuildNative and dockerPush with dockerPushNative. First, try that it works locally.
         env:
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         run: >
           ./gradlew
           grails-forge-web-netty:dockerBuildNative
           -PdockerImageName=${{ env.IMAGE_NAME }}
       - name: "📤 Push image to Google Cloud Container Registry"
         env:
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         run: >
           ./gradlew
           grails-forge-web-netty:dockerPushNative
@@ -140,22 +140,22 @@ jobs:
           develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
       - name: "✅ Run Tests"
         env:
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         run: ./gradlew grails-forge-analytics-postgres:test
       - name: "🔨 Build Docker image"
         # To deploy native executables built with GraalVM replace dockerBuild with dockerBuildNative and dockerPush with dockerPushNative. First, try that it works locally.
         env:
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         run: >
           ./gradlew
           grails-forge-analytics-postgres:dockerBuildNative
           -PdockerImageName=${{ env.IMAGE_NAME }}
       - name: "📤 Push image to Google Cloud Container Registry"
         env:
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         run: >
           ./gradlew
           grails-forge-analytics-postgres:dockerPushNative
@@ -184,8 +184,8 @@ jobs:
           develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
       - name: "📸 Build the Native Image"
         env:
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         run: ./gradlew grails-cli:nativeCompile --no-daemon
       - name: "✅ Verify Build"
         run: ./grails-cli/build/native/nativeCompile/grails --version
@@ -225,8 +225,8 @@ jobs:
           develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
       - name: "📸 Build the Native Image"
         env:
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         run: ./gradlew grails-cli:nativeCompile --no-daemon
       - name: "✅ Verify Build"
         run: ./grails-cli/build/native/nativeCompile/grails --version
@@ -266,8 +266,8 @@ jobs:
           develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
       - name: "📸 Build the Native Image"
         env:
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         run: ./gradlew grails-cli:nativeCompile --no-daemon
       - name: "✅ Verify Build"
         run: ./grails-cli/build/native/nativeCompile/grails --version
@@ -307,8 +307,8 @@ jobs:
           develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
       - name: "📸 Build the Native Image"
         env:
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-          GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         run: ./gradlew grails-cli:nativeCompile --no-daemon
       - name: "✅ Verify Build (Powershell)"
         shell: powershell
diff --git a/settings.gradle b/settings.gradle
index e3bcd29a..82d3e035 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -10,34 +10,36 @@ buildscript {
     }
 }
 plugins {
-    id "com.gradle.enterprise" version "3.14"
-    id 'com.gradle.common-custom-user-data-gradle-plugin' version '1.11.1'
+    id "com.gradle.develocity" version "3.18.2"
+    id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.0.2'
 }
 
-gradleEnterprise {
+def isCI = System.getenv('CI') != null
+def isLocal = !isCI
+def isAuthenticated = System.getenv('DEVELOCITY_ACCESS_KEY') != null
+def isBuildCacheAuthenticated =
+        System.getenv('DEVELOCITY_BUILD_CACHE_NODE_USER') != null &&
+        System.getenv('DEVELOCITY_BUILD_CACHE_NODE_KEY') != null
+
+develocity {
     server = 'https://ge.grails.org'
     buildScan {
-        publishAlways()
-        publishIfAuthenticated()
-        uploadInBackground = System.getenv("CI") == null
-        capture {
-            taskInputFiles = true
-        }
+        publishing.onlyIf { isAuthenticated }
+        uploadInBackground = isLocal
     }
 }
 
 buildCache {
-    local { enabled = System.getenv('CI') != 'true' }
-    remote(HttpBuildCache) {
-        push = System.getenv('CI') == 'true'
+    local { enabled = isLocal }
+    remote(develocity.buildCache) {
+        push = isCI && isBuildCacheAuthenticated
         enabled = true
-        url = 'https://ge.grails.org/cache/'
-        credentials {
-            username = System.getenv('GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER')
-            password = System.getenv('GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY')
-        }
-    }}
-
+        usernameAndPassword(
+                System.getenv('DEVELOCITY_BUILD_CACHE_NODE_USER') ?: '',
+                System.getenv('DEVELOCITY_BUILD_CACHE_NODE_KEY') ?: ''
+        )
+    }
+}
 
 rootProject.name = 'grails-forge'
 

From 76edeff95416873e739579dce0de771f9d693acc Mon Sep 17 00:00:00 2001
From: Mattias Reichel 
Date: Tue, 26 Nov 2024 12:10:35 +0100
Subject: [PATCH 31/37] fix: Compatible with Java 17

---
 .../src/main/java/org/grails/forge/util/IOFeatureUtil.java  | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/grails-forge-core/src/main/java/org/grails/forge/util/IOFeatureUtil.java b/grails-forge-core/src/main/java/org/grails/forge/util/IOFeatureUtil.java
index 4159b840..2033af27 100644
--- a/grails-forge-core/src/main/java/org/grails/forge/util/IOFeatureUtil.java
+++ b/grails-forge-core/src/main/java/org/grails/forge/util/IOFeatureUtil.java
@@ -49,8 +49,10 @@ public static void walk(final Path path, BiFunction
Date: Tue, 26 Nov 2024 12:54:35 +0100
Subject: [PATCH 32/37] build: add `org.graalvm.buildtools.native` gradle
 plugin

---
 grails-cli/build.gradle | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/grails-cli/build.gradle b/grails-cli/build.gradle
index 9cd7c1eb..d767fc00 100644
--- a/grails-cli/build.gradle
+++ b/grails-cli/build.gradle
@@ -1,5 +1,6 @@
 plugins {
     id "org.grails.forge.internal.build.cli-module"
+    id 'org.graalvm.buildtools.native' version '0.10.3'
 }
 
 sourceSets {
@@ -46,6 +47,30 @@ dependencies {
     testImplementation 'org.reflections:reflections:0.10.2'
 }
 
+graalvmNative {
+    toolchainDetection = false
+
+    binaries {
+        main {
+            // Main options
+            sharedLibrary = false
+            imageName = "grails"
+            buildArgs(
+                    "--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.configure=ALL-UNNAMED",
+                    "--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk=ALL-UNNAMED",
+                    "--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.jni=ALL-UNNAMED",
+                    "--add-exports=org.graalvm.sdk/org.graalvm.nativeimage.impl=ALL-UNNAMED",
+                    "-H:+ReportExceptionStackTraces"
+            )
+            if (project.hasProperty("musl")) {
+                logger.lifecycle("Using musl libc")
+                buildArgs("--libc=musl", "--static")
+            }
+            mainClass = "org.grails.forge.cli.Application"
+        }
+    }
+}
+
 application {
     mainClass = "org.grails.forge.cli.Application"
 }
@@ -67,8 +92,7 @@ sdkman {
     version = project.version
     hashtag = "#grailsfw"
     platforms = [
-            // TODO:  Once graal native-image works for arm OSX, we should switch to building and publishing a non-rosetta release (https://github.com/oracle/graal/issues/2666)
-            "MAC_ARM64":"https://github.com/grails/grails-forge/releases/download/v${project.version}/grails-darwin-amd64-v${project.version}.zip",
+            "MAC_ARM64":"https://github.com/grails/grails-forge/releases/download/v${project.version}/grails-darwin-aarch64-v${project.version}.zip",
             "MAC_OSX":"https://github.com/grails/grails-forge/releases/download/v${project.version}/grails-darwin-amd64-v${project.version}.zip",
             "WINDOWS_64":"https://github.com/grails/grails-forge/releases/download/v${project.version}/grails-win-amd64-v${project.version}.zip",
             "LINUX_64":"https://github.com/grails/grails-forge/releases/download/v${project.version}/grails-linux-amd64-v${project.version}.zip"

From a9a6f3b69f4d621dc15f3219a58b54fe66b3b4b0 Mon Sep 17 00:00:00 2001
From: James Daugherty 
Date: Mon, 25 Nov 2024 21:08:25 +0100
Subject: [PATCH 33/37] [Backport] Do not default the java version from the
 grails cli version (#434)

Decouples the graalvm version used for compiling the grails-cli from the
java version used in the projects it creates.
---
 .github/workflows/mavenCentral.yml            |  31 +-
 .github/workflows/release.yml                 | 512 ++++++++++--------
 .github/workflows/sdkman.yml                  |  39 ++
 .github/workflows/snapshot.yml                |   4 +-
 grails-cli/build.gradle                       |  20 +-
 .../org/grails/forge/cli/CodeGenConfig.java   |   4 +-
 .../forge/cli/command/CreateCommand.java      |   3 +-
 .../forge/cli/util/GrailsVersionProvider.java |   5 +-
 .../cli/command/ApplicationCommandSpec.groovy |  41 ++
 .../workflows/templates/javaSetup.rocker.raw  |   6 +-
 .../org/grails/forge/options/Options.java     |   4 +-
 11 files changed, 403 insertions(+), 266 deletions(-)
 create mode 100644 .github/workflows/sdkman.yml
 create mode 100644 grails-cli/src/test/groovy/org/grails/forge/cli/command/ApplicationCommandSpec.groovy

diff --git a/.github/workflows/mavenCentral.yml b/.github/workflows/mavenCentral.yml
index ae3bc675..c527e356 100644
--- a/.github/workflows/mavenCentral.yml
+++ b/.github/workflows/mavenCentral.yml
@@ -1,4 +1,4 @@
-name: Maven Central Sync
+name: "Maven Central Sync"
 on:
   workflow_dispatch:
     inputs:
@@ -7,31 +7,36 @@ on:
         required: true
 jobs:
   build:
-    name: Maven Central Sync
+    name: "Maven Central Sync"
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v3
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
         with:
           ref: v${{ github.event.inputs.release_version }}
-      - uses: gradle/wrapper-validation-action@v1
-      - name: Set up JDK
-        uses: actions/setup-java@v3.11.0
+      - name: "☕️ Setup JDK"
+        uses: actions/setup-java@v4
         with:
-          distribution: 'adopt'
+          distribution: 'liberica'
           java-version: '11'
-      - name: Generate secring file
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "🔐 Generate secring file"
         env:
           SECRING_FILE: ${{ secrets.SECRING_FILE }}
         run: echo $SECRING_FILE | base64 -d > ${{ github.workspace }}/secring.gpg
-      - name: Publish to Sonatype OSSRH
-        uses: gradle/gradle-build-action@v2
+      - name: "📤 Publish to Sonatype OSSRH"
         env:
           SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
           SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
           SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
           SIGNING_PASSPHRASE: ${{ secrets.SIGNING_PASSPHRASE }}
-          DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
           DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: -Psigning.secretKeyRingFile=${{ github.workspace }}/secring.gpg publishToSonatype closeAndReleaseSonatypeStagingRepository
+        run: >
+          ./gradlew
+          -Psigning.secretKeyRingFile=${{ github.workspace }}/secring.gpg
+          publishToSonatype
+          closeAndReleaseSonatypeStagingRepository
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 1c5277ec..45c72266 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,269 +1,276 @@
-name: Release
+name: "Release"
 on:
   release:
     types: [published]
 jobs:
   build:
-    name: Release artifacts to Bintray, Maven Central & SDKMAN, and publish documentation
+    name: "Release artifacts to Bintray, Maven Central & SDKMAN, and publish documentation"
     runs-on: ubuntu-latest
     permissions:
       contents: write
+    outputs:
+      release_version: ${{ steps.release_version.outputs.value }}
     env:
-      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-      GIT_USER_NAME: puneetbehl
-      GIT_USER_EMAIL: behlp@objectcomputing.com
+      GIT_USER_NAME: 'grails-build'
+      GIT_USER_EMAIL: 'grails-build@users.noreply.github.com'
     steps:
-      - name: Checkout repository
-        uses: actions/checkout@v3
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
+      - name: "☕️ Setup JDK"
+        uses: actions/setup-java@v4
         with:
-          token: ${{ secrets.GH_TOKEN }}
-      - uses: gradle/wrapper-validation-action@v1
-      - name: Set up JDK
-        uses: actions/setup-java@v3
-        with:
-          distribution: 'adopt'
+          distribution: 'liberica'
           java-version: '11'
-      - name: Set the current release version
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "🔢 Set the current release version"
         id: release_version
-        run: echo ::set-output name=release_version::${GITHUB_REF:11}
-      - name: Run pre-release
+        run: |
+          echo "Update grailsVersion to ${GITHUB_REF:11}"
+          sed -i "s/^grailsVersion.*$/grailsVersion\=${GITHUB_REF:11}/" gradle.properties
+          sed -i "s/grailsVersion=${GITHUB_REF:11}-SNAPSHOT/grailsVersion\=${GITHUB_REF:11}/" grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy
+          echo "value=${GITHUB_REF:11}" >> $GITHUB_OUTPUT
+      - name: "📝 Commit release version"
+        uses: stefanzweifel/git-auto-commit-action@v5.0.1
+        with:
+          commit_message: "chore: Update grailsVersion to ${{ steps.release_version.outputs.value }}"
+          commit_user_name: ${{ env.GIT_USER_NAME }}
+          commit_user_email: ${{ env.GIT_USER_EMAIL }}
+          commit_author: ${{ env.GIT_USER_NAME }} <${{ env.GIT_USER_EMAIL }}>
+          file_pattern: .
+          branch: 6.0.x
+      - name: "⚙️ Run pre-release"
         uses: micronaut-projects/github-actions/pre-release@master
         with:
           token: ${{ secrets.GITHUB_TOKEN }}
-      - name: Build All
+      - name: "🔨 Build All"
+        env:
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
         run: ./gradlew grails-cli:assemble
-
-      - name: Generate secring file
+      - name: "🔐 Generate secring file"
         env:
           SECRING_FILE: ${{ secrets.SECRING_FILE }}
         run: echo $SECRING_FILE | base64 -d > ${{ github.workspace }}/secring.gpg
-      - name: Publish to Maven Central
-        uses: gradle/gradle-build-action@v2
+      - name: "📤 Publish to Sonatype OSSRH"
         env:
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
           SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
           SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
           SONATYPE_NEXUS_URL: ${{ secrets.SONATYPE_NEXUS_URL }}
           SONATYPE_STAGING_PROFILE_ID: ${{ secrets.SONATYPE_STAGING_PROFILE_ID }}
           SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
           SIGNING_PASSPHRASE: ${{ secrets.SIGNING_PASSPHRASE }}
-        with:
-          arguments: -Psigning.secretKeyRingFile=${{ github.workspace }}/secring.gpg publishToSonatype closeAndReleaseSonatypeStagingRepository docs
-      - name: Upload CLI Zip
+        run: >
+          ./gradlew
+          -Psigning.secretKeyRingFile=${{ github.workspace }}/secring.gpg
+          publishToSonatype
+          closeSonatypeStagingRepository
+          docs
+      - name: "📤 Upload CLI Zip"
         id: upload-release-asset
         uses: actions/upload-release-asset@v1
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
         with:
           upload_url: ${{ github.event.release.upload_url }}
-          asset_path: grails-cli/build/distributions/grails-cli-${{ steps.release_version.outputs.release_version }}.zip
-          asset_name: grails-cli-${{ steps.release_version.outputs.release_version }}.zip
+          asset_path: grails-cli/build/distributions/grails-cli-${{ steps.release_version.outputs.value }}.zip
+          asset_name: grails-cli-${{ steps.release_version.outputs.value }}.zip
           asset_content_type: application/zip
-      - name: Publish to Github Pages
-        if: success()
+      - name: "📤 Publish to Github Pages"
         uses: micronaut-projects/github-pages-deploy-action@master
         env:
-          BETA: ${{ contains(steps.release_version.outputs.release_version, 'M') || contains(steps.release_version.outputs.release_version, 'RC') }}
+          BETA: ${{ contains(steps.release_version.outputs.value, 'M') || contains(steps.release_version.outputs.release_version, 'RC') }}
           GH_TOKEN: ${{ secrets.GH_TOKEN }}
           BASE_BRANCH: 6.0.x
           BRANCH: gh-pages
           FOLDER: build/docs
-          VERSION: ${{ steps.release_version.outputs.release_version }}
-      - name: Run post-release
+          VERSION: ${{ steps.release_version.outputs.value }}
+      - name: "⚙️ Run post-release"
         if: success()
         id: post_release
         continue-on-error: true
         uses: micronaut-projects/github-actions/post-release@master
         with:
           token: ${{ secrets.GITHUB_TOKEN }}
-      - name: Back to snapshot
+      - name: "🔢 Back to snapshot version"
         continue-on-error: true
         run: |
           echo "Setting new Grails snapshot version"
           sed -i "s/^grailsVersion.*$/grailsVersion\=${{ steps.post_release.outputs.next_version }}-SNAPSHOT/" gradle.properties
-      - uses: stefanzweifel/git-auto-commit-action@v4.16.0
+          sed -i "s/grailsVersion=${GITHUB_REF:11}/grailsVersion\=${{ steps.post_release.outputs.next_version }}-SNAPSHOT/" grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy
+      - name: "📝 Commit snapshot version"
+        uses: stefanzweifel/git-auto-commit-action@v5.0.1
         continue-on-error: true
         with:
-          commit_message: Back Grails version to snapshot
+          commit_message: "chore: Next snapshot version"
           commit_user_name: ${{ env.GIT_USER_NAME }}
           commit_user_email: ${{ env.GIT_USER_EMAIL }}
           commit_author: ${{ env.GIT_USER_NAME }} <${{ env.GIT_USER_EMAIL }}>
           file_pattern: gradle.properties
   deploy:
-    name: Deploy To Google Cloud Run
+    name: "Deploy To Google Cloud Run"
     runs-on: ubuntu-latest
-    needs: [build]
-    env:
-      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+    needs: build
     steps:
-      - name: Checkout repository
-        uses: actions/checkout@v3
-      - name: Set the current release version
-        id: release_version
-        run: |
-          release_version=${GITHUB_REF:11}
-          sed -i "s/^projectVersion.*$/projectVersion\=${release_version}/" gradle.properties
-          echo "release_version=${release_version}" >> $GITHUB_OUTPUT
-      - name: Login
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
+        with:
+          ref: v${{ needs.build.outputs.release_version }}
+      - name: "🔑 Login to Google Cloud"
         uses: google-github-actions/setup-gcloud@v0
         with:
           project_id: ${{ secrets.GCP_PROJECT_ID }}
           service_account_email: ${{ secrets.GCP_EMAIL }}
           service_account_key: ${{ secrets.GCP_CREDENTIALS }}
-      - name: Configure Docker
+      - name: "🐋 Configure Docker"
         run: gcloud auth configure-docker --quiet
-      - name: Set up JDK
-        uses: actions/setup-java@v3.11.0
+      - name: "☕️ Setup JDK"
+        uses: actions/setup-java@v4
         with:
-          distribution: 'adopt'
+          distribution: 'liberica'
           java-version: '11'
-      - name: Run Tests
-        uses: gradle/gradle-build-action@v2
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "✅ Run Tests"
         env:
-          DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
           DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-forge-api:test grails-forge-web-netty:test
-      - name: Build Docker image
+        run: >
+          ./gradlew
+          grails-forge-api:test
+          grails-forge-web-netty:test
+      - name: "🔨 Build Docker image"
         # To deploy native executables built with GraalVM replace dockerBuild with dockerBuildNative and dockerPush with dockerPushNative. First, try that it works locally.
-        uses: gradle/gradle-build-action@v2
         env:
-          IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}:${{ steps.release_version.outputs.release_version }}
-          DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+          IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}:${{ needs.build.outputs.release_version }}
           DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-forge-web-netty:dockerBuildNative -PdockerImageName=${{ env.IMAGE_NAME }}
-      - name: Push image to Google Cloud Container Registry
-        uses: gradle/gradle-build-action@v2
+        run: >
+          ./gradlew
+          grails-forge-web-netty:dockerBuildNative
+          -PdockerImageName=${{ env.IMAGE_NAME }}
+      - name: "📤 Push image to Google Cloud Container Registry"
         env:
-          IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}:${{ steps.release_version.outputs.release_version }}
-          DEVELOVITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+          IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}:${{ needs.build.outputs.release_version }}
           DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-forge-web-netty:dockerPushNative -PdockerImageName=${{ env.IMAGE_NAME }}
-      - name: Deploy Docker image
+        run: >
+          ./gradlew
+          grails-forge-web-netty:dockerPushNative
+          -PdockerImageName=${{ env.IMAGE_NAME }}
+      - name: "🚀 Deploy Docker image"
         env:
-          release_version: ${{ steps.release_version.outputs.release_version }}
-          IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}:${{ steps.release_version.outputs.release_version }}
+          release_version: ${{ needs.build.outputs.release_version }}
+          IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}:${{ needs.build.outputs.release_version }}
         run: |
-          gcloud run deploy ${{ secrets.GCP_PROJECT_ID }}-latest --image $IMAGE_NAME --region us-central1 --update-env-vars=HOSTNAME="latest.grails.org",GITHUB_OAUTH_APP_CLIENT_ID=${{ secrets.GH_OAUTH_LATEST_CLIENT_ID }},GITHUB_OAUTH_APP_CLIENT_SECRET=${{ secrets.GH_OAUTH_LATEST_CLIENT_SECRET }},GITHUB_USER_AGENT=${{ secrets.GH_USER_AGENT }},GITHUB_REDIRECT_URL=${{ secrets.GH_REDIRECT_URL }} --platform managed --allow-unauthenticated --service-account=${{ secrets.GCLOUD_EMAIL }}
+          gcloud run deploy ${{ secrets.GCP_PROJECT_ID }}-latest --image $IMAGE_NAME --region us-central1 --update-env-vars=HOSTNAME="latest.grails.org",CORS_ALLOWED_ORIGIN="https://start.grails.org",GITHUB_OAUTH_APP_CLIENT_ID=${{ secrets.GH_OAUTH_LATEST_CLIENT_ID }},GITHUB_OAUTH_APP_CLIENT_SECRET=${{ secrets.GH_OAUTH_LATEST_CLIENT_SECRET }},GITHUB_USER_AGENT=${{ secrets.GH_USER_AGENT }},GITHUB_REDIRECT_URL=${{ secrets.GH_REDIRECT_URL }} --platform managed --allow-unauthenticated --service-account=${{ secrets.GCLOUD_EMAIL }}
           version="$(echo "${release_version//./}" | tr '[A-Z]' '[a-z]')"
-          gcloud run deploy ${{ secrets.GCP_PROJECT_ID }}-$version --image $IMAGE_NAME --region us-central1 --update-env-vars=HOSTNAME="grailsforge-600-cjmq3uyfcq-uc.a.run.app",GITHUB_OAUTH_APP_CLIENT_ID=${{ secrets.GH_OAUTH_LATEST_CLIENT_ID }},GITHUB_OAUTH_APP_CLIENT_SECRET=${{ secrets.GH_OAUTH_LATEST_CLIENT_SECRET }},GITHUB_USER_AGENT=${{ secrets.GH_USER_AGENT }},GITHUB_REDIRECT_URL=${{ secrets.GH_REDIRECT_URL }} --platform managed --allow-unauthenticated --service-account=${{ secrets.GCLOUD_EMAIL }}
+          gcloud run deploy ${{ secrets.GCP_PROJECT_ID }}-$version --image $IMAGE_NAME --region us-central1 --update-env-vars=HOSTNAME="grailsforge-600-cjmq3uyfcq-uc.a.run.app",CORS_ALLOWED_ORIGIN="https://start.grails.org",GITHUB_OAUTH_APP_CLIENT_ID=${{ secrets.GH_OAUTH_LATEST_CLIENT_ID }},GITHUB_OAUTH_APP_CLIENT_SECRET=${{ secrets.GH_OAUTH_LATEST_CLIENT_SECRET }},GITHUB_USER_AGENT=${{ secrets.GH_USER_AGENT }},GITHUB_REDIRECT_URL=${{ secrets.GH_REDIRECT_URL }} --platform managed --allow-unauthenticated --service-account=${{ secrets.GCLOUD_EMAIL }}
   deployanalytics:
-    name: Deploy Analytics To Google Cloud Run
+    name: "Deploy Analytics To Google Cloud Run"
     runs-on: ubuntu-latest
-    needs: [build]
-    env:
-      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+    needs: build
     steps:
-      - name: Checkout repository
-        uses: actions/checkout@v3
-      - name: Set the current release version
-        id: release_version
-        run: |
-          release_version=${GITHUB_REF:11}
-          sed -i "s/^projectVersion.*$/projectVersion\=${release_version}/" gradle.properties
-          echo "release_version=${release_version}" >> $GITHUB_OUTPUT
-      - name: Login
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
+        with:
+          ref: v${{ needs.build.outputs.release_version }}
+      - name: "🔑 Login"
         uses: google-github-actions/setup-gcloud@v0
         with:
           project_id: ${{ secrets.GCP_PROJECT_ID }}
           service_account_email: ${{ secrets.GCP_EMAIL }}
           service_account_key: ${{ secrets.GCP_CREDENTIALS }}
-      - name: Configure Docker
+      - name: "🐋 Configure Docker"
         run: gcloud auth configure-docker --quiet
-      - name: Set up JDK
-        uses: actions/setup-java@v3.11.0
+      - name: "☕️ Setup JDK"
+        uses: actions/setup-java@v4
         with:
-          distribution: 'adopt'
+          distribution: 'liberica'
           java-version: '11'
-      - name: Run Tests
-        uses: gradle/gradle-build-action@v2
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "✅ Run Tests"
         env:
-          DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
           DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-forge-analytics-postgres:test
-      - name: Build Docker image
-        uses: gradle/gradle-build-action@v2
+        run: >
+          ./gradlew
+          grails-forge-analytics-postgres:test
+      - name: "🔨 Build Docker image"
         # To deploy native executables built with GraalVM replace dockerBuild with dockerBuildNative and dockerPush with dockerPushNative. First, try that it works locally.
         env:
-          IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}-analytics:${{ steps.release_version.outputs.release_version }}
-          DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+          IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}-analytics:${{ needs.build.outputs.release_version }}
           DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-forge-analytics-postgres:dockerBuildNative -PdockerImageName=${{ env.IMAGE_NAME }}
-      - name: Push image to Google Cloud Container Registry
-        uses: gradle/gradle-build-action@v2
+        run: >
+          ./gradlew
+          grails-forge-analytics-postgres:dockerBuildNative
+          -PdockerImageName=${{ env.IMAGE_NAME }}
+      - name: "📤 Push image to Google Cloud Container Registry"
         env:
-          IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}-analytics:${{ steps.release_version.outputs.release_version }}
-          DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+          IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}-analytics:${{ needs.build.outputs.release_version }}
           DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-        with:
-          arguments: grails-forge-analytics-postgres:dockerPushNative -PdockerImageName=${{ env.IMAGE_NAME }}
-      - name: Deploy Docker image
+        run: >
+          ./gradlew
+          grails-forge-analytics-postgres:dockerPushNative
+          -PdockerImageName=${{ env.IMAGE_NAME }}
+      - name: "🚀 Deploy Docker image"
         env:
-          release_version: ${{ steps.release_version.outputs.release_version }}
-          IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}:${{ steps.release_version.outputs.release_version }}
+          release_version: ${{ needs.build.outputs.release_version }}
+          IMAGE_NAME: gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}:${{ needs.build.outputs.release_version }}
         run: |
           gcloud components install beta --quiet
           gcloud run deploy ${{ secrets.GCP_PROJECT_ID }}-analytics-latest --image $IMAGE_NAME --region us-central1 --platform managed --allow-unauthenticated --service-account=${{ secrets.GCLOUD_EMAIL }}
           version="$(echo "${release_version//./}" | tr '[A-Z]' '[a-z]')"
           gcloud run deploy ${{ secrets.GCP_PROJECT_ID }}-analytics-$version --image $IMAGE_NAME --region us-central1 --platform managed --allow-unauthenticated --service-account=${{ secrets.GCLOUD_EMAIL }}
   linux:
-    name: Release Linux Native CLI
+    name: "Release Linux Native CLI"
     runs-on: ubuntu-latest
-    env:
-      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-    needs: [build]
+    needs: build
     steps:
-      - name: Checkout repository
-        uses: actions/checkout@v3
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
         with:
-          token: ${{ secrets.GH_TOKEN }}
-      - name: Set the current release version
-        id: release_version
-        run: |
-          release_version=${GITHUB_REF:11}
-          sed -i "s/^projectVersion.*$/projectVersion\=${release_version}/" gradle.properties
-          echo ::set-output name=release_version::${release_version}
-      - name: Setup GraalVM CE
-        uses: graalvm/setup-graalvm@v1.0.12
+          ref: v${{ needs.build.outputs.release_version }}
+      - name: "☕️ Setup GraalVM CE"
+        uses: graalvm/setup-graalvm@v1
         with:
-          version: '21.3.3.1'
-          java-version: '11'
+          java-version: '17'
+          distribution: 'graalvm-community'
           components: 'native-image'
           github-token: ${{ secrets.GITHUB_TOKEN }}
-      - name: Build the JAR
-        uses: gradle/gradle-build-action@v2
-        with:
-          arguments: grails-cli:shadowJar --no-daemon
-      - name: Build Native Image
-        run: native-image --no-fallback --allow-incomplete-classpath -cp grails-cli/build/libs/grails-cli-*-all.jar
-      - name: Verify Build
-        run: ./grails --version
-      - name: Package Build
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "📸 Build the Native Image"
+        env:
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+        run: ./gradlew grails-cli:nativeCompile --no-daemon
+      - name: "✅ Verify Build"
+        run: ./grails-cli/build/native/nativeCompile/grails --version
+      - name: "✅ Verify Create App"
+        run: ./grails-cli/build/native/nativeCompile/grails create-app test
+      - name: "📦 Package Build"
         env:
           VERSION: ${{ github.event.release.tag_name }}
         run: |
           mkdir -p "grails-linux-amd64-${VERSION}/bin"
-          mv ./grails "grails-linux-amd64-${VERSION}/bin"
+          mv ./grails-cli/build/native/nativeCompile/grails "grails-linux-amd64-${VERSION}/bin"
           cp ./LICENSE "grails-linux-amd64-${VERSION}/"
           zip -r "grails-linux-amd64-${VERSION}.zip" "grails-linux-amd64-${VERSION}/"
-      - name: Upload Release Asset
+      - name: "📤 Upload Release Asset"
         id: upload-release-asset
         uses: actions/upload-release-asset@v1
         env:
@@ -274,48 +281,43 @@ jobs:
           asset_name: grails-linux-amd64-${{ github.event.release.tag_name }}.zip
           asset_content_type: application/zip
   macos:
-    name: Release OS X Native CLI
-    runs-on: macos-latest
-    env:
-      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-    needs: [build]
+    name: "Release OS X Intel Native CLI"
+    runs-on: macos-13
+    needs: build
     steps:
-      - name: Checkout repository
-        uses: actions/checkout@v3
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
         with:
-          token: ${{ secrets.GH_TOKEN }}
-      - name: Set the current release version
-        id: release_version
-        run: |
-          release_version=${GITHUB_REF:11}
-          sed -i -e "s/^projectVersion.*$/projectVersion\=${release_version}/" gradle.properties
-          echo ::set-output name=release_version::${release_version}
-      - name: Setup GraalVM CE
-        uses: graalvm/setup-graalvm@v1.0.12
+          ref: v${{ needs.build.outputs.release_version }}
+      - name: "☕️ Setup GraalVM CE"
+        uses: graalvm/setup-graalvm@v1
         with:
-          version: '21.3.3.1'
-          java-version: '11'
+          java-version: '17'
+          distribution: 'graalvm-community'
           components: 'native-image'
           github-token: ${{ secrets.GITHUB_TOKEN }}
-      - name: Build the JAR
-        uses: gradle/gradle-build-action@v2
-        with:
-          arguments: grails-cli:shadowJar --no-daemon
-      - name: Build Native Image
-        run: native-image --no-fallback --allow-incomplete-classpath -cp grails-cli/build/libs/grails-cli-*-all.jar
-      - name: Verify Build
-        run: ./grails --version
-      - name: Package Build
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "📸 Build the Native Image"
+        env:
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+        run: ./gradlew grails-cli:nativeCompile --no-daemon
+      - name: "✅ Verify Build"
+        run: ./grails-cli/build/native/nativeCompile/grails --version
+      - name: "✅ Verify Create App"
+        run: ./grails-cli/build/native/nativeCompile/grails create-app test
+      - name: "📦 Package Build"
         env:
           VERSION: ${{ github.event.release.tag_name }}
         run: |
           mkdir -p "grails-darwin-amd64-${VERSION}/bin"
-          mv ./grails "grails-darwin-amd64-${VERSION}/bin"
+          mv ./grails-cli/build/native/nativeCompile/grails "grails-darwin-amd64-${VERSION}/bin"
           cp ./LICENSE "grails-darwin-amd64-${VERSION}/"
           zip -r "grails-darwin-amd64-${VERSION}.zip" "grails-darwin-amd64-${VERSION}/" -x '*.DS_Store*' -x '__MAC_OSX'
-      - name: Upload Release Asset
+      - name: "📤 Upload Release Asset"
         id: upload-release-asset
         uses: actions/upload-release-asset@v1
         env:
@@ -325,50 +327,97 @@ jobs:
           asset_path: ./grails-darwin-amd64-${{ github.event.release.tag_name }}.zip
           asset_name: grails-darwin-amd64-${{ github.event.release.tag_name }}.zip
           asset_content_type: application/zip
+  macos-arm:
+    name: "Release OS X Arm Native CLI"
+    runs-on: macos-latest
+    needs: build
+    steps:
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
+        with:
+          ref: v${{ needs.build.outputs.release_version }}
+      - name: "☕️ Setup GraalVM CE"
+        uses: graalvm/setup-graalvm@v1
+        with:
+          java-version: '17'
+          distribution: 'graalvm-community'
+          components: 'native-image'
+          github-token: ${{ secrets.GITHUB_TOKEN }}
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "📸 Build the Native Image"
+        env:
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+        run: ./gradlew grails-cli:nativeCompile --no-daemon
+      - name: "✅ Verify Build"
+        run: ./grails-cli/build/native/nativeCompile/grails --version
+      - name: "✅ Verify Create App"
+        run: ./grails-cli/build/native/nativeCompile/grails create-app test
+      - name: "📦 Package Build"
+        env:
+          VERSION: ${{ github.event.release.tag_name }}
+        run: |
+          mkdir -p "grails-darwin-aarch64-${VERSION}/bin"
+          mv ./grails-cli/build/native/nativeCompile/grails "grails-darwin-aarch64-${VERSION}/bin"
+          cp ./LICENSE "grails-darwin-aarch64-${VERSION}/"
+          zip -r "grails-darwin-aarch64-${VERSION}.zip" "grails-darwin-aarch64-${VERSION}/" -x '*.DS_Store*' -x '__MAC_OSX'
+      - name: "📤 Upload Release Asset"
+        id: upload-release-asset
+        uses: actions/upload-release-asset@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ github.event.release.upload_url }}
+          asset_path: ./grails-darwin-aarch64-${{ github.event.release.tag_name }}.zip
+          asset_name: grails-darwin-aarch64-${{ github.event.release.tag_name }}.zip
+          asset_content_type: application/zip
   windows:
-    name: Release Windows Native CLI
+    name: "Release Windows Native CLI"
     runs-on: windows-latest
-    env:
-      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-    needs: [build]
+    needs: build
     steps:
-      - name: Checkout repository
-        uses: actions/checkout@v3
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
         with:
-          token: ${{ secrets.GH_TOKEN }}
-      - name: Setup GraalVM CE
-        uses: graalvm/setup-graalvm@v1.0.12
+          ref: v${{ needs.build.outputs.release_version }}
+      - name: "☕️ Setup GraalVM CE"
+        uses: graalvm/setup-graalvm@v1
         with:
-          version: '21.3.3.1'
-          java-version: '11'
+          java-version: '17'
+          distribution: 'graalvm-community'
           components: 'native-image'
           github-token: ${{ secrets.GITHUB_TOKEN }}
-      - name: Build JAR File
-        uses: gradle/gradle-build-action@v2
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
         with:
-          arguments: grails-cli:copyShadowJar --no-daemon
-      - name: Build Native Image
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "📸 Build the Native Image"
+        env:
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+        run: ./gradlew grails-cli:nativeCompile --no-daemon
+      - name: "✅ Verify Build (Powershell)"
         shell: powershell
-        run: native-image.cmd --no-fallback --allow-incomplete-classpath -cp build/libs/cli.jar
-      - name: Verify Build (Powershell)
-        run: ./grails.exe --version
-      - name: Verify Create App (Powershell)
-        run: ./grails.exe create-app test
-      - name: Verify Build (CMD)
+        run: ./grails-cli/build/native/nativeCompile/grails.exe --version
+      - name: "✅ Verify Create App (Powershell)"
+        shell: powershell
+        run: ./grails-cli/build/native/nativeCompile/grails.exe create-app test
+      - name: "✅ Verify Build (CMD)"
         shell: cmd
-        run: grails --version
-      - name: Verify Create App (CMD)
+        run: grails-cli\\build\\native\\nativeCompile\\grails --version
+      - name: "✅ Verify Create App (CMD)"
         shell: cmd
-        run: grails create-app test2
-      - name: ZIP Archive
+        run: grails-cli\\build\\native\\nativeCompile\\grails create-app test2
+      - name: "📦 ZIP Archive"
         run: |
           New-Item ./grails-win-amd64-${{ github.event.release.tag_name }}/bin -ItemType Directory -ea 0
-          Move-Item -Path ./grails.exe -Destination ./grails-win-amd64-${{ github.event.release.tag_name }}/bin
+          Move-Item -Path ./grails-cli/build/native/nativeCompile/grails.exe -Destination ./grails-win-amd64-${{ github.event.release.tag_name }}/bin
           Copy-Item ./LICENSE -Destination ./grails-win-amd64-${{ github.event.release.tag_name }}
           Compress-Archive -Path ./grails-win-amd64-${{ github.event.release.tag_name }} -Update -DestinationPath ./grails-win-amd64-${{ github.event.release.tag_name }}.zip
-      - name: Upload Release Asset
+      - name: "📤 Upload Release Asset"
         id: upload-release-asset
         uses: actions/upload-release-asset@v1
         env:
@@ -379,37 +428,36 @@ jobs:
           asset_name: grails-win-amd64-${{ github.event.release.tag_name }}.zip
           asset_content_type: application/zip
   sdkman:
-    name: Release to SDKMAN!
+    name: "Release to SDKMAN!"
     runs-on: ubuntu-latest
-    env:
-      DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
-      DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
-      DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
-    needs: [linux, macos, windows]
+    needs: [build, linux, macos, macos-arm, windows]
     steps:
-      - name: Checkout repository
-        uses: actions/checkout@v3
-        with:
-          token: ${{ secrets.GH_TOKEN }}
-      - name: Set the current release version
-        id: release_version
-        run: |
-          release_version=${GITHUB_REF:11}
-          sed -i "s/^projectVersion.*$/projectVersion\=${release_version}/" gradle.properties
-          echo ::set-output name=release_version::${release_version}
-      - name: Grails SDK Minor Release
-        if: contains(steps.release_version.outputs.release_version, 'M') || contains(steps.release_version.outputs.release_version, 'RC')
-        uses: gradle/gradle-build-action@v2
-        with:
-          arguments: sdkMinorRelease
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
+        with:
+          ref: v${{ needs.build.outputs.release_version }}
+      - name: "☕️ Setup JDK"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'liberica'
+          java-version: '17'
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "🚀 Grails SDK Minor Release"
+        if: contains(needs.build.outputs.release_version, 'M')
+        run: ./gradlew sdkMinorRelease
         env:
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
           GVM_SDKVENDOR_KEY: ${{ secrets.GVM_SDKVENDOR_KEY }}
           GVM_SDKVENDOR_TOKEN: ${{ secrets.GVM_SDKVENDOR_TOKEN }}
-      - name: Grails SDK Major Release
-        if: startsWith(steps.release_version.outputs.release_version, '6.0') && !contains(steps.release_version.outputs.release_version, 'M') && !contains(steps.release_version.outputs.release_version, 'RC')
-        uses: gradle/gradle-build-action@v2
-        with:
-          arguments: sdkMajorRelease
+      - name: "🚀 Grails SDK Major Release"
+        if: startsWith(needs.build.outputs.release_version, '6.') && !contains(needs.build.outputs.release_version, 'M')
+        run: ./gradlew sdkMajorRelease
         env:
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
           GVM_SDKVENDOR_KEY: ${{ secrets.GVM_SDKVENDOR_KEY }}
           GVM_SDKVENDOR_TOKEN: ${{ secrets.GVM_SDKVENDOR_TOKEN }}
diff --git a/.github/workflows/sdkman.yml b/.github/workflows/sdkman.yml
new file mode 100644
index 00000000..977ca7fe
--- /dev/null
+++ b/.github/workflows/sdkman.yml
@@ -0,0 +1,39 @@
+name: "Release to SDKMan"
+on:
+  workflow_dispatch:
+    inputs:
+      version:
+        description: 'Version to release'
+        required: true
+jobs:
+  sdkmanMinorRelease:
+    runs-on: ubuntu-latest
+    permissions:
+      contents: read
+    steps:
+      - name: "📥 Checkout repository"
+        uses: actions/checkout@v4
+        with:
+          ref: v${{ github.event.inputs.version }}
+      - name: "☕️ Setup JDK"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'liberica'
+          java-version: '17'
+      - name: "🐘 Setup Gradle"
+        uses: gradle/actions/setup-gradle@v4
+        with:
+          develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
+      - name: "🚀 Grails SDK Minor Release"
+        run: ./gradlew sdkMinorRelease
+        env:
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
+          GVM_SDKVENDOR_KEY: ${{ secrets.GVM_SDKVENDOR_KEY }}
+          GVM_SDKVENDOR_TOKEN: ${{ secrets.GVM_SDKVENDOR_TOKEN }}
+      - name: "Set output"
+        id: set_output
+        run: |
+          echo ::set-output name=release_version::$(cat $GITHUB_OUTPUT)
+        env:
+          GITHUB_OUTPUT: ${{ github.workspace }}/build/release_version
diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml
index f950568a..076c6679 100644
--- a/.github/workflows/snapshot.yml
+++ b/.github/workflows/snapshot.yml
@@ -43,6 +43,8 @@ jobs:
         id: publish
         if: success() && github.event_name == 'push' && matrix.java == '11'
         env:
+          DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
+          DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}
           SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
           SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
         run: ./gradlew publishToSonatype
@@ -70,7 +72,7 @@ jobs:
         uses: actions/setup-java@v4
         with:
           distribution: 'liberica'
-          java-version: '11'
+          java-version: '17'
       - name: "🐘 Setup Gradle"
         uses: gradle/actions/setup-gradle@v4
         with:
diff --git a/grails-cli/build.gradle b/grails-cli/build.gradle
index d767fc00..5cd7b211 100644
--- a/grails-cli/build.gradle
+++ b/grails-cli/build.gradle
@@ -12,7 +12,7 @@ sourceSets {
 }
 
 ext {
-    picocliVersion = '4.7.4'
+    picocliVersion = '4.7.5'
 }
 
 configurations.all {
@@ -33,11 +33,11 @@ dependencies {
     api "info.picocli:picocli:${picocliVersion}"
     api "info.picocli:picocli-shell-jline3:${picocliVersion}"
     api "com.fizzed:rocker-runtime:$rockerVersion"
-    implementation "org.slf4j:slf4j-nop:2.0.7"
-    implementation "org.fusesource.jansi:jansi:2.4.0"
-    implementation "org.yaml:snakeyaml:2.0"
+    implementation "org.slf4j:slf4j-nop:2.0.16"
+    implementation "org.fusesource.jansi:jansi:2.4.1"
+    implementation "org.yaml:snakeyaml:2.2"
     implementation group: 'javax.inject', name: 'javax.inject', version: '1'
-    implementation 'org.shredzone.acme4j:acme4j-client:2.16'
+    implementation 'org.shredzone.acme4j:acme4j-client:3.2.1'
     implementation 'org.shredzone.acme4j:acme4j-utils:2.16'
     generateConfig "info.picocli:picocli-codegen:${picocliVersion}"
     compileOnly "com.google.code.findbugs:jsr305"
@@ -56,11 +56,11 @@ graalvmNative {
             sharedLibrary = false
             imageName = "grails"
             buildArgs(
-                    "--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.configure=ALL-UNNAMED",
-                    "--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk=ALL-UNNAMED",
-                    "--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.jni=ALL-UNNAMED",
-                    "--add-exports=org.graalvm.sdk/org.graalvm.nativeimage.impl=ALL-UNNAMED",
-                    "-H:+ReportExceptionStackTraces"
+                "--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.configure=ALL-UNNAMED",
+                "--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk=ALL-UNNAMED",
+                "--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.jni=ALL-UNNAMED",
+                "--add-exports=org.graalvm.sdk/org.graalvm.nativeimage.impl=ALL-UNNAMED",
+                "-H:+ReportExceptionStackTraces"
             )
             if (project.hasProperty("musl")) {
                 logger.lifecycle("Using musl libc")
diff --git a/grails-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java b/grails-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java
index 616326f1..c0307a62 100644
--- a/grails-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java
+++ b/grails-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java
@@ -25,10 +25,10 @@
 import org.grails.forge.feature.Feature;
 import org.grails.forge.io.ConsoleOutput;
 import org.grails.forge.io.FileSystemOutputHandler;
+import org.grails.forge.options.JdkVersion;
 import org.grails.forge.options.Language;
 import org.grails.forge.options.Options;
 import org.grails.forge.options.TestFramework;
-import org.grails.forge.util.VersionInfo;
 import org.yaml.snakeyaml.Yaml;
 
 import java.io.File;
@@ -149,7 +149,7 @@ public static CodeGenConfig load(BeanContext beanContext, File directory, Consol
                             .map(DefaultFeature.class::cast)
                             .filter(f -> f.shouldApply(
                                     codeGenConfig.getApplicationType(),
-                                    new Options(codeGenConfig.getTestFramework(), VersionInfo.getJavaVersion()),
+                                    new Options(codeGenConfig.getTestFramework(), JdkVersion.DEFAULT_OPTION),
                                     new HashSet<>()))
                             .map(Feature::getName)
                             .collect(Collectors.toList()));
diff --git a/grails-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java b/grails-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java
index f8d552e8..107678ba 100644
--- a/grails-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java
+++ b/grails-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java
@@ -27,7 +27,6 @@
 import org.grails.forge.io.OutputHandler;
 import org.grails.forge.options.*;
 import org.grails.forge.util.NameUtils;
-import org.grails.forge.util.VersionInfo;
 import picocli.CommandLine;
 
 import java.util.Collections;
@@ -127,7 +126,7 @@ public void generate(Project project, OutputHandler outputHandler) throws Except
 
     private JdkVersion getJdkVersion() {
         if (javaVersion == null) {
-            return VersionInfo.getJavaVersion();
+            return JdkVersion.DEFAULT_OPTION;
         } else {
             return JdkVersion.valueOf(javaVersion);
         }
diff --git a/grails-cli/src/main/java/org/grails/forge/cli/util/GrailsVersionProvider.java b/grails-cli/src/main/java/org/grails/forge/cli/util/GrailsVersionProvider.java
index d1f3e3af..c3b91882 100644
--- a/grails-cli/src/main/java/org/grails/forge/cli/util/GrailsVersionProvider.java
+++ b/grails-cli/src/main/java/org/grails/forge/cli/util/GrailsVersionProvider.java
@@ -19,6 +19,8 @@
 import org.grails.forge.util.VersionInfo;
 import picocli.CommandLine.IVersionProvider;
 
+import java.util.Objects;
+
 /**
  * Generates version information. Example usage:
  * 
@@ -44,7 +46,8 @@ public class GrailsVersionProvider implements IVersionProvider {
 
     public String[] getVersion() {
         return new String[] {
-                "Grails Version: " + VersionInfo.getGrailsVersion()
+                "Grails Version: " + VersionInfo.getGrailsVersion(),
+                "JVM Version: " + Objects.requireNonNullElse(System.getProperty("java.version"), "")
         };
     }
 }
diff --git a/grails-cli/src/test/groovy/org/grails/forge/cli/command/ApplicationCommandSpec.groovy b/grails-cli/src/test/groovy/org/grails/forge/cli/command/ApplicationCommandSpec.groovy
new file mode 100644
index 00000000..31c9c245
--- /dev/null
+++ b/grails-cli/src/test/groovy/org/grails/forge/cli/command/ApplicationCommandSpec.groovy
@@ -0,0 +1,41 @@
+package org.grails.forge.cli.command
+
+import io.micronaut.configuration.picocli.PicocliRunner
+import io.micronaut.context.ApplicationContext
+import io.micronaut.context.env.Environment
+import org.grails.forge.cli.Application
+import org.grails.forge.cli.CommandFixture
+import org.grails.forge.cli.CommandSpec
+import org.grails.forge.util.VersionInfo
+import spock.lang.AutoCleanup
+import spock.lang.Shared
+
+class ApplicationCommandSpec extends CommandSpec implements CommandFixture {
+
+    @Shared
+    @AutoCleanup
+    ApplicationContext ctx = ApplicationContext.run(Environment.CLI)
+
+    @Shared
+    @AutoCleanup
+    ApplicationContext beanContext = ApplicationContext.run()
+
+    void "print version info via: grails #args"() {
+        given:
+        ByteArrayOutputStream out = new ByteArrayOutputStream()
+        System.setOut(new PrintStream(out))
+
+        when:
+        PicocliRunner.run(Application, ctx, args)
+
+        then:
+        noExceptionThrown()
+        out.toString().contains("Grails Version: " + VersionInfo.getGrailsVersion())
+        out.toString().contains("JVM Version: " + Objects.requireNonNullElse(System.getProperty("java.version"), "" ))
+
+        where:
+        args        | _
+        "--version" | _
+        "-V"        | _
+    }
+}
diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/templates/javaSetup.rocker.raw b/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/templates/javaSetup.rocker.raw
index a81b1ac1..0c3cd7b6 100644
--- a/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/templates/javaSetup.rocker.raw
+++ b/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/templates/javaSetup.rocker.raw
@@ -5,9 +5,9 @@
 JdkVersion jdkVersion
 )
 
-      - uses: actions/checkout@@v2
+      - uses: actions/checkout@@v4
       - name: Set up JDK @jdkVersion.majorVersion()
-        uses: actions/setup-java@@v2
+        uses: actions/setup-java@@v4
         with:
-          distribution: 'adopt'
+          distribution: 'liberica'
           java-version: @jdkVersion.majorVersion()
diff --git a/grails-forge-core/src/main/java/org/grails/forge/options/Options.java b/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
index d965d80a..6043ed0f 100644
--- a/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
+++ b/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
@@ -81,11 +81,11 @@ public Options(TestFramework testFramework,
     }
 
     public Options(TestFramework testFramework) {
-        this(testFramework, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, VersionInfo.getJavaVersion(), OperatingSystem.DEFAULT, Collections.emptyMap());
+        this(testFramework, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, JdkVersion.DEFAULT_OPTION, OperatingSystem.DEFAULT, Collections.emptyMap());
     }
 
     public Options() {
-        this(TestFramework.DEFAULT_OPTION, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, VersionInfo.getJavaVersion(), OperatingSystem.DEFAULT, Collections.emptyMap());
+        this(TestFramework.DEFAULT_OPTION, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, JdkVersion.DEFAULT_OPTION, OperatingSystem.DEFAULT, Collections.emptyMap());
     }
 
     public OperatingSystem getOperatingSystem() {

From 694537f724cbc0407d19666af1cb614205796026 Mon Sep 17 00:00:00 2001
From: Mattias Reichel 
Date: Tue, 26 Nov 2024 16:44:21 +0100
Subject: [PATCH 34/37] chore: fix checkstyle errors

---
 .../main/java/org/grails/forge/feature/FeatureContext.java  | 6 ++++--
 .../src/main/java/org/grails/forge/options/Options.java     | 3 +--
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/grails-forge-core/src/main/java/org/grails/forge/feature/FeatureContext.java b/grails-forge-core/src/main/java/org/grails/forge/feature/FeatureContext.java
index 9fed50c5..ea47212e 100644
--- a/grails-forge-core/src/main/java/org/grails/forge/feature/FeatureContext.java
+++ b/grails-forge-core/src/main/java/org/grails/forge/feature/FeatureContext.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-2020 original authors
+ * Copyright 2017-2024 original authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -77,7 +77,9 @@ public Set getFinalFeatures(ConsoleOutput consoleOutput) {
         return features.stream().filter(feature -> {
             for (FeaturePredicate predicate: exclusions) {
                 if (predicate.test(feature)) {
-                    predicate.getWarning().ifPresent(message -> { throw new IllegalArgumentException(message); });
+                    predicate.getWarning().ifPresent(message -> {
+                        throw new IllegalArgumentException(message);
+                    });
                     return false;
                 }
             }
diff --git a/grails-forge-core/src/main/java/org/grails/forge/options/Options.java b/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
index 6043ed0f..b5b82e87 100644
--- a/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
+++ b/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-2020 original authors
+ * Copyright 2017-2024 original authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,7 +19,6 @@
 import io.micronaut.core.convert.value.ConvertibleValues;
 import io.micronaut.core.convert.value.ConvertibleValuesMap;
 import org.grails.forge.application.OperatingSystem;
-import org.grails.forge.util.VersionInfo;
 
 import java.util.*;
 

From 6853087a0f28fc96f8beb85cd6880e1e7c048e4b Mon Sep 17 00:00:00 2001
From: Mattias Reichel 
Date: Mon, 2 Dec 2024 10:10:13 +0100
Subject: [PATCH 35/37] test: fix versions check test errors

---
 .../org/grails/forge/build/gradle/GradleSpec.groovy       | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy b/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy
index 34c5190b..57c59a16 100644
--- a/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy
+++ b/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy
@@ -60,7 +60,7 @@ class GradleSpec extends ApplicationContextSpec implements CommandOutputFixture
         settingsGradle.contains("maven { url \"https://repo.grails.org/grails/core/\" }")
         settingsGradle.contains("gradlePluginPortal()")
         settingsGradle.contains("id \"org.grails.grails-web\" version \"6.1.2\"")
-        settingsGradle.contains("id \"org.grails.plugins.views-json\" version \"3.1.1\"")
+        settingsGradle.contains("id \"org.grails.plugins.views-json\" version \"3.1.2\"")
         !settingsGradle.contains("id \"org.grails.grails-gsp\" version \"6.1.2\"")
         !settingsGradle.contains("id \"com.bertramlabs.asset-pipeline\" version \"4.3.0\"")
     }
@@ -77,9 +77,9 @@ class GradleSpec extends ApplicationContextSpec implements CommandOutputFixture
         settingsGradle.contains("maven { url \"https://repo.grails.org/grails/core/\" }")
         settingsGradle.contains("gradlePluginPortal()")
         settingsGradle.contains("id \"org.grails.grails-web\" version \"6.1.2\"")
-        settingsGradle.contains("id \"org.grails.plugins.views-markup\" version \"3.1.1\"")
-        !settingsGradle.contains("id \"org.grails.plugins.views-json\" version \"3.1.1\"")
-        !settingsGradle.contains("id \"org.grails.grails-gsp\" version \"6.1.1\"")
+        settingsGradle.contains("id \"org.grails.plugins.views-markup\" version \"3.1.2\"")
+        !settingsGradle.contains("id \"org.grails.plugins.views-json\" version \"3.1.2\"")
+        !settingsGradle.contains("id \"org.grails.grails-gsp\" version \"6.1.2\"")
         !settingsGradle.contains("id \"com.bertramlabs.asset-pipeline\" version \"4.3.0\"")
     }
 }

From f12aa79bd99d3103053c10faa9831a15176631a9 Mon Sep 17 00:00:00 2001
From: Mattias Reichel 
Date: Thu, 5 Dec 2024 22:29:36 +0100
Subject: [PATCH 36/37] ci: Fix mistake in snapshot.yml

---
 .github/workflows/snapshot.yml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml
index 553b82cb..25fe7b6d 100644
--- a/.github/workflows/snapshot.yml
+++ b/.github/workflows/snapshot.yml
@@ -28,7 +28,6 @@ jobs:
           develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
       - name: "🔨 Run Build"
         id: build
-        uses: gradle/gradle-build-action@v2
         env:
           DEVELOCITY_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }}
           DEVELOCITY_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }}

From a68785dd0f304f688603631784a275d926b960be Mon Sep 17 00:00:00 2001
From: James Fredley 
Date: Mon, 9 Dec 2024 12:58:35 -0500
Subject: [PATCH 37/37] run clean before build to work around buildSrc tests
 which fail

---
 build.gradle | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/build.gradle b/build.gradle
index d17ca703..1cca520a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -27,4 +27,9 @@ if (!ossUser.isEmpty() && !ossPass.isEmpty()) {
             }
         }
     }
+}
+
+// buildSrc tests fail occasionally without running clean first
+build {
+    dependsOn clean
 }
\ No newline at end of file