diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 8335f8d5..61bbe415 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -37,7 +37,7 @@ jobs: with: node-version: '16' - run: | - ./gradlew clean build nativeCompile -PspringShellSampleMusl=${{ matrix.musl }} -PspringShellSampleE2E=true + ./gradlew clean build nativeCompile -PspringShellSampleMusl=${{ matrix.musl }} -PspringShellSampleNative=true -PspringShellSampleE2E=true timeout-minutes: 30 - uses: actions/upload-artifact@v3 with: diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index a95192ff..f02991c6 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -18,14 +18,17 @@ ext { def properties = new Properties() properties.load(it) set("springBootVersion", properties["springBootVersion"]) + set("nativeBuildToolsVersion", properties["nativeBuildToolsVersion"]) } } dependencies { implementation(platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")) + implementation "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}" implementation("org.springframework:spring-core") implementation 'org.asciidoctor:asciidoctor-gradle-jvm:3.3.2' implementation 'org.jfrog.buildinfo:build-info-extractor-gradle:4.29.0' + implementation "org.graalvm.buildtools:native-gradle-plugin:${nativeBuildToolsVersion}" } gradlePlugin { diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/SamplePlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/SamplePlugin.java index b319e31c..b8270005 100644 --- a/buildSrc/src/main/java/org/springframework/shell/gradle/SamplePlugin.java +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/SamplePlugin.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 the original author or authors. + * Copyright 2022-2023 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. @@ -15,21 +15,75 @@ */ package org.springframework.shell.gradle; +import org.graalvm.buildtools.gradle.NativeImagePlugin; +import org.graalvm.buildtools.gradle.dsl.GraalVMExtension; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.PluginManager; +import org.springframework.boot.gradle.dsl.SpringBootExtension; +import org.springframework.boot.gradle.plugin.SpringBootPlugin; +import org.springframework.boot.gradle.tasks.bundling.BootJar; /** * @author Janne Valkealahti */ class SamplePlugin implements Plugin { + private static final String NATIVE = "springShellSampleNative"; + private static final String E2E = "springShellSampleE2E"; + private static final String MUSL = "springShellSampleMusl"; + @Override public void apply(Project project) { PluginManager pluginManager = project.getPluginManager(); pluginManager.apply(JavaPlugin.class); pluginManager.apply(ManagementConfigurationPlugin.class); + pluginManager.apply(SpringBootPlugin.class); + if (isEnabled(project, NATIVE)) { + pluginManager.apply(NativeImagePlugin.class); + customizeNative(project); + } + configureBootJar(project); + configureBootBuildInfo(project); new JavaConventions().apply(project); } + + private void configureBootJar(Project project) { + if (isEnabled(project, E2E)) { + project.getTasks().withType(BootJar.class, (bootJar) -> { + String name = String.format("%s.%s", bootJar.getArchiveBaseName().get(), + bootJar.getArchiveExtension().get()); + bootJar.getArchiveFileName().set(name); + }); + } + } + + private void configureBootBuildInfo(Project project) { + SpringBootExtension extension = project.getExtensions().getByType(SpringBootExtension.class); + extension.buildInfo(buildInfo -> { + buildInfo.getExcludes().add("time"); + }); + } + + private void customizeNative(Project project) { + project.getPlugins().withType(NativeImagePlugin.class).all(nativePlugin -> { + configureGraalVmExtension(project); + }); + } + + private void configureGraalVmExtension(Project project) { + GraalVMExtension extension = project.getExtensions().getByType(GraalVMExtension.class); + if (isEnabled(project, MUSL)) { + extension.getBinaries().getByName(NativeImagePlugin.NATIVE_MAIN_EXTENSION).buildArgs("--static", + "--libc=musl"); + } + } + + private boolean isEnabled(Project project, String property) { + if (project.hasProperty(property)) { + return Boolean.valueOf(String.valueOf(project.findProperty(property))); + } + return false; + } } diff --git a/settings.gradle b/settings.gradle index 1ea1b808..545cdaed 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,8 +11,6 @@ pluginManagement { } } plugins { - id 'org.springframework.boot' version "$springBootVersion" - id 'org.graalvm.buildtools.native' version "$nativeBuildToolsVersion" id 'com.gradle.enterprise' version "$gradleEnterpriseVersion" id 'io.spring.ge.conventions' version "$springGeConventionsVersion" } diff --git a/spring-shell-samples/spring-shell-sample-catalog/spring-shell-sample-catalog.gradle b/spring-shell-samples/spring-shell-sample-catalog/spring-shell-sample-catalog.gradle index be28fd50..4a1e5dfc 100644 --- a/spring-shell-samples/spring-shell-sample-catalog/spring-shell-sample-catalog.gradle +++ b/spring-shell-samples/spring-shell-sample-catalog/spring-shell-sample-catalog.gradle @@ -1,7 +1,5 @@ plugins { id 'org.springframework.shell.sample' - id 'org.springframework.boot' - id 'org.graalvm.buildtools.native' } description = 'Spring Shell Sample Catalog' @@ -13,29 +11,3 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.awaitility:awaitility' } - -springBoot { - buildInfo { - excludes = ['time'] - } -} - -if (project.hasProperty('springShellSampleE2E') && springShellSampleE2E.toBoolean()) { - bootJar { - archiveFileName = "${archiveBaseName.get()}.${archiveExtension.get()}" - } -} - -graalvmNative { - metadataRepository { - enabled = true - } - binaries { - main { - if (project.hasProperty('springShellSampleMusl') && springShellSampleMusl.toBoolean()) { - buildArgs.add('--static') - buildArgs.add('--libc=musl') - } - } - } -} diff --git a/spring-shell-samples/spring-shell-sample-commands/spring-shell-sample-commands.gradle b/spring-shell-samples/spring-shell-sample-commands/spring-shell-sample-commands.gradle index 7619f1a9..c1397b87 100644 --- a/spring-shell-samples/spring-shell-sample-commands/spring-shell-sample-commands.gradle +++ b/spring-shell-samples/spring-shell-sample-commands/spring-shell-sample-commands.gradle @@ -1,7 +1,5 @@ plugins { id 'org.springframework.shell.sample' - id 'org.springframework.boot' - id 'org.graalvm.buildtools.native' } description = 'Spring Shell Sample Commands' @@ -13,29 +11,3 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.awaitility:awaitility' } - -springBoot { - buildInfo { - excludes = ['time'] - } -} - -if (project.hasProperty('springShellSampleE2E') && springShellSampleE2E.toBoolean()) { - bootJar { - archiveFileName = "${archiveBaseName.get()}.${archiveExtension.get()}" - } -} - -graalvmNative { - metadataRepository { - enabled = true - } - binaries { - main { - if (project.hasProperty('springShellSampleMusl') && springShellSampleMusl.toBoolean()) { - buildArgs.add('--static') - buildArgs.add('--libc=musl') - } - } - } -} diff --git a/spring-shell-samples/spring-shell-sample-e2e/spring-shell-sample-e2e.gradle b/spring-shell-samples/spring-shell-sample-e2e/spring-shell-sample-e2e.gradle index 0a7715b3..c0975acc 100644 --- a/spring-shell-samples/spring-shell-sample-e2e/spring-shell-sample-e2e.gradle +++ b/spring-shell-samples/spring-shell-sample-e2e/spring-shell-sample-e2e.gradle @@ -1,7 +1,5 @@ plugins { id 'org.springframework.shell.sample' - id 'org.springframework.boot' - id 'org.graalvm.buildtools.native' } description = 'Spring Shell Sample E2E' @@ -13,29 +11,3 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.awaitility:awaitility' } - -springBoot { - buildInfo { - excludes = ['time'] - } -} - -if (project.hasProperty('springShellSampleE2E') && springShellSampleE2E.toBoolean()) { - bootJar { - archiveFileName = "${archiveBaseName.get()}.${archiveExtension.get()}" - } -} - -graalvmNative { - metadataRepository { - enabled = true - } - binaries { - main { - if (project.hasProperty('springShellSampleMusl') && springShellSampleMusl.toBoolean()) { - buildArgs.add('--static') - buildArgs.add('--libc=musl') - } - } - } -}