瀏覽代碼

Add Deploy Artifacts Support

Fixes gh-7939
Rob Winch 5 年之前
父節點
當前提交
ba4953b057

+ 3 - 0
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

+ 8 - 2
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'
 

+ 3 - 0
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
 			}
 		}

+ 33 - 0
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')
+		}
+	}
+}

+ 11 - 0
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"
+	}
+}

+ 46 - 0
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"
+			}
+		}
+	}
+}

+ 50 - 0
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"
+			}
+		}
+	}
+}

+ 13 - 0
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'
+}

+ 45 - 0
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
+	}
+}