From 0186fb2e84098ead17dafd84221a238a608c7b80 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 6 Apr 2017 09:10:07 +0100 Subject: [PATCH] Fail fast when plugin is used with an unsupported version of Gradle Closes gh-8820 --- .../boot/gradle/plugin/SpringBootPlugin.java | 27 ++++++++++ .../SpringBootPluginIntegrationTests.java | 54 +++++++++++++++++++ .../boot/gradle/testkit/GradleBuild.java | 10 ++++ .../SpringBootPluginIntegrationTests.gradle | 7 +++ 4 files changed, 98 insertions(+) create mode 100644 spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginIntegrationTests.java create mode 100644 spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootPluginIntegrationTests.gradle diff --git a/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootPlugin.java b/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootPlugin.java index 29117ea63e..9696af6de2 100644 --- a/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootPlugin.java +++ b/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootPlugin.java @@ -19,10 +19,12 @@ package org.springframework.boot.gradle.plugin; import java.util.Arrays; import java.util.List; +import org.gradle.api.GradleException; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.component.SoftwareComponent; +import org.gradle.util.GradleVersion; import org.springframework.boot.gradle.dsl.SpringBootExtension; import org.springframework.boot.gradle.tasks.bundling.BootJar; @@ -74,9 +76,31 @@ public class SpringBootPlugin implements Plugin { @Override public void apply(Project project) { + verifyGradleVersion(); + createExtension(project); + Configuration bootArchives = createBootArchivesConfiguration(project); + registerPluginActions(project, bootArchives); + unregisterUnresolvedDependenciesAnalyzer(project); + } + + private void verifyGradleVersion() { + if (GradleVersion.current().compareTo(GradleVersion.version("3.4")) < 0) { + throw new GradleException("Spring Boot plugin requires Gradle 3.4 or later." + + " The current version is " + GradleVersion.current()); + } + } + + private void createExtension(Project project) { project.getExtensions().create("springBoot", SpringBootExtension.class, project); + } + + private Configuration createBootArchivesConfiguration(Project project) { Configuration bootArchives = project.getConfigurations() .create(BOOT_ARCHIVES_CONFIGURATION_NAME); + return bootArchives; + } + + private void registerPluginActions(Project project, Configuration bootArchives) { SinglePublishedArtifact singlePublishedArtifact = new SinglePublishedArtifact( bootArchives.getArtifacts()); List actions = Arrays.asList( @@ -88,6 +112,9 @@ public class SpringBootPlugin implements Plugin { project.getPlugins().withType(action.getPluginClass(), plugin -> action.execute(project)); } + } + + private void unregisterUnresolvedDependenciesAnalyzer(Project project) { UnresolvedDependenciesAnalyzer unresolvedDependenciesAnalyzer = new UnresolvedDependenciesAnalyzer(); project.getConfigurations().all(configuration -> configuration.getIncoming() .afterResolve(resolvableDependencies -> unresolvedDependenciesAnalyzer diff --git a/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginIntegrationTests.java b/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginIntegrationTests.java new file mode 100644 index 0000000000..57e673c15d --- /dev/null +++ b/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginIntegrationTests.java @@ -0,0 +1,54 @@ +/* + * Copyright 2012-2017 the original author or 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 + * + * http://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.springframework.boot.gradle.plugin; + +import org.gradle.testkit.runner.BuildResult; +import org.junit.Rule; +import org.junit.Test; + +import org.springframework.boot.gradle.testkit.GradleBuild; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for {@link SpringBootPlugin}. + * + * @author Andy Wilkinson + */ +public class SpringBootPluginIntegrationTests { + + @Rule + public final GradleBuild gradleBuild = new GradleBuild(); + + @Test + public void failFastWithVersionOfGradleLowerThanRequired() { + BuildResult result = this.gradleBuild.gradleVersion("3.3").buildAndFail(); + assertThat(result.getOutput()).contains("Spring Boot plugin requires Gradle 3.4" + + " or later. The current version is Gradle 3.3"); + } + + @Test + public void succeedWithVersionOfGradleHigherThanRequired() { + this.gradleBuild.gradleVersion("3.5-rc-3").build(); + } + + @Test + public void succeedWithVersionOfGradleMatchingWhatIsRequired() { + this.gradleBuild.gradleVersion("3.4").build(); + } + +} diff --git a/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/testkit/GradleBuild.java b/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/testkit/GradleBuild.java index 6dfde693bc..dad62321a4 100644 --- a/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/testkit/GradleBuild.java +++ b/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/testkit/GradleBuild.java @@ -55,6 +55,8 @@ public class GradleBuild implements TestRule { private String script; + private String gradleVersion; + @Override public Statement apply(Statement base, Description description) { URL scriptUrl = findDefaultScript(description); @@ -149,6 +151,9 @@ public class GradleBuild implements TestRule { new FileWriter(new File(this.projectDir, "build.gradle"))); GradleRunner gradleRunner = GradleRunner.create().withProjectDir(this.projectDir) .forwardOutput(); + if (this.gradleVersion != null) { + gradleRunner.withGradleVersion(this.gradleVersion); + } List allArguments = new ArrayList(); allArguments.add("-PpluginClasspath=" + pluginClasspath()); allArguments.add("-PbootVersion=" + getBootVersion()); @@ -164,6 +169,11 @@ public class GradleBuild implements TestRule { this.projectDir = projectDir; } + public GradleBuild gradleVersion(String version) { + this.gradleVersion = version; + return this; + } + private static String getBootVersion() { return evaluateExpression( "/*[local-name()='project']/*[local-name()='parent']/*[local-name()='version']" diff --git a/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootPluginIntegrationTests.gradle b/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootPluginIntegrationTests.gradle new file mode 100644 index 0000000000..429f102ebc --- /dev/null +++ b/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootPluginIntegrationTests.gradle @@ -0,0 +1,7 @@ +buildscript { + dependencies { + classpath files(pluginClasspath.split(',')) + } +} + +apply plugin: 'org.springframework.boot'