From 67f2ebb75992277a25cb058cfd1f6f473b75940f Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Thu, 21 Mar 2024 10:54:06 +0000 Subject: [PATCH] Add signing plugin - Gradle build can now sign artifacts conditionally - Relates #1033 --- .../shell/gradle/SpringMavenPlugin.java | 23 +----- .../shell/gradle/SpringSigningPlugin.java | 70 +++++++++++++++++++ 2 files changed, 71 insertions(+), 22 deletions(-) create mode 100644 buildSrc/src/main/java/org/springframework/shell/gradle/SpringSigningPlugin.java diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/SpringMavenPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/SpringMavenPlugin.java index 611f08b0..384345fd 100644 --- a/buildSrc/src/main/java/org/springframework/shell/gradle/SpringMavenPlugin.java +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/SpringMavenPlugin.java @@ -21,8 +21,6 @@ import java.util.ListIterator; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.attributes.Usage; -import org.gradle.api.component.AdhocComponentWithVariants; -import org.gradle.api.component.ConfigurationVariantDetails; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.plugins.PluginManager; @@ -45,6 +43,7 @@ public class SpringMavenPlugin implements Plugin { public void apply(Project project) { PluginManager pluginManager = project.getPluginManager(); pluginManager.apply(MavenPublishPlugin.class); + pluginManager.apply(SpringSigningPlugin.class); pluginManager.apply(PublishLocalPlugin.class); pluginManager.apply(PublishAllJavaComponentsPlugin.class); @@ -64,35 +63,15 @@ public class SpringMavenPlugin implements Plugin { customizePom(publication.getPom(), project); project.getPlugins().withType(JavaPlugin.class) .all((javaPlugin) -> customizeJavaMavenPublication(publication, project)); - suppressMavenOptionalFeatureWarnings(publication); } private void customizeJavaMavenPublication(MavenPublication publication, Project project) { - addMavenOptionalFeature(project); publication.versionMapping((strategy) -> strategy.usage(Usage.JAVA_API, (mappingStrategy) -> mappingStrategy .fromResolutionOf(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME))); publication.versionMapping( (strategy) -> strategy.usage(Usage.JAVA_RUNTIME, VariantVersionMappingStrategy::fromResolutionResult)); } - private void suppressMavenOptionalFeatureWarnings(MavenPublication publication) { - publication.suppressPomMetadataWarningsFor("mavenOptionalApiElements"); - publication.suppressPomMetadataWarningsFor("mavenOptionalRuntimeElements"); - } - - private void addMavenOptionalFeature(Project project) { - JavaPluginExtension extension = project.getExtensions().getByType(JavaPluginExtension.class); - extension.registerFeature("mavenOptional", - (feature) -> feature.usingSourceSet(extension.getSourceSets().getByName("main"))); - AdhocComponentWithVariants javaComponent = (AdhocComponentWithVariants) project.getComponents() - .findByName("java"); - if (javaComponent != null) { - javaComponent.addVariantsFromConfiguration( - project.getConfigurations().findByName("mavenOptionalRuntimeElements"), - ConfigurationVariantDetails::mapToOptional); - } - } - private void customizePom(MavenPom pom, Project project) { pom.getUrl().set("https://spring.io/projects/spring-shell"); pom.getName().set(project.provider(project::getName)); diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/SpringSigningPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/SpringSigningPlugin.java new file mode 100644 index 00000000..748bad87 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/SpringSigningPlugin.java @@ -0,0 +1,70 @@ +/* + * Copyright 2016-2019 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.shell.gradle; + +import java.util.concurrent.Callable; + +import org.gradle.api.Action; +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.publish.Publication; +import org.gradle.api.publish.PublishingExtension; +import org.gradle.plugins.signing.SigningExtension; +import org.gradle.plugins.signing.SigningPlugin; + +public class SpringSigningPlugin implements Plugin { + @Override + public void apply(Project project) { + project.getPluginManager().apply(SigningPlugin.class); + project.getPlugins().withType(SigningPlugin.class).all(new Action() { + @Override + public void execute(SigningPlugin signingPlugin) { + boolean hasSigningKey = project.hasProperty("signingKey"); + if (hasSigningKey) { + sign(project); + } + } + }); + } + + private void sign(Project project) { + SigningExtension signing = project.getExtensions().findByType(SigningExtension.class); + signing.setRequired(new Callable() { + @Override + public Boolean call() throws Exception { + return project.getGradle().getTaskGraph().hasTask("publishArtifacts"); + } + }); + String signingKeyId = (String) project.findProperty("signingKeyId"); + String signingKey = (String) project.findProperty("signingKey"); + String signingPassword = (String) project.findProperty("signingPassword"); + if (signingKeyId != null) { + signing.useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword); + } else { + signing.useInMemoryPgpKeys(signingKey, signingPassword); + } + project.getPlugins().withType(PublishAllJavaComponentsPlugin.class) + .all(new Action() { + @Override + public void execute(PublishAllJavaComponentsPlugin publishingPlugin) { + PublishingExtension publishing = project.getExtensions().findByType(PublishingExtension.class); + Publication maven = publishing.getPublications().getByName("mavenJava"); + signing.sign(maven); + } + }); + } +}