push signing of artifacts into the main build instead of the groovy-release repo
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/e3288bde Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/e3288bde Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/e3288bde Branch: refs/heads/GROOVY_2_4_X Commit: e3288bde7027a96b840e2cfec30179d44290aa2e Parents: a9c4126 Author: paulk <[email protected]> Authored: Fri Jan 6 00:00:44 2017 +1000 Committer: paulk <[email protected]> Committed: Fri Jan 6 00:00:44 2017 +1000 ---------------------------------------------------------------------- build.gradle | 12 ++- gradle/assemble.gradle | 10 +-- gradle/backports.gradle | 1 + gradle/signing.gradle | 92 +++++++++++++++++++++ gradle/upload.gradle | 108 ++++++++++++++++++++++--- subprojects/groovy-templates/build.gradle | 2 +- 6 files changed, 203 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/e3288bde/build.gradle ---------------------------------------------------------------------- diff --git a/build.gradle b/build.gradle index 18f63d1..ca8506b 100644 --- a/build.gradle +++ b/build.gradle @@ -54,6 +54,8 @@ indyBanner() // TODO use antlr plugin //apply plugin: 'antlr' +ext.isReleaseVersion = !groovyVersion.toLowerCase().endsWith("snapshot") + allprojects { apply plugin: 'java' @@ -451,6 +453,8 @@ apply from: 'gradle/idea.gradle' apply from: 'gradle/eclipse.gradle' apply from: 'gradle/codehaus.gradle' apply from: 'gradle/quality.gradle' +apply from: 'gradle/signing.gradle' + // If a local configuration file for tweaking the build is present, apply it if (file('user.gradle').exists()) { apply from: 'user.gradle' @@ -458,10 +462,10 @@ if (file('user.gradle').exists()) { if (!JavaVersion.current().java7Compatible) { logger.lifecycle ''' - **************************************** WARNING ********************************************** - ****** You are running the build with an older JDK. NEVER try to release with 1.6. ****** - ****** You must use a JDK 1.7+ in order to compile all features of the language. ****** - *********************************************************************************************** + **************************************** WARNING ******************************************** + ****** You are running the build with an older JDK. NEVER try to release with 1.6. ****** + ****** You must use a JDK 1.7+ in order to compile all features of the language. ****** + ********************************************************************************************* ''' } http://git-wip-us.apache.org/repos/asf/groovy/blob/e3288bde/gradle/assemble.gradle ---------------------------------------------------------------------- diff --git a/gradle/assemble.gradle b/gradle/assemble.gradle index 8a91a28..38c7252 100644 --- a/gradle/assemble.gradle +++ b/gradle/assemble.gradle @@ -340,7 +340,7 @@ task jarAll(type: Jar, dependsOn: replaceJarWithJarJar) { inputs.files(allprojects.jar.archivePath) ext.metaInfDir = "$buildDir/tmp/groovy-all-metainf" - appendix = 'all' + baseName = 'groovy-all' includeEmptyDirs = false if (rootProject.useIndy()) { classifier = 'indy' @@ -445,7 +445,7 @@ task sourceAllJar(type: Jar, dependsOn: { modules()*.sourceJar + rootProject.sou modules()*.sourceJar.each { with it.rootSpec } - appendix = 'all' + baseName = 'groovy-all' classifier = rootProject.useIndy() ? 'indy-sources' : 'sources' } @@ -461,13 +461,13 @@ allprojects { } task javadocAllJar(type: Jar, dependsOn: javadocAll) { - appendix = 'all' + baseName = 'groovy-all' classifier = rootProject.useIndy() ? 'indy-javadoc' : 'javadoc' from javadocAll.destinationDir } task groovydocAllJar(type: Jar, dependsOn: groovydocAll) { - appendix = 'all' + baseName = 'groovy-all' classifier = rootProject.useIndy() ? 'indy-groovydoc' : 'groovydoc' from groovydocAll.destinationDir } @@ -529,7 +529,7 @@ ext.distSpec = copySpec { } into('embeddable') { from jarAll.archivePath - from { new File(jarAll.archivePath.parent, "${jarAll.baseName}-${jarAll.appendix}-${jarAll.version}-indy.jar") } + from { new File(jarAll.destinationDir, "${jarAll.baseName}-${jarAll.version}-indy.jar") } } } http://git-wip-us.apache.org/repos/asf/groovy/blob/e3288bde/gradle/backports.gradle ---------------------------------------------------------------------- diff --git a/gradle/backports.gradle b/gradle/backports.gradle index de4223a..1402e50 100644 --- a/gradle/backports.gradle +++ b/gradle/backports.gradle @@ -42,6 +42,7 @@ backports.each { pkg, classList -> from zipTree(jar.archivePath) include classList baseName = "groovy-backports-$pkg" + classifier = '' } // the following two jars are empty. No wonder, Maven Central *requires* a javadoc and sources classifier http://git-wip-us.apache.org/repos/asf/groovy/blob/e3288bde/gradle/signing.gradle ---------------------------------------------------------------------- diff --git a/gradle/signing.gradle b/gradle/signing.gradle new file mode 100644 index 0000000..89c3a01 --- /dev/null +++ b/gradle/signing.gradle @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * http://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. + */ + +import org.gradle.plugins.signing.Sign + +allprojects { + apply plugin: 'signing' + signing { + required { + isReleaseVersion && + (gradle.taskGraph.hasTask('artifactoryPublish') || project.hasProperty('forceSign')) + } + } +} + +gradle.taskGraph.whenReady { taskGraph -> + if (taskGraph.allTasks.any { it instanceof Sign } || project.hasProperty('forceSign')) { + // Use Java 6's console or Swing to read input (not suitable for CI) + if (!project.hasProperty('signing.keyId') || + !project.hasProperty('signing.secretKeyRingFile') || + !project.hasProperty('signing.password')) { + printf "\n\nWe have to sign some things in this build." + + "\n\nPlease enter your signing details.\n\n" + System.out.flush() + + if (!project.hasProperty('signing.keyId')) { + project.ext.'signing.keyId' = promptUser('PGP Key Id') + } + if (!project.hasProperty('signing.secretKeyRingFile')) { + project.ext.'signing.secretKeyRingFile' = promptUser('PGP Secret Key Ring File (absolute path)') + } + if (!project.hasProperty('signing.password')) { + project.ext.'signing.password' = promptUser('PGP Private Key Password') + } + + printf "\nThanks.\n\n" + System.out.flush() + } + allprojects { ext.'signing.keyId' = project.getProperty('signing.keyId') } + allprojects { ext.'signing.secretKeyRingFile' = project.getProperty('signing.secretKeyRingFile') } + allprojects { ext.'signing.password' = project.getProperty('signing.password') } + } +} + +def promptUser(String prompt) { + def response = '' + if (System.console() == null) { + new groovy.swing.SwingBuilder().edt { + dialog(modal: true, //Otherwise the build will continue running + title: 'Reponse required', //Dialog title + alwaysOnTop: true, + resizable: false, + locationRelativeTo: null, //Place dialog in center of the screen + pack: true, //We need to pack the dialog (so it will take the size of its children) + show: true + ){ + vbox { //Put everything below each other + label(text: "$prompt:") + input = passwordField() + button(defaultButton: true, text: 'OK', actionPerformed: { + response = new String(input.password); //set pass variable to value of input field + dispose(); //close dialog + }) + } + } + } + } + else{ + response = new String(System.console().readPassword("\n$prompt: ")) + } + + if(response.size() <= 0){ + throw new InvalidUserDataException("Null response detected!") + } + response +} http://git-wip-us.apache.org/repos/asf/groovy/blob/e3288bde/gradle/upload.gradle ---------------------------------------------------------------------- diff --git a/gradle/upload.gradle b/gradle/upload.gradle index bd64084..f653d31 100644 --- a/gradle/upload.gradle +++ b/gradle/upload.gradle @@ -39,7 +39,25 @@ allprojects { apply from: 'gradle/backports.gradle' +ext.basename = { String s -> s.take(s.lastIndexOf('.')) } +ext.deriveFile = { File archive, String suffix -> new File(archive.parent, basename(archive.name) + "-${suffix}.jar") } + allprojects { + ext.signWithClassifier = { String c, File f -> + signing.sign(c, f) + project.artifacts.add('archives', new File(f.parent, f.name + '.asc')) { + classifier = c + type = 'jar.asc' + } + } + + ext.signArchiveTask = { archiveTask -> + signing.sign(archiveTask.classifier, archiveTask.archivePath) + project.artifacts.add('archives', new File(archiveTask.destinationDir, archiveTask.archiveName + '.asc')) { + classifier = archiveTask.classifier + type = archiveTask.extension + '.asc' + } + } configurations { deployerJars @@ -50,6 +68,7 @@ allprojects { mavenDeployer { configuration = configurations.deployerJars pom pomConfigureClosure + beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } } } } @@ -58,6 +77,7 @@ allprojects { repositories { mavenInstaller { pom pomConfigureClosure + beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } } } } @@ -78,49 +98,111 @@ allprojects { new GradleException('You cannot use uploadArchives or install task with the flag [indy] turned' +' on because the build handles indy artifacts by itself in that case.') } - def archive = jar.archivePath - def indyJar = new File(archive.parent, archive.name[0..archive.name.lastIndexOf('.')-1]+'-indy.jar') + def indyJar = rootProject.ext.deriveFile(jar.archivePath, 'indy') if (indyJar.exists()) { project.artifacts.add('archives', indyJar) } - def grooidJar = new File(archive.parent, archive.name[0..archive.name.lastIndexOf('.')-1]+'-grooid.jar') + def grooidJar = rootProject.ext.deriveFile(jar.archivePath, 'grooid') if (grooidJar.exists()) { project.artifacts.add('archives', grooidJar) } } } + + install { + doFirst { + signArchiveTask(jar) + signArchiveTask(sourceJar) + signArchiveTask(javadocJar) + signArchiveTask(groovydocJar) + def indyJar = rootProject.ext.deriveFile(jar.archivePath, 'indy') + if (indyJar.exists()) { + signWithClassifier('indy', indyJar) + } + def grooidJar = rootProject.ext.deriveFile(jar.archivePath, 'grooid') + if (grooidJar.exists()) { + signWithClassifier('grooid', grooidJar) + } + } + } } // the root project generates an alternate 'groovy-all' artifact [uploadArchives, install]*.with { dependsOn([sourceAllJar, javadocAllJar, groovydocAllJar, distBin]) doFirst { - project.artifacts.add('archives', jarAll) - project.artifacts.add('archives', sourceAllJar) - project.artifacts.add('archives', javadocAllJar) - project.artifacts.add('archives', groovydocAllJar) - project.artifacts.add('archives', distBin) + project.artifacts.add('archives', jarAll) { + name = 'groovy-all' + } + project.artifacts.add('archives', sourceAllJar) { + name = 'groovy-all' + } + project.artifacts.add('archives', javadocAllJar) { + name = 'groovy-all' + } + project.artifacts.add('archives', groovydocAllJar) { + name = 'groovy-all' + } + project.artifacts.add('archives', distBin) { + name = 'groovy-binary' + } tasks.withType(Jar).matching { it.name.startsWith('backport') }.each { t -> project.artifacts.add('archives', t.archivePath) { name = t.baseName type = 'jar' + classifier = t.classifier } } - def archive = jarAll.archivePath - def indyJar = new File(archive.parent, archive.name[0..archive.name.lastIndexOf('.')-1] + '-indy.jar') + def indyJar = deriveFile(jarAll.archivePath, 'indy') if (indyJar.exists()) { project.artifacts.add('archives', indyJar) } - def grooidJar = new File(archive.parent, archive.name[0..archive.name.lastIndexOf('.')-1]+'-grooid.jar') + def grooidJar = deriveFile(jarAll.archivePath, 'grooid') if (grooidJar.exists()) { project.artifacts.add('archives', grooidJar) } } } + +install { + doFirst { + signArchiveTask(jarAll) + signArchiveTask(sourceAllJar) + signArchiveTask(javadocAllJar) + signArchiveTask(groovydocAllJar) + signArchiveTask(distBin) + + // next three are done as a side effect since it was the easiest approach + signing.sign(distSrc.archivePath) + signing.sign(distDoc.archivePath) + signing.sign(dist.archivePath) + + tasks.withType(Jar).matching { it.name.startsWith('backport') }.each { t -> + signing.sign(t.classifier, t.archivePath) + project.artifacts.add('archives', new File(t.destinationDir, t.archiveName + '.asc')) { + name = t.baseName + classifier = t.classifier + type = t.extension + '.asc' + } + } + + def indyJar = deriveFile(jarAll.archivePath, 'indy') + if (indyJar.exists()) { + signWithClassifier('indy', indyJar) + } + def grooidJar = deriveFile(jarAll.archivePath, 'grooid') + if (grooidJar.exists()) { + signWithClassifier('grooid', grooidJar) + } + } +} + ext.pomAll = { addFilter('groovy') { artifact, file -> - !(artifact.name.contains('groovy-all')) && !(artifact.name.contains('groovy-binary')) && !(artifact.name.contains('backport')) + !(artifact.name.contains('groovy-all')) && + !(artifact.name.contains('groovy-binary')) && + !(artifact.name.contains('backport')) } addFilter('all') { artifact, file -> artifact.name.contains('groovy-all') @@ -173,6 +255,8 @@ ext.pomAll = { binarypom.whenConfigured { p -> p.dependencies.clear() } + + beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } } install { http://git-wip-us.apache.org/repos/asf/groovy/blob/e3288bde/subprojects/groovy-templates/build.gradle ---------------------------------------------------------------------- diff --git a/subprojects/groovy-templates/build.gradle b/subprojects/groovy-templates/build.gradle index cb670ad..3a21668 100644 --- a/subprojects/groovy-templates/build.gradle +++ b/subprojects/groovy-templates/build.gradle @@ -27,7 +27,7 @@ dependencies { } task backportJar(type:Jar) { - appendix = 'markup-backport' + name = 'groovy-markup-backport' dependsOn classes from sourceSets.main.output include 'groovy/text/markup/**'
