diff --git a/build.gradle b/build.gradle index 2d2f870fb80..5838bd2f1bd 100644 --- a/build.gradle +++ b/build.gradle @@ -9,9 +9,14 @@ defaultTasks 'build' allprojects { group "org.springframework.boot" +} + +subprojects { + apply plugin: "org.springframework.boot.conventions" repositories { mavenCentral() + spring.mavenRepositories() if (version.contains('-')) { maven { url "https://repo.spring.io/milestone" } } @@ -25,6 +30,3 @@ allprojects { } } -subprojects { - apply plugin: "org.springframework.boot.conventions" -} diff --git a/buildSrc/SpringRepositorySupport.groovy b/buildSrc/SpringRepositorySupport.groovy new file mode 100644 index 00000000000..e17d4badbdf --- /dev/null +++ b/buildSrc/SpringRepositorySupport.groovy @@ -0,0 +1,134 @@ +/* + * Copyright 2012-2024 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 + * + * 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. + */ + +// +// This script can be used in the `pluginManagement` block of a `settings.gradle` file to provide +// support for spring maven repositories. +// +// To use the script add the following as the first line in the `pluginManagement` block: +// +// evaluate(new File("${rootDir}/buildSrc/SpringRepositorySupport.groovy")).apply(this) +// +// You can then use `spring.mavenRepositories()` to add the Spring repositories required for the +// version being built. +// + +def apply(settings) { + def version = property(settings, 'version') + def buildType = property(settings, 'spring.build-type') + SpringRepositoriesExtension.addTo(settings.pluginManagement.repositories, version, buildType) + settings.gradle.allprojects { + SpringRepositoriesExtension.addTo(repositories, version, buildType) + } +} + +private def property(settings, name) { + def parentValue = settings.gradle.parent?.rootProject?.findProperty(name) + return (parentValue != null) ? parentValue : settings.ext[name] +} + +return this + +class SpringRepositoriesExtension { + + private final def repositories + private final def version + private final def buildType + private final def environment + + @javax.inject.Inject + SpringRepositoriesExtension(repositories, version, buildType) { + this(repositories, version, buildType, System::getenv) + } + + SpringRepositoriesExtension(repositories, version, buildType, environment) { + this.repositories = repositories + this.version = version + this.buildType = buildType + this.environment = environment + } + + def mavenRepositories() { + addRepositories { } + } + + def mavenRepositories(condition) { + if (condition) addRepositories { } + } + + def mavenRepositoriesExcludingBootGroup() { + addRepositories { maven -> + maven.content { content -> + content.excludeGroup("org.springframework.boot") + } + } + } + + private void addRepositories(action) { + addCommercialRepository("release", "/spring-enterprise-maven-prod-local", action) + if (this.version.contains("-")) { + addOssRepository("milestone", "/milestone", action) + } + if (this.version.endsWith("-SNAPSHOT")) { + addCommercialRepository("snapshot", "/spring-enterprise-maven-dev-local", action) + addOssRepository("snapshot", "/snapshot", action) + } + } + + private void addOssRepository(id, path, action) { + def name = "spring-oss-" + id + def url = "https://repo.spring.io" + path + addRepository(name, url, action) + } + + private void addCommercialRepository(id, path, action) { + if (!"commercial".equalsIgnoreCase(this.buildType)) return + def name = "spring-commercial-" + id + def url = fromEnv("COMMERCIAL_%SREPO_URL", id, "https://usw1.packages.broadcom.com" + path) + def username = fromEnv("COMMERCIAL_%SREPO_USERNAME", id) + def password = fromEnv("COMMERCIAL_%SREPO_PASSWORD", id) + addRepository(name, url, { maven -> + maven.credentials { credentials -> + credentials.setUsername(username) + credentials.setPassword(password) + } + action(maven) + }) + } + + private void addRepository(name, url, action) { + this.repositories.maven { maven -> + maven.setName(name) + maven.setUrl(url) + action(maven) + } + } + + private String fromEnv(template, id) { + return fromEnv(template, id, null) + } + + private String fromEnv(template, id, defaultValue) { + String value = this.environment.apply(template.formatted(id.toUpperCase() + "_")) + value = (value != null) ? value : this.environment.apply(template.formatted("")) + return (value != null) ? value : defaultValue + } + + static def addTo(repositories, version, buildType) { + repositories.extensions.create("spring", SpringRepositoriesExtension.class, repositories, version, buildType) + } + +} \ No newline at end of file diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index d1238e99e7d..a8683f63a31 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -15,12 +15,8 @@ java { targetCompatibility = 17 } - -if ("${springFrameworkVersion}".contains("-")) { - repositories { - maven { url "https://repo.spring.io/milestone" } - maven { url "https://repo.spring.io/snapshot" } - } +repositories { + spring.mavenRepositories("${springFrameworkVersion}".contains("-")) } checkstyle { @@ -51,6 +47,7 @@ dependencies { testImplementation("org.assertj:assertj-core:${assertjVersion}") testImplementation("org.hamcrest:hamcrest:${hamcrestVersion}") testImplementation("org.junit.jupiter:junit-jupiter:${junitJupiterVersion}") + testImplementation("org.mockito:mockito-core:${mockitoVersion}") testImplementation("org.springframework:spring-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") diff --git a/buildSrc/settings.gradle b/buildSrc/settings.gradle index a61376cc7dd..c0862a7b462 100644 --- a/buildSrc/settings.gradle +++ b/buildSrc/settings.gradle @@ -1,14 +1,15 @@ pluginManagement { + new File(rootDir.parentFile, "gradle.properties").withInputStream { + def properties = new Properties() + properties.load(it) + properties.forEach(settings.ext::set) + gradle.rootProject { + properties.forEach(project.ext::set) + } + } + evaluate(new File("${rootDir}/SpringRepositorySupport.groovy")).apply(this) repositories { mavenCentral() gradlePluginPortal() } } - -gradle.rootProject((project) -> { - new File(rootDir.parentFile, "gradle.properties").withInputStream { - def properties = new Properties() - properties.load(it) - properties.forEach(project.ext::set) - } -}); diff --git a/buildSrc/src/test/java/org/springframework/boot/build/groovyscripts/SpringRepositoriesExtensionTests.java b/buildSrc/src/test/java/org/springframework/boot/build/groovyscripts/SpringRepositoriesExtensionTests.java new file mode 100644 index 00000000000..246f93d46ed --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/groovyscripts/SpringRepositoriesExtensionTests.java @@ -0,0 +1,273 @@ +/* + * Copyright 2024 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 + * + * 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.springframework.boot.build.groovyscripts; + +import java.io.File; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.UnaryOperator; + +import groovy.lang.Closure; +import groovy.lang.GroovyClassLoader; +import org.gradle.api.Action; +import org.gradle.api.artifacts.dsl.RepositoryHandler; +import org.gradle.api.artifacts.repositories.MavenArtifactRepository; +import org.gradle.api.artifacts.repositories.PasswordCredentials; +import org.gradle.api.artifacts.repositories.RepositoryContentDescriptor; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.mockito.invocation.InvocationOnMock; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +/** + * Tests for {@code SpringRepositorySupport.groovy}. + * + * @author Phillip Webb + */ +class SpringRepositoriesExtensionTests { + + private static GroovyClassLoader groovyClassLoader; + + private static Class supportClass; + + @BeforeAll + static void loadGroovyClass() throws Exception { + groovyClassLoader = new GroovyClassLoader(SpringRepositoriesExtensionTests.class.getClassLoader()); + supportClass = groovyClassLoader.parseClass(new File("SpringRepositorySupport.groovy")); + } + + @AfterAll + static void cleanup() throws Exception { + groovyClassLoader.close(); + } + + private final List repositories = new ArrayList<>(); + + private final List contents = new ArrayList<>(); + + private final List credentials = new ArrayList<>(); + + @Test + void mavenRepositoriesWhenNotCommercialSnapshot() { + SpringRepositoriesExtension extension = createExtension("0.0.0-SNAPSHOT", "oss"); + extension.mavenRepositories(); + assertThat(this.repositories).hasSize(2); + verify(this.repositories.get(0)).setName("spring-oss-milestone"); + verify(this.repositories.get(0)).setUrl("https://repo.spring.io/milestone"); + verify(this.repositories.get(1)).setName("spring-oss-snapshot"); + verify(this.repositories.get(1)).setUrl("https://repo.spring.io/snapshot"); + } + + @Test + void mavenRepositoriesWhenCommercialSnapshot() { + SpringRepositoriesExtension extension = createExtension("0.0.0-SNAPSHOT", "commercial"); + extension.mavenRepositories(); + assertThat(this.repositories).hasSize(4); + verify(this.repositories.get(0)).setName("spring-commercial-release"); + verify(this.repositories.get(0)) + .setUrl("https://usw1.packages.broadcom.com/spring-enterprise-maven-prod-local"); + verify(this.repositories.get(1)).setName("spring-oss-milestone"); + verify(this.repositories.get(1)).setUrl("https://repo.spring.io/milestone"); + verify(this.repositories.get(2)).setName("spring-commercial-snapshot"); + verify(this.repositories.get(2)).setUrl("https://usw1.packages.broadcom.com/spring-enterprise-maven-dev-local"); + verify(this.repositories.get(3)).setName("spring-oss-snapshot"); + verify(this.repositories.get(3)).setUrl("https://repo.spring.io/snapshot"); + } + + @Test + void mavenRepositoriesWhenNotCommercialMilestone() { + SpringRepositoriesExtension extension = createExtension("0.0.0-M1", "oss"); + extension.mavenRepositories(); + assertThat(this.repositories).hasSize(1); + verify(this.repositories.get(0)).setName("spring-oss-milestone"); + verify(this.repositories.get(0)).setUrl("https://repo.spring.io/milestone"); + } + + @Test + void mavenRepositoriesWhenCommercialMilestone() { + SpringRepositoriesExtension extension = createExtension("0.0.0-M1", "commercial"); + extension.mavenRepositories(); + assertThat(this.repositories).hasSize(2); + verify(this.repositories.get(0)).setName("spring-commercial-release"); + verify(this.repositories.get(0)) + .setUrl("https://usw1.packages.broadcom.com/spring-enterprise-maven-prod-local"); + verify(this.repositories.get(1)).setName("spring-oss-milestone"); + verify(this.repositories.get(1)).setUrl("https://repo.spring.io/milestone"); + } + + @Test + void mavenRepositoriesWhenNotCommercialRelease() { + SpringRepositoriesExtension extension = createExtension("0.0.1", "oss"); + extension.mavenRepositories(); + assertThat(this.repositories).isEmpty(); + } + + @Test + void mavenRepositoriesWhenCommercialRelease() { + SpringRepositoriesExtension extension = createExtension("0.0.1", "commercial"); + extension.mavenRepositories(); + assertThat(this.repositories).hasSize(1); + verify(this.repositories.get(0)).setName("spring-commercial-release"); + verify(this.repositories.get(0)) + .setUrl("https://usw1.packages.broadcom.com/spring-enterprise-maven-prod-local"); + } + + @Test + void mavenRepositoriesWhenConditionMatches() { + SpringRepositoriesExtension extension = createExtension("0.0.0-SNAPSHOT", "oss"); + extension.mavenRepositories(true); + assertThat(this.repositories).hasSize(2); + } + + @Test + void mavenRepositoriesWhenConditionDoesNotMatch() { + SpringRepositoriesExtension extension = createExtension("0.0.0-SNAPSHOT", "oss"); + extension.mavenRepositories(false); + assertThat(this.repositories).isEmpty(); + } + + @Test + void mavenRepositoriesExcludingBootGroup() { + SpringRepositoriesExtension extension = createExtension("0.0.0-SNAPSHOT", "oss"); + extension.mavenRepositoriesExcludingBootGroup(); + assertThat(this.contents).hasSize(2); + verify(this.contents.get(0)).excludeGroup("org.springframework.boot"); + verify(this.contents.get(1)).excludeGroup("org.springframework.boot"); + } + + @Test + void mavenRepositoriesWithRepositorySpecificEnvironmentVariables() { + Map environment = new HashMap<>(); + environment.put("COMMERCIAL_RELEASE_REPO_URL", "curl"); + environment.put("COMMERCIAL_RELEASE_REPO_USERNAME", "cuser"); + environment.put("COMMERCIAL_RELEASE_REPO_PASSWORD", "cpass"); + environment.put("COMMERCIAL_SNAPSHOT_REPO_URL", "surl"); + environment.put("COMMERCIAL_SNAPSHOT_REPO_USERNAME", "suser"); + environment.put("COMMERCIAL_SNAPSHOT_REPO_PASSWORD", "spass"); + SpringRepositoriesExtension extension = createExtension("0.0.0-SNAPSHOT", "commercial", environment::get); + extension.mavenRepositories(); + assertThat(this.repositories).hasSize(4); + verify(this.repositories.get(0)).setUrl("curl"); + verify(this.repositories.get(2)).setUrl("surl"); + assertThat(this.credentials).hasSize(2); + verify(this.credentials.get(0)).setUsername("cuser"); + verify(this.credentials.get(0)).setPassword("cpass"); + verify(this.credentials.get(1)).setUsername("suser"); + verify(this.credentials.get(1)).setPassword("spass"); + } + + @Test + void mavenRepositoriesWhenRepositoryEnvironmentVariables() { + Map environment = new HashMap<>(); + environment.put("COMMERCIAL_REPO_URL", "url"); + environment.put("COMMERCIAL_REPO_USERNAME", "user"); + environment.put("COMMERCIAL_REPO_PASSWORD", "pass"); + SpringRepositoriesExtension extension = createExtension("0.0.0-SNAPSHOT", "commercial", environment::get); + extension.mavenRepositories(); + assertThat(this.repositories).hasSize(4); + verify(this.repositories.get(0)).setUrl("url"); + verify(this.repositories.get(2)).setUrl("url"); + assertThat(this.credentials).hasSize(2); + verify(this.credentials.get(0)).setUsername("user"); + verify(this.credentials.get(0)).setPassword("pass"); + verify(this.credentials.get(1)).setUsername("user"); + verify(this.credentials.get(1)).setPassword("pass"); + } + + private SpringRepositoriesExtension createExtension(String version, String buildType) { + return createExtension(version, buildType, (name) -> null); + } + + @SuppressWarnings({ "unchecked", "unchecked" }) + private SpringRepositoriesExtension createExtension(String version, String buildType, + UnaryOperator environment) { + RepositoryHandler repositoryHandler = mock(RepositoryHandler.class); + given(repositoryHandler.maven(any(Closure.class))).willAnswer(this::mavenClosure); + return SpringRepositoriesExtension.get(repositoryHandler, version, buildType, environment); + } + + @SuppressWarnings({ "unchecked", "unchecked" }) + private Object mavenClosure(InvocationOnMock invocation) { + MavenArtifactRepository repository = mock(MavenArtifactRepository.class); + willAnswer(this::contentAction).given(repository).content(any(Action.class)); + willAnswer(this::credentialsAction).given(repository).credentials(any(Action.class)); + Closure closure = invocation.getArgument(0); + closure.call(repository); + this.repositories.add(repository); + return null; + } + + private Object contentAction(InvocationOnMock invocation) { + RepositoryContentDescriptor content = mock(RepositoryContentDescriptor.class); + Action action = invocation.getArgument(0); + action.execute(content); + this.contents.add(content); + return null; + } + + private Object credentialsAction(InvocationOnMock invocation) { + PasswordCredentials credentials = mock(PasswordCredentials.class); + Action action = invocation.getArgument(0); + action.execute(credentials); + this.credentials.add(credentials); + return null; + } + + interface SpringRepositoriesExtension { + + void mavenRepositories(); + + void mavenRepositories(boolean condition); + + void mavenRepositoriesExcludingBootGroup(); + + static SpringRepositoriesExtension get(RepositoryHandler repositoryHandler, String version, String buildType, + UnaryOperator environment) { + try { + Class extensionClass = supportClass.getClassLoader().loadClass("SpringRepositoriesExtension"); + Object extension = extensionClass + .getDeclaredConstructor(Object.class, Object.class, Object.class, Object.class) + .newInstance(repositoryHandler, version, buildType, environment); + return (SpringRepositoriesExtension) Proxy.newProxyInstance( + SpringRepositoriesExtensionTests.class.getClassLoader(), + new Class[] { SpringRepositoriesExtension.class }, (instance, method, args) -> { + Class[] params = new Class[(args != null) ? args.length : 0]; + Arrays.fill(params, Object.class); + Method groovyMethod = extension.getClass().getDeclaredMethod(method.getName(), params); + return groovyMethod.invoke(extension, args); + }); + } + catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + } + +} diff --git a/gradle.properties b/gradle.properties index 4bb39ef5c38..d2be83f08af 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,6 +15,7 @@ javaFormatVersion=0.0.43 junitJupiterVersion=5.10.3 kotlinVersion=1.9.25 mavenVersion=3.9.4 +mockitoVersion=5.7.0 nativeBuildToolsVersion=0.9.28 springFrameworkVersion=6.1.13 springFramework60xVersion=6.0.23 diff --git a/settings.gradle b/settings.gradle index 369b1d18e21..54f4eca71d9 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,10 +1,9 @@ pluginManagement { + evaluate(new File("${rootDir}/buildSrc/SpringRepositorySupport.groovy")).apply(this) repositories { mavenCentral() gradlePluginPortal() - if (version.endsWith('-SNAPSHOT')) { - maven { url "https://repo.spring.io/snapshot" } - } + spring.mavenRepositories(); } resolutionStrategy { eachPlugin { diff --git a/spring-boot-project/spring-boot-dependencies/build.gradle b/spring-boot-project/spring-boot-dependencies/build.gradle index e3035554f46..7271a9868c5 100644 --- a/spring-boot-project/spring-boot-dependencies/build.gradle +++ b/spring-boot-project/spring-boot-dependencies/build.gradle @@ -1024,7 +1024,7 @@ bom { ] } } - library("Mockito", "5.7.0") { + library("Mockito", "${mockitoVersion}") { group("org.mockito") { imports = [ "mockito-bom" diff --git a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-bootDistZipJarApp.gradle b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-bootDistZipJarApp.gradle index 97b32d1ffa7..78d1fa0e5b1 100644 --- a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-bootDistZipJarApp.gradle +++ b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-bootDistZipJarApp.gradle @@ -15,8 +15,7 @@ repositories { } } mavenCentral() - maven { url 'https://repo.spring.io/milestone' } - maven { url 'https://repo.spring.io/snapshot' } + spring.mavenRepositories() } dependencies { diff --git a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-executableWarApp.gradle b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-executableWarApp.gradle index 291f22d1a02..70c2fb829bf 100644 --- a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-executableWarApp.gradle +++ b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-executableWarApp.gradle @@ -15,8 +15,7 @@ repositories { } } mavenCentral() - maven { url 'https://repo.spring.io/milestone' } - maven { url 'https://repo.spring.io/snapshot' } + spring.mavenRepositories() } dependencies { diff --git a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-nativeApp.gradle b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-nativeApp.gradle index ffa36bf5978..a34059e7243 100644 --- a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-nativeApp.gradle +++ b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-nativeApp.gradle @@ -16,8 +16,7 @@ repositories { } } mavenCentral() - maven { url 'https://repo.spring.io/milestone' } - maven { url 'https://repo.spring.io/snapshot' } + spring.mavenRepositories() } dependencies { diff --git a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-plainDistZipJarApp.gradle b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-plainDistZipJarApp.gradle index 91a0707f0f8..c06a8fee24e 100644 --- a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-plainDistZipJarApp.gradle +++ b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-plainDistZipJarApp.gradle @@ -15,8 +15,7 @@ repositories { } } mavenCentral() - maven { url 'https://repo.spring.io/milestone' } - maven { url 'https://repo.spring.io/snapshot' } + spring.mavenRepositories() } dependencies { diff --git a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-plainWarApp.gradle b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-plainWarApp.gradle index ec964e92520..29ef451f3b9 100644 --- a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-plainWarApp.gradle +++ b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-plainWarApp.gradle @@ -15,8 +15,7 @@ repositories { } } mavenCentral() - maven { url 'https://repo.spring.io/milestone' } - maven { url 'https://repo.spring.io/snapshot' } + spring.mavenRepositories() } dependencies { diff --git a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests.gradle b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests.gradle index 71fe32355b0..8c14e21a229 100644 --- a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests.gradle +++ b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests.gradle @@ -14,8 +14,7 @@ repositories { } } mavenCentral() - maven { url 'https://repo.spring.io/milestone' } - maven { url 'https://repo.spring.io/snapshot' } + spring.mavenRepositories() } dependencies { diff --git a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/settings.gradle b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/settings.gradle index 8cf6a26b51e..87dfe2ab9af 100644 --- a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/settings.gradle +++ b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/settings.gradle @@ -8,8 +8,7 @@ pluginManagement { includeGroup "org.springframework.boot" } } - maven { url 'https://repo.spring.io/milestone' } - maven { url 'https://repo.spring.io/snapshot' } + spring.mavenRepositories() gradlePluginPortal() } resolutionStrategy { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/spring-boot-launch-script-tests-app/build.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/spring-boot-launch-script-tests-app/build.gradle index 9e9dc0d2382..8330c1e3fa2 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/spring-boot-launch-script-tests-app/build.gradle +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/spring-boot-launch-script-tests-app/build.gradle @@ -8,8 +8,7 @@ apply plugin: "io.spring.dependency-management" repositories { maven { url "file:${rootDir}/../docker-test-maven-repository"} mavenCentral() - maven { url "https://repo.spring.io/milestone" } - maven { url "https://repo.spring.io/snapshot" } + spring.mavenRepositories() } dependencies { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/spring-boot-launch-script-tests-app/settings.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/spring-boot-launch-script-tests-app/settings.gradle index 40b46b93926..7e8853d1a2b 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/spring-boot-launch-script-tests-app/settings.gradle +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/spring-boot-launch-script-tests-app/settings.gradle @@ -1,9 +1,9 @@ pluginManagement { + evaluate(new File("${gradle.parent.rootProject.rootDir}/buildSrc/SpringRepositorySupport.groovy")).apply(this) repositories { maven { url "file:${rootDir}/../docker-test-maven-repository"} mavenCentral() - maven { url "https://repo.spring.io/snapshot" } - maven { url "https://repo.spring.io/milestone" } + spring.mavenRepositories() } resolutionStrategy { eachPlugin { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-classic-tests/spring-boot-loader-classic-tests-app/build.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-classic-tests/spring-boot-loader-classic-tests-app/build.gradle index e7b3725dbbf..9a17edbe694 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-classic-tests/spring-boot-loader-classic-tests-app/build.gradle +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-classic-tests/spring-boot-loader-classic-tests-app/build.gradle @@ -8,8 +8,7 @@ apply plugin: "io.spring.dependency-management" repositories { maven { url "file:${rootDir}/../docker-test-maven-repository"} mavenCentral() - maven { url "https://repo.spring.io/snapshot" } - maven { url "https://repo.spring.io/milestone" } + spring.mavenRepositories() } dependencies { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-classic-tests/spring-boot-loader-classic-tests-app/settings.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-classic-tests/spring-boot-loader-classic-tests-app/settings.gradle index 40b46b93926..7e8853d1a2b 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-classic-tests/spring-boot-loader-classic-tests-app/settings.gradle +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-classic-tests/spring-boot-loader-classic-tests-app/settings.gradle @@ -1,9 +1,9 @@ pluginManagement { + evaluate(new File("${gradle.parent.rootProject.rootDir}/buildSrc/SpringRepositorySupport.groovy")).apply(this) repositories { maven { url "file:${rootDir}/../docker-test-maven-repository"} mavenCentral() - maven { url "https://repo.spring.io/snapshot" } - maven { url "https://repo.spring.io/milestone" } + spring.mavenRepositories() } resolutionStrategy { eachPlugin { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-app/build.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-app/build.gradle index 209479c32ca..d69aa8eaf0d 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-app/build.gradle +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-app/build.gradle @@ -8,8 +8,7 @@ apply plugin: "io.spring.dependency-management" repositories { maven { url "file:${rootDir}/../docker-test-maven-repository"} mavenCentral() - maven { url "https://repo.spring.io/snapshot" } - maven { url "https://repo.spring.io/milestone" } + spring.mavenRepositories() } dependencies { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-app/settings.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-app/settings.gradle index 40b46b93926..7e8853d1a2b 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-app/settings.gradle +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-app/settings.gradle @@ -1,9 +1,9 @@ pluginManagement { + evaluate(new File("${gradle.parent.rootProject.rootDir}/buildSrc/SpringRepositorySupport.groovy")).apply(this) repositories { maven { url "file:${rootDir}/../docker-test-maven-repository"} mavenCentral() - maven { url "https://repo.spring.io/snapshot" } - maven { url "https://repo.spring.io/milestone" } + spring.mavenRepositories() } resolutionStrategy { eachPlugin { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-signed-jar/build.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-signed-jar/build.gradle index e3554106e64..a7e9b0225fd 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-signed-jar/build.gradle +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-signed-jar/build.gradle @@ -10,8 +10,7 @@ apply plugin: "io.spring.dependency-management" repositories { maven { url "file:${rootDir}/../docker-test-maven-repository"} mavenCentral() - maven { url "https://repo.spring.io/snapshot" } - maven { url "https://repo.spring.io/milestone" } + spring.mavenRepositories() } dependencies { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-signed-jar/settings.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-signed-jar/settings.gradle index 40b46b93926..7e8853d1a2b 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-signed-jar/settings.gradle +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-signed-jar/settings.gradle @@ -1,9 +1,9 @@ pluginManagement { + evaluate(new File("${gradle.parent.rootProject.rootDir}/buildSrc/SpringRepositorySupport.groovy")).apply(this) repositories { maven { url "file:${rootDir}/../docker-test-maven-repository"} mavenCentral() - maven { url "https://repo.spring.io/snapshot" } - maven { url "https://repo.spring.io/milestone" } + spring.mavenRepositories() } resolutionStrategy { eachPlugin { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/spring-boot-server-tests-app/build.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/spring-boot-server-tests-app/build.gradle index bd73d368e59..60379bb2c43 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/spring-boot-server-tests-app/build.gradle +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/spring-boot-server-tests-app/build.gradle @@ -12,18 +12,7 @@ apply plugin: "io.spring.dependency-management" repositories { maven { url "file:${rootDir}/../test-repository"} mavenCentral() - maven { - url "https://repo.spring.io/milestone" - content { - excludeGroup "org.springframework.boot" - } - } - maven { - url "https://repo.spring.io/snapshot" - content { - excludeGroup "org.springframework.boot" - } - } + spring.mavenRepositoriesExcludingBootGroup() } configurations { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/spring-boot-server-tests-app/settings.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/spring-boot-server-tests-app/settings.gradle index 236e1353729..a9186a6871e 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/spring-boot-server-tests-app/settings.gradle +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/spring-boot-server-tests-app/settings.gradle @@ -1,19 +1,9 @@ pluginManagement { + evaluate(new File("${gradle.parent.rootProject.rootDir}/buildSrc/SpringRepositorySupport.groovy")).apply(this) repositories { maven { url "file:${rootDir}/../test-repository"} mavenCentral() - maven { - url "https://repo.spring.io/milestone" - content { - excludeGroup "org.springframework.boot" - } - } - maven { - url "https://repo.spring.io/snapshot" - content { - excludeGroup "org.springframework.boot" - } - } + spring.mavenRepositoriesExcludingBootGroup() } resolutionStrategy { eachPlugin {