Skip to content

Commit 6a1fc51

Browse files
jimschubertwing328
authored andcommitted
[gradle] Reworking publishing pipeline (#2886)
* [gradle] Reworking publishing pipeline TravisCI proxies separate external requests with different orginating IP addresses, while Sonatype associates artifacts for auto-generated repositories by IP address. This leads to many gradle deploys from CI resulting in "split" staging repositories with no way to combine in Sonatype Nexus. This introduces a workflow which should resolve this issue on the next revision release. Specifically, nexus-publish-plugin is included to create singular staging repositories from TravisCI and gradle-nexus-staging-plugin is included to auto-release and promote this repository. NOTE: We need to publish via publishPluginMavenPublicationToNexusRepository, because publishToNexus will publish _all_ publish-related tasks, including the one intended only for the Gradle Plugin Portal. Tested in standalone open source Nexus Repo Manager, which doesn't support the staging plugin. So, only SNAPSHOT workflow has been validated locally. * Change the 'publish' task to 'publishToMavenLocal' in the helper pom.xml * Add condition on signing and be explicit about sources/javadoc artifacts * Call close/closeAndReleaseRepository * Reuse same closeAndReleaseRepository for SNAPSHOT + releases using a task guard, and publish to Gradle Plugin portal only on tagged build. * Add v prefix for tag check.
1 parent c509d98 commit 6a1fc51

File tree

4 files changed

+100
-87
lines changed

4 files changed

+100
-87
lines changed

.travis.yml

+15-7
Original file line numberDiff line numberDiff line change
@@ -133,24 +133,32 @@ script:
133133
- mvn --quiet --batch-mode --show-version verify -Psamples
134134
after_success:
135135
# push to maven repo
136-
- if [ $SONATYPE_USERNAME ] && [ -z $TRAVIS_TAG ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
137-
if [ "$TRAVIS_BRANCH" = "master" ]; then
136+
- if [ $SONATYPE_USERNAME ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
137+
if [ "$TRAVIS_BRANCH" = "master" ] && [ -z $TRAVIS_TAG ]; then
138+
echo "Publishing from branch $TRAVIS_BRANCH";
138139
mvn clean deploy -DskipTests=true -B -U -P release --settings CI/settings.xml;
139140
echo "Finished mvn clean deploy for $TRAVIS_BRANCH";
140141
pushd .;
141142
cd modules/openapi-generator-gradle-plugin;
142-
./gradlew -Psigning.keyId="$SIGNING_KEY" -Psigning.password="$SIGNING_PASSPHRASE" -Psigning.secretKeyRingFile="${TRAVIS_BUILD_DIR}/sec.gpg" -PossrhUsername="${SONATYPE_USERNAME}" -PossrhPassword="${SONATYPE_PASSWORD}" uploadArchives --no-daemon;
143-
echo "Finished ./gradlew uploadArchives";
143+
./gradlew -Psigning.keyId="$SIGNING_KEY" -Psigning.password="$SIGNING_PASSPHRASE" -Psigning.secretKeyRingFile="${TRAVIS_BUILD_DIR}/sec.gpg" -PossrhUsername="${SONATYPE_USERNAME}" -PossrhPassword="${SONATYPE_PASSWORD}" publishPluginMavenPublicationToNexusRepository closeAndReleaseRepository --no-daemon;
144+
echo "Finished ./gradlew publishPluginMavenPublicationToNexusRepository closeAndReleaseRepository";
144145
popd;
145-
elif ([[ "$TRAVIS_BRANCH" =~ ^[0-9]+\.[0-9]+\.x$ ]]) ; then
146+
elif [ -z $TRAVIS_TAG ] && [[ "$TRAVIS_BRANCH" =~ ^[0-9]+\.[0-9]+\.x$ ]]; then
147+
echo "Publishing from branch $TRAVIS_BRANCH";
146148
mvn clean deploy --settings CI/settings.xml;
147149
echo "Finished mvn clean deploy for $TRAVIS_BRANCH";
148150
pushd .;
149151
cd modules/openapi-generator-gradle-plugin;
152+
./gradlew -PossrhUsername="${SONATYPE_USERNAME}" -PossrhPassword="${SONATYPE_PASSWORD}" publishPluginMavenPublicationToNexusRepository closeAndReleaseRepository --no-daemon;
153+
echo "Finished ./gradlew publishPluginMavenPublicationToNexusRepository closeAndReleaseRepository";
154+
popd;
155+
fi;
156+
if [ -n $TRAVIS_TAG ] && [[ "$TRAVIS_TAG" =~ ^[v][0-9]+\.[0-9]+\.[0-9]+$ ]]; then
157+
echo "Publishing the gradle plugin to Gradle Portal on tag $TRAVIS_TAG (only)";
158+
pushd .;
159+
cd modules/openapi-generator-gradle-plugin;
150160
./gradlew -Psigning.keyId="$SIGNING_KEY" -Psigning.password="$SIGNING_PASSPHRASE" -Psigning.secretKeyRingFile="${TRAVIS_BUILD_DIR}/sec.gpg" publishPlugins -Dgradle.publish.key=$GRADLE_PUBLISH_KEY -Dgradle.publish.secret=$GRADLE_PUBLISH_SECRET --no-daemon;
151161
echo "Finished ./gradlew publishPlugins (plugin portal)";
152-
./gradlew -PossrhUsername="${SONATYPE_USERNAME}" -PossrhPassword="${SONATYPE_PASSWORD}" uploadArchives --no-daemon;
153-
echo "Finished ./gradlew uploadArchives";
154162
popd;
155163
fi;
156164
fi;
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
buildscript {
2-
ext.kotlin_version = '1.2.60'
2+
ext.kotlin_version = '1.2.61'
33
repositories {
44
mavenCentral()
55
maven {
@@ -11,14 +11,13 @@ buildscript {
1111
maven {
1212
url "https://oss.sonatype.org/content/repositories/snapshots/"
1313
}
14-
maven {
15-
url "https://plugins.gradle.org/m2/"
16-
}
1714
}
1815
dependencies {
1916
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
2017
classpath "gradle.plugin.org.gradle.kotlin:gradle-kotlin-dsl-plugins:1.0-rc-3"
2118
classpath "com.gradle.publish:plugin-publish-plugin:0.10.1"
19+
classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.20.0"
20+
classpath "de.marcphilipp.gradle:nexus-publish-plugin:0.2.0"
2221
}
2322
}
2423

@@ -35,10 +34,11 @@ ext.isReleaseVersion = !version.endsWith("SNAPSHOT")
3534

3635
apply plugin: 'com.gradle.plugin-publish'
3736
apply plugin: 'java-gradle-plugin'
38-
apply plugin: 'maven'
3937
apply plugin: 'signing'
4038
apply plugin: 'kotlin'
4139
apply plugin: "org.gradle.kotlin.kotlin-dsl"
40+
apply plugin: 'io.codearte.nexus-staging'
41+
apply plugin: "de.marcphilipp.nexus-publish"
4242

4343
sourceCompatibility = 1.8
4444
targetCompatibility = 1.8
@@ -87,6 +87,65 @@ test {
8787
}
8888
}
8989

90+
task javadocJar(type: Jar) {
91+
from javadoc
92+
classifier = 'javadoc'
93+
}
94+
95+
task sourcesJar(type: Jar) {
96+
from sourceSets.main.allSource
97+
classifier = 'sources'
98+
}
99+
100+
publishing {
101+
publications {
102+
mavenJava(MavenPublication) {
103+
from components.java
104+
artifact sourcesJar
105+
artifact javadocJar
106+
pom {
107+
name = 'OpenAPI-Generator Contributors'
108+
description = project.description
109+
url = 'https://openapi-generator.tech'
110+
organization {
111+
name = 'org.openapitools'
112+
url = 'https://github.com/OpenAPITools'
113+
}
114+
licenses {
115+
license {
116+
name = "The Apache Software License, Version 2.0"
117+
url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
118+
distribution = "repo"
119+
}
120+
}
121+
developers {
122+
developer {
123+
id = "openapitools"
124+
name = "OpenAPI-Generator Contributors"
125+
126+
}
127+
}
128+
scm {
129+
url = 'https://github.com/OpenAPITools/openapi-generator'
130+
connection = 'scm:git:git://github.com/OpenAPITools/openapi-generator.git'
131+
developerConnection = 'scm:git:ssh://[email protected]:OpenAPITools/openapi-generator.git'
132+
}
133+
issueManagement {
134+
system = 'GitHub'
135+
url = 'https://github.com/OpenAPITools/openapi-generator/issues'
136+
}
137+
}
138+
}
139+
}
140+
}
141+
142+
nexusPublishing {
143+
username = ossrhUsername
144+
password = ossrhPassword
145+
stagingProfileId = "org.openapitools"
146+
packageGroup = "org.openapitools"
147+
}
148+
90149
gradlePlugin {
91150
plugins {
92151
openApiGenerator {
@@ -109,6 +168,7 @@ pluginBundle {
109168
displayName = 'OpenAPI Generator Gradle Plugin'
110169
tags = ['openapi-3.0', 'openapi-2.0', 'openapi', 'swagger', 'codegen', 'sdk']
111170
version = "$openApiGeneratorVersion"
171+
group = "org.openapitools"
112172
}
113173
}
114174
}
@@ -119,79 +179,8 @@ pluginBundle {
119179
// or stored as key=value pairs in ~/.gradle/gradle.properties
120180
// You can also apply them in CI via environment variables. See Gradle's docs for details.
121181
signing {
122-
required { isReleaseVersion && gradle.taskGraph.hasTask("uploadArchives") }
123-
sign configurations.archives
124-
}
125-
126-
task javadocJar(type: Jar) {
127-
classifier = 'javadoc'
128-
from javadoc
129-
}
130-
131-
task sourcesJar(type: Jar) {
132-
from sourceSets.main.allSource
133-
classifier = 'sources'
134-
}
135-
136-
artifacts {
137-
archives javadocJar, sourcesJar
138-
}
139-
140-
def pomConfig = {
141-
description project.description
142-
name 'OpenAPI-Generator Contributors'
143-
url 'https://openapi-generator.tech'
144-
organization {
145-
name 'org.openapitools'
146-
url 'https://github.com/OpenAPITools'
147-
}
148-
licenses {
149-
license {
150-
name "The Apache Software License, Version 2.0"
151-
url "http://www.apache.org/licenses/LICENSE-2.0.txt"
152-
distribution "repo"
153-
}
154-
}
155-
developers {
156-
developer {
157-
id "openapitools"
158-
name "OpenAPI-Generator Contributors"
159-
160-
}
161-
}
162-
scm {
163-
url 'https://github.com/OpenAPITools/openapi-generator'
164-
connection 'scm:git:git://github.com/OpenAPITools/openapi-generator.git'
165-
developerConnection 'scm:git:ssh://[email protected]:OpenAPITools/openapi-generator.git'
166-
}
167-
issueManagement {
168-
system 'GitHub'
169-
url 'https://github.com/OpenAPITools/openapi-generator/issues'
170-
}
171-
}
172-
173-
uploadArchives {
174-
repositories {
175-
176-
// credentials here would need to be passed along with the gradle command:
177-
// ./gradlew -P ossrhUsername=yourUser
178-
// or stored in ~/.gradle/gradle.properties as key=value pairs
179-
mavenDeployer {
180-
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
181-
repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
182-
authentication(userName: ossrhUsername, password: ossrhPassword)
183-
}
184-
snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
185-
authentication(userName: ossrhUsername, password: ossrhPassword)
186-
}
187-
188-
pom.withXml {
189-
def root = asNode()
190-
root.appendNode('description', project.description)
191-
root.children().last() + pomConfig
192-
}
193-
}
194-
}
182+
required { isReleaseVersion && (gradle.taskGraph.hasTask("publishPluginMavenPublicationToNexusRepository") ) }
183+
sign publishing.publications.mavenJava
195184
}
196185

197186
compileKotlin {
@@ -205,4 +194,19 @@ compileTestKotlin {
205194
}
206195
}
207196

208-
uploadArchives.dependsOn 'check'
197+
javadoc {
198+
if(JavaVersion.current().isJava9Compatible()) {
199+
options.addBooleanOption('html5', true)
200+
}
201+
}
202+
203+
tasks {
204+
closeRepository {
205+
onlyIf { nexusPublishing.useStaging.get() }
206+
}
207+
releaseRepository{
208+
onlyIf { nexusPublishing.useStaging.get() }
209+
}
210+
}
211+
212+
publishToNexus.dependsOn 'check'

modules/openapi-generator-gradle-plugin/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
<!-- calls "clean assemble install" -->
7373
<task>clean</task>
7474
<task>assemble</task>
75-
<task>install</task>
75+
<task>publishToMavenLocal</task>
7676
</tasks>
7777
</configuration>
7878
</execution>
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
rootProject.name = 'openapi-generator-gradle-plugin'
2+
enableFeaturePreview('STABLE_PUBLISHING')
23

0 commit comments

Comments
 (0)