diff --git a/bom/build.gradle b/bom/build.gradle index a5bc2668fa..77f4351670 100644 --- a/bom/build.gradle +++ b/bom/build.gradle @@ -1,5 +1,8 @@ apply plugin: 'maven-bom' apply from: "$rootDir/gradle/maven-deployment.gradle" +apply from: "$rootDir/gradle/artifactory.gradle" +apply from: "$rootDir/gradle/ossrh.gradle" +apply from: "$rootDir/gradle/deploy-artifacts.gradle" generatePom.enabled = false sonarqube.skipProject = true diff --git a/build.gradle b/build.gradle index 29e370fb0a..6eb2eb88cd 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,9 @@ buildscript { classpath('org.asciidoctor:asciidoctor-gradle-plugin:1.5.1') classpath("io.spring.gradle:docbook-reference-plugin:0.3.1") classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.19.RELEASE") + classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.12.0" + classpath 'org.hidetake:gradle-ssh-plugin:2.10.1' + classpath 'io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.21.1' } } @@ -20,6 +23,7 @@ plugins { } apply plugin: 'base' +apply from: "$rootDir/gradle/finalize-deploy.gradle" description = 'Spring Security' @@ -86,7 +90,6 @@ configure(allprojects - javaProjects) { } configure(subprojects - coreModuleProjects - project(':spring-security-samples-javaconfig-messages') - project(':spring-security-bom')) { - tasks.findByPath("artifactoryPublish")?.enabled = false sonarqube { skipProject = true } @@ -102,10 +105,13 @@ configure(javaProjects) { } apply from: "$rootDir/gradle/ide.gradle" apply from: "$rootDir/gradle/release-checks.gradle" - apply from: "$rootDir/gradle/maven-deployment.gradle" } configure(coreModuleProjects) { + apply from: "$rootDir/gradle/maven-deployment.gradle" + apply from: "$rootDir/gradle/artifactory.gradle" + apply from: "$rootDir/gradle/ossrh.gradle" + apply from: "$rootDir/gradle/deploy-artifacts.gradle" apply plugin: 'emma' apply plugin: 'spring-io' diff --git a/docs/docs.gradle b/docs/docs.gradle index dcb93b215c..4206ae72c6 100644 --- a/docs/docs.gradle +++ b/docs/docs.gradle @@ -1,5 +1,7 @@ // Docbook and Javadoc building and uploading tasks apply plugin: 'base' +apply from: "$rootDir/gradle/deploy-docs.gradle" +apply from: "$rootDir/gradle/deploy-schema.gradle" task docs { dependsOn 'manual:reference', 'apidocs', 'guides:asciidoctor' @@ -152,6 +154,7 @@ task schemaZip(type: Zip) { } assert xsdFile != null into (shortName) { + duplicatesStrategy 'exclude' from xsdFile.path } } diff --git a/gradle/artifactory.gradle b/gradle/artifactory.gradle new file mode 100644 index 0000000000..551d9ceb21 --- /dev/null +++ b/gradle/artifactory.gradle @@ -0,0 +1,33 @@ +apply plugin: "com.jfrog.artifactory" + +def isSnapshot = version?.matches(/^.*[.-]BUILD-SNAPSHOT$/) + +artifactory { + contextUrl = 'https://repo.spring.io' + publish { + repository { + repoKey = isSnapshot ? 'libs-snapshot-local' : 'libs-release-local' + if(project.hasProperty('artifactoryUsername')) { + username = artifactoryUsername + password = artifactoryPassword + } + } + } +} + +artifactoryPublish { + publishConfigs 'archives' + publishIvy false + properties = [ + 'bintray.package': "${project.group}:spring-security", + 'bintray.version': "${project.version}" + ] +} + +artifactory { + publish { + defaults { + publishConfigs('archives') + } + } +} diff --git a/gradle/deploy-artifacts.gradle b/gradle/deploy-artifacts.gradle new file mode 100644 index 0000000000..199b48231c --- /dev/null +++ b/gradle/deploy-artifacts.gradle @@ -0,0 +1,11 @@ +def isSnapshot = version?.matches(/^.*[.-]BUILD-SNAPSHOT$/) + +task deployArtifacts { + group = 'Deploy tasks' + description = "Deploys the artifacts to either Artifactory or Maven Central" + if(isSnapshot) { + dependsOn "artifactoryPublish" + } else { + dependsOn "uploadArchives" + } +} diff --git a/gradle/deploy-docs.gradle b/gradle/deploy-docs.gradle new file mode 100644 index 0000000000..dec4b6d1ea --- /dev/null +++ b/gradle/deploy-docs.gradle @@ -0,0 +1,46 @@ +apply plugin: 'org.hidetake.ssh' + +project.ssh.settings { + knownHosts = allowAnyHosts +} + +project.remotes { + docs { + role 'docs' + host = 'docs.af.pivotal.io' + user = project.findProperty('deployDocsSshUsername') + if(project.hasProperty('deployDocsSshKeyPath')) { + identity = project.file(project.findProperty('deployDocsSshKeyPath')) + } + if(project.hasProperty('deployDocsSshPassphrase')) { + passphrase = project.findProperty('deployDocsSshPassphrase') + } + } +} + +project.task('deployDocs') { + dependsOn 'docsZip' + doFirst { + project.ssh.run { + session(project.remotes.docs) { + def now = System.currentTimeMillis() + def name = project.rootProject.name + def version = project.rootProject.version + def tempPath = "/tmp/${name}-${now}-docs".replaceAll(' ', '_') + execute "mkdir -p $tempPath" + + project.tasks.docsZip.outputs.each { o -> + put from: o.files, into: tempPath + } + + execute "unzip $tempPath/*.zip -d $tempPath" + + def extractPath = "/var/www/domains/springsource.org/www/htdocs/autorepo/docs/${name}/${version}/" + + execute "rm -rf $extractPath" + execute "mkdir -p $extractPath" + execute "mv $tempPath/* $extractPath" + } + } + } +} diff --git a/gradle/deploy-schema.gradle b/gradle/deploy-schema.gradle new file mode 100644 index 0000000000..39c37023b9 --- /dev/null +++ b/gradle/deploy-schema.gradle @@ -0,0 +1,50 @@ +apply plugin: 'org.hidetake.ssh' + +project.ssh.settings { + knownHosts = allowAnyHosts +} + +project.remotes { + docs { + role 'docs' + host = 'docs.af.pivotal.io' + user = project.findProperty('deployDocsSshUsername') + if(project.hasProperty('deployDocsSshKeyPath')) { + identity = project.file(project.findProperty('deployDocsSshKeyPath')) + } + if(project.hasProperty('deployDocsSshPassphrase')) { + passphrase = project.findProperty('deployDocsSshPassphrase') + } + } +} + +project.task('deploySchema') { + dependsOn 'schemaZip' + doFirst { + project.ssh.run { + session(project.remotes.docs) { + def now = System.currentTimeMillis() + def name = project.rootProject.name + def version = project.rootProject.version + def tempPath = "/tmp/${name}-${now}-schema".replaceAll(' ', '_') + + execute "mkdir -p $tempPath" + + project.tasks.schemaZip.outputs.each { o -> + println "Putting $o.files" + put from: o.files, into: tempPath + } + + execute "unzip $tempPath/*.zip -d $tempPath" + + def extractPath = "/var/www/domains/springsource.org/www/htdocs/autorepo/schema/${name}/${version}/" + + execute "rm -rf $extractPath" + execute "mkdir -p $extractPath" + execute "rm -f $tempPath*.zip" + execute "rm -rf $extractPath*" + execute "mv $tempPath/* $extractPath" + } + } + } +} diff --git a/gradle/finalize-deploy.gradle b/gradle/finalize-deploy.gradle new file mode 100644 index 0000000000..1e6ab3f6f0 --- /dev/null +++ b/gradle/finalize-deploy.gradle @@ -0,0 +1,13 @@ +def isSnapshot = version?.matches(/^.*[.-]BUILD-SNAPSHOT$/) +def isRelease = !isSnapshot + +task finalizeDeployArtifacts { +} + +if (isRelease && project.hasProperty("ossrhUsername")) { + project.ext.nexusUsername = project.ossrhUsername + project.ext.nexusPassword = project.ossrhPassword + project.getPluginManager().apply("io.codearte.nexus-staging") + finalizeDeployArtifacts.dependsOn project.tasks.closeAndReleaseRepository + project.nexusStaging.packageGroup = 'org.springframework' +} diff --git a/gradle/ossrh.gradle b/gradle/ossrh.gradle new file mode 100644 index 0000000000..926efa5b7a --- /dev/null +++ b/gradle/ossrh.gradle @@ -0,0 +1,45 @@ +def isSnapshot = version?.matches(/^.*[.-]BUILD-SNAPSHOT$/) +def isRelease = !isSnapshot + +if(project.hasProperty("signing.keyId") && isRelease) { + sign(project) +} + +if(project.hasProperty('ossrhUsername')) { + uploadArchives { + repositories { + mavenDeployer { + repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { + authentication(userName: project.ossrhUsername, password: project.ossrhPassword) + } + + snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { + authentication(userName: project.ossrhUsername, password: project.ossrhPassword) + } + } + } + } +} + +def sign(Project project) { + project.install { + repositories { + mavenDeployer { + beforeDeployment { MavenDeployment deployment -> project.signing.signPom(deployment) } + } + } + } + + project.uploadArchives { + repositories { + mavenDeployer { + beforeDeployment { MavenDeployment deployment -> project.signing.signPom(deployment) } + } + } + } + + project.signing { + required { project.gradle.taskGraph.hasTask("uploadArchives") } + sign project.configurations.archives + } +}