207 lines
5.8 KiB
Groovy
207 lines
5.8 KiB
Groovy
/*
|
|
* Hibernate, Relational Persistence for Idiomatic Java
|
|
*
|
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
|
*/
|
|
|
|
apply from: rootProject.file( 'gradle/releasable.gradle' )
|
|
apply from: rootProject.file( 'gradle/java-module.gradle' )
|
|
apply from: rootProject.file( 'gradle/publishing-pom.gradle' )
|
|
|
|
apply plugin: 'signing'
|
|
|
|
// Make sure that the publishReleaseArtifacts task of the release module runs the release task of this sub module
|
|
tasks.getByPath( ':release:publishReleaseArtifacts' ).dependsOn tasks.release
|
|
|
|
configurations {
|
|
javadocSources {
|
|
description 'Used to aggregate javadocs for the whole project'
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
javadocSources sourceSets.main.allJava
|
|
}
|
|
|
|
|
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Publishing
|
|
|
|
publishing {
|
|
publications {
|
|
// main publication
|
|
publishedArtifacts {
|
|
// Add the Java component to the main publication
|
|
from components.java
|
|
}
|
|
}
|
|
}
|
|
|
|
java {
|
|
// include javadoc and sources jar in the Java component
|
|
// - classes jar included by default
|
|
withJavadocJar()
|
|
withSourcesJar()
|
|
}
|
|
|
|
var signingKey = resolveSigningKey()
|
|
var signingPassword = findSigningProperty( "RELEASE_GPG_PASSPHRASE" )
|
|
|
|
signing {
|
|
useInMemoryPgpKeys( signingKey, signingPassword )
|
|
|
|
sign publishing.publications.publishedArtifacts
|
|
}
|
|
|
|
String resolveSigningKey() {
|
|
var key = findSigningProperty( "RELEASE_GPG_PRIVATE_KEY" )
|
|
if ( key != null ) {
|
|
return key
|
|
}
|
|
|
|
var keyFile = findSigningProperty( "RELEASE_GPG_PRIVATE_KEY_PATH" )
|
|
if ( keyFile != null ) {
|
|
return new File( keyFile ).text
|
|
}
|
|
|
|
return null
|
|
}
|
|
|
|
String findSigningProperty(String propName) {
|
|
def sysProp = System.getProperty(propName)
|
|
if ( sysProp != null ) {
|
|
logger.debug "Found `{}` as a system property", propName
|
|
return sysProp
|
|
}
|
|
|
|
def envVar = System.getenv().get(propName)
|
|
if ( envVar != null ) {
|
|
logger.debug "Found `{}` as an env-var property", propName
|
|
return envVar
|
|
}
|
|
|
|
def projectProp = project.hasProperty(propName)
|
|
if (projectProp) {
|
|
logger.debug "Found `{}` as a project property", propName
|
|
return projectProp
|
|
}
|
|
|
|
logger.debug "Did not find `{}`", propName
|
|
return null
|
|
}
|
|
|
|
|
|
var signingTask = project.tasks.getByName( "signPublishedArtifactsPublication" ) as Sign
|
|
var signingExtension = project.getExtensions().getByType(SigningExtension) as SigningExtension
|
|
|
|
task sign {
|
|
dependsOn "signPublications"
|
|
}
|
|
|
|
task signPublications { t ->
|
|
tasks.withType( Sign ).all { s ->
|
|
t.dependsOn s
|
|
}
|
|
}
|
|
|
|
signingTask.doFirst {
|
|
if ( signingKey == null || signingPassword == null ) {
|
|
throw new GradleException(
|
|
"Cannot perform signing without GPG details. Please set the `signingKey` and `signingKeyFile` properties"
|
|
)
|
|
}
|
|
}
|
|
|
|
|
|
boolean wasSigningExplicitlyRequested() {
|
|
// check whether signing task was explicitly requested when running the build
|
|
//
|
|
// NOTE: due to https://discuss.gradle.org/t/how-to-tell-if-a-task-was-explicitly-asked-for-on-the-command-line/42853/3
|
|
// we cannot definitively know whether the task was requested. Gradle really just does not expose this information.
|
|
// so we make a convention - we check the "start parameters" object to see which task-names were requested;
|
|
// the problem is that these are the raw names directly from the command line. e.g. it is perfectly legal to
|
|
// say `gradlew signPubArtPub` in place of `gradlew signPublishedArtifactsPublication` - Gradle will simply
|
|
// "expand" the name it finds. However, it does not make that available.
|
|
//
|
|
// so the convention is that we will check for the following task names
|
|
//
|
|
// for each of:
|
|
// 1. `sign`
|
|
// 2. `signPublications`
|
|
// 3. `signPublishedArtifactsPublication`
|
|
//
|
|
// and we check both forms:
|
|
// 1. "${taskName}"
|
|
// 2. project.path + ":${taskName}"
|
|
//
|
|
// we need to check both again because of the "start parameters" discussion
|
|
|
|
def signingTaskNames = ["sign", "signPublications", "signPublishedArtifactsPublication"]
|
|
|
|
for ( String taskName : signingTaskNames ) {
|
|
if ( gradle.startParameter.taskNames.contains( taskName )
|
|
|| gradle.startParameter.taskNames.contains( "${project.path}:${taskName}" ) ) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
if ( wasSigningExplicitlyRequested() ) {
|
|
// signing was explicitly requested
|
|
signingExtension.required = true
|
|
}
|
|
else {
|
|
gradle.taskGraph.whenReady { graph ->
|
|
if ( graph.hasTask( signingTask ) ) {
|
|
// signing is scheduled to happen.
|
|
//
|
|
// we know, from above if-check, that it was not explicitly requested -
|
|
// so it is triggered via task dependency. make sure we want it to happen
|
|
var publishingTask = project.tasks.getByName( "publishPublishedArtifactsPublicationToSonatypeRepository" ) as PublishToMavenRepository
|
|
if ( graph.hasTask( publishingTask ) ) {
|
|
// we are publishing to Sonatype OSSRH - we need the signing to happen
|
|
signingExtension.required = true
|
|
}
|
|
else {
|
|
// signing was not explicitly requested and we are not publishing to OSSRH,
|
|
// so do not sign.
|
|
signingTask.enabled = false
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Release / publishing tasks
|
|
|
|
task ciBuild {
|
|
dependsOn test, tasks.publishToSonatype
|
|
}
|
|
|
|
tasks.release.dependsOn tasks.test, tasks.publishToSonatype
|
|
|
|
tasks.preVerifyRelease.dependsOn build
|
|
tasks.preVerifyRelease.dependsOn generateMetadataFileForPublishedArtifactsPublication
|
|
tasks.preVerifyRelease.dependsOn generatePomFileForPublishedArtifactsPublication
|
|
|
|
tasks.publishToSonatype.mustRunAfter test
|
|
|
|
|
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Ancillary tasks
|
|
|
|
task showPublications {
|
|
doFirst {
|
|
project.publishing.publications.each { publication ->
|
|
println "Publication (${publication.name}): ${publication.groupId}:${publication.artifactId}:${publication.version}"
|
|
publication.artifacts.each { artifact ->
|
|
println " > ${artifact}"
|
|
}
|
|
}
|
|
}
|
|
} |