diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java new file mode 100644 index 00000000000..1cc42bae4b6 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java @@ -0,0 +1,66 @@ +/* + * 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. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * A {@link BuildCustomizer} that adds a Maven plugin when azure-support is selected. + * + * @author Muyao Feng + */ +class SpringAzureMavenBuildCustomizer implements BuildCustomizer { + + private static final String PLUGIN_VERSION = "0.1.0"; + + private final ProjectDescription projectDescription; + + SpringAzureMavenBuildCustomizer(ProjectDescription projectDescription) { + this.projectDescription = projectDescription; + } + + @Override + public void customize(MavenBuild build) { + build.plugins().add("com.microsoft.azure", "azure-container-apps-maven-plugin", (plugin) -> { + plugin.version(PLUGIN_VERSION); + plugin.configuration((configuration) -> { + configuration.add("subscriptionId", "your-subscription-id"); + configuration.add("resourceGroup", "your-resource-group"); + configuration.add("appEnvironmentName", "your-app-environment-name"); + configuration.add("region", "your-region"); + configuration.add("appName", this.projectDescription.getName()); + configuration.add("containers", (containers) -> { + containers.add("container", (container) -> { + container.add("type", "code"); + container.add("directory", "${project.basedir}"); + }); + }); + configuration.add("ingress", (ingress) -> { + ingress.add("external", "true"); + ingress.add("targetPort", "8080"); + }); + configuration.add("scale", (scale) -> { + scale.add("minReplicas", "0"); + scale.add("maxReplicas", "10"); + }); + }); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java index 095d60c5a76..c208fc57ab1 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java @@ -37,7 +37,7 @@ abstract class SpringAzureModuleRegistry { static Iterable createSpringBootRegistry() { - return create( + return create(onDependencies("azure-support").customizeHelpDocument(addDeploySection()), onDependencies("actuator").customizeBuild(addDependency("spring-cloud-azure-starter-actuator")) .customizeHelpDocument(addReferenceLink("actuator", "Azure Actuator")), onDependencies("integration", "azure-storage") @@ -81,4 +81,31 @@ private static Consumer addReferenceLink(String id, String descrip }; } + private static Consumer addDeploySection() { + return (helpDocument) -> { + helpDocument.addSection((writer) -> { + writer.println("### Deploy to Azure"); + writer.println(); + writer.println("This project can be deployed to Azure with Maven."); + writer.println(); + writer.println( + "To get started, replace the following placeholder in your `pom.xml` with your specific Azure details:"); + writer.println(); + writer.println("- `subscriptionId`"); + writer.println("- `resourceGroup`"); + writer.println("- `appEnvironmentName`"); + writer.println("- `region`"); + writer.println(); + writer.println("Now you can deploy your application:"); + writer.println(""" + ```bash + ./mvnw azure-container-apps:deploy + ``` + """); + writer.println( + "Learn more about [Java on Azure Container Apps](https://learn.microsoft.com/azure/container-apps/java-overview)."); + }); + }; + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java index ddf690a22cf..edb867178d8 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * 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. @@ -17,6 +17,10 @@ package io.spring.start.site.extension.dependency.springazure; import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.start.site.support.implicit.ImplicitDependency; import io.spring.start.site.support.implicit.ImplicitDependencyBuildCustomizer; @@ -50,4 +54,11 @@ ImplicitDependencyHelpDocumentCustomizer azureDependencyHelpDocumentCustomizer(B return new ImplicitDependencyHelpDocumentCustomizer(this.azureDependencies, build); } + @Bean + @ConditionalOnRequestedDependency("azure-support") + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + SpringAzureMavenBuildCustomizer azureDependencyMavenBuildCustomizer(ProjectDescription projectDescription) { + return new SpringAzureMavenBuildCustomizer(projectDescription); + } + } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java new file mode 100644 index 00000000000..c0740ba3a14 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java @@ -0,0 +1,46 @@ +/* + * 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. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAzureMavenBuildCustomizer}. + * + * @author Muyao Feng + * @author Moritz Halbritter + */ +class SpringAzureMavenBuildCustomizerTests extends AbstractExtensionTests { + + @Test + void shouldDoNothingIfAzureSupportIsntSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotContain("azure-container-apps-maven-plugin"); + } + + @Test + void azureContainerAppsMavenPluginAddedWhenAzureSupportPresent() { + ProjectRequest request = createProjectRequest("azure-support"); + assertThat(mavenPom(request)).hasText("/project/build/plugins/plugin[1]/groupId", "com.microsoft.azure") + .hasText("/project/build/plugins/plugin[1]/artifactId", "azure-container-apps-maven-plugin"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java index 97b1a9f311f..1d71361684e 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java @@ -118,6 +118,12 @@ void azureJdbcWithPostgresql() { .doesNotContain("https://aka.ms/spring/msdocs/mysql"); } + @Test + void DeploytoAzureSectionAddedWhenAzureSupportPresent() { + ProjectStructure project = generateProject("azure-support"); + assertThatHelpDocumentOf(project).contains("### Deploy to Azure"); + } + private static Stream azureDependencies() { return Stream.of(Arguments.of("azure-active-directory"), Arguments.of("azure-keyvault"), Arguments.of("azure-storage"), Arguments.of("azure-support"));