From 5a332f3c57546b0797c8b982f57c3a319f74a324 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Sat, 9 Jun 2018 14:21:31 -0400 Subject: [PATCH] [gradle] Plugin release management (#201) * [gradle] Plugin release management This applies steps necessary for publishing to Sonatype, including sources, javadoc, jar and signing. Also includes full POM details, per Sonatype requirements. * Properties placeholders in gradle plugin (should allow users without these settings to build locally) * Update build wrapper for install task to be used with new maven plugin, not maven-publish plugin * Add code signing for gradle and maven --- .gitignore | 1 + .travis.yml | 20 +++- CI/settings.xml | 14 ++- .../build.gradle | 88 +++++++++++++++++- .../gradle.properties | 9 ++ .../openapi-generator-gradle-plugin/pom.xml | 6 +- .../samples/local-spec/build.gradle | 6 ++ pom.xml | 40 ++++++++ sec.gpg.enc | Bin 0 -> 5664 bytes 9 files changed, 173 insertions(+), 11 deletions(-) create mode 100644 sec.gpg.enc diff --git a/.gitignore b/.gitignore index 4db9651afa2..c33eae088e1 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ out/ *.ipr *.iws +*.gpg classpath.txt version.properties !modules/openapi-generator-cli/src/main/resources/version.properties diff --git a/.travis.yml b/.travis.yml index 3b4fa068926..bca3beb431d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,8 +9,9 @@ cache: - $HOME/.ivy2 - $HOME/.gradle/caches/ - $HOME/.gradle/wrapper/ + - $HOME/samples/client/petstore/javascript/node_modules - $HOME/samples/client/petstore/php/OpenAPIToolsClient-php/vendor - - $HOME/samples/client/petstore/ruby/venodr/bundle + - $HOME/samples/client/petstore/ruby/vendor/bundle - $HOME/samples/client/petstore/python/.venv/ - $HOME/samples/client/petstore/typescript-node/npm/node_modules - $HOME/samples/client/petstore/typescript-node/npm/typings/ @@ -26,6 +27,10 @@ cache: - $HOME/samples/client/petstore/typescript-angular/typings - $HOME/perl5 +# Don't cache artifacts installed by this build. +before_cache: + - rm -rf $HOME/.m2/repository/org/openapitools + services: - docker @@ -72,6 +77,8 @@ before_install: - cat /etc/hosts # show java version - java -version + - openssl aes-256-cbc -K $encrypted_6e2c8bba47c6_key -iv $encrypted_6e2c8bba47c6_iv -in sec.gpg.enc -out sec.gpg -d + - gpg --keyserver pgp.mit.edu --recv-key $SIGNING_KEY install: # Add Godeps dependencies to GOPATH and PATH @@ -93,10 +100,15 @@ script: - mvn --quiet clean install - mvn --quiet verify -Psamples after_success: - # push a snapshot version to maven repo - - if [ $SONATYPE_USERNAME ] && [ -z $TRAVIS_TAG ] && [ "$TRAVIS_BRANCH" = "master" ]; then - mvn clean deploy --settings CI/settings.xml; + # push to maven repo + - if [ $SONATYPE_USERNAME ] && [ -z $TRAVIS_TAG ] && [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then + mvn clean deploy -DskipTests=true -B -U -P release --settings CI/settings.xml; echo "Finished mvn clean deploy for $TRAVIS_BRANCH"; + pushd . + cd modules/openapi-generator-gradle-plugin + ./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 + echo "Finished ./gradlew uploadArchives" + popd fi; ## docker: build and push openapi-generator-online to DockerHub - if [ $DOCKER_HUB_USERNAME ]; then echo "$DOCKER_HUB_PASSWORD" | docker login --username=$DOCKER_HUB_USERNAME --password-stdin && docker build -t $DOCKER_GENERATOR_IMAGE_NAME ./modules/openapi-generator-online && if [ ! -z "$TRAVIS_TAG" ]; then docker tag $DOCKER_GENERATOR_IMAGE_NAME:latest $DOCKER_GENERATOR_IMAGE_NAME:$TRAVIS_TAG; fi && if [ ! -z "$TRAVIS_TAG" ] || [ "$TRAVIS_BRANCH" = "master" ]; then docker push $DOCKER_GENERATOR_IMAGE_NAME && echo "Pushed to $DOCKER_GENERATOR_IMAGE_NAME"; fi; fi diff --git a/CI/settings.xml b/CI/settings.xml index ca9d5bd69eb..027d195c174 100644 --- a/CI/settings.xml +++ b/CI/settings.xml @@ -13,6 +13,18 @@ - + + + release + + true + + + gpg + ${env.SIGNING_KEY} + ${env.SIGNING_PASSPHRASE} + + + diff --git a/modules/openapi-generator-gradle-plugin/build.gradle b/modules/openapi-generator-gradle-plugin/build.gradle index 9392744804b..25fb2b73039 100644 --- a/modules/openapi-generator-gradle-plugin/build.gradle +++ b/modules/openapi-generator-gradle-plugin/build.gradle @@ -21,9 +21,11 @@ This plugin supports common functionality found in Open API Generator CLI as a g This gives you the ability to generate client SDKs, documentation, new generators, and to validate Open API 2.0 and 3.x specifications as part of your build. Other tasks are available as command line tasks. """ +ext.isReleaseVersion = !version.endsWith("SNAPSHOT") apply plugin: 'java-gradle-plugin' -apply plugin: 'maven-publish' +apply plugin: 'maven' +apply plugin: 'signing' apply plugin: 'kotlin' apply plugin: "org.gradle.kotlin.kotlin-dsl" @@ -67,7 +69,6 @@ test { } } - gradlePlugin { plugins { openApiGenerator { @@ -77,6 +78,87 @@ gradlePlugin { } } +// signing will require three keys to be defined: signing.keyId, signing.password, and signing.secretKeyRingFile. +// These can be passed to the gradle command: +// ./gradlew -Psigning.keyId=yourid +// or stored as key=value pairs in ~/.gradle/gradle.properties +// You can also apply them in CI via environment variables. See Gradle's docs for details. +signing { + required { isReleaseVersion && gradle.taskGraph.hasTask("uploadArchives") } + sign configurations.archives +} + +task javadocJar(type: Jar) { + classifier = 'javadoc' + from javadoc +} + +task sourcesJar(type: Jar) { + from sourceSets.main.allSource + classifier = 'sources' +} + +artifacts { + archives javadocJar, sourcesJar +} + +def pomConfig = { + description project.description + name 'OpenAPI-Generator Contributors' + url 'https://openapi-generator.tech' + organization { + name 'org.openapitools' + url 'https://github.com/OpenAPITools' + } + licenses { + license { + name "The Apache Software License, Version 2.0" + url "http://www.apache.org/licenses/LICENSE-2.0.txt" + distribution "repo" + } + } + developers { + developer { + id "openapitools" + name "OpenAPI-Generator Contributors" + email "team@openapitools.org" + } + } + scm { + url 'https://github.com/OpenAPITools/openapi-generator' + connection 'scm:git:git://github.com/OpenAPITools/openapi-generator.git' + developerConnection 'scm:git:ssh://git@github.com:OpenAPITools/openapi-generator.git' + } + issueManagement { + system 'GitHub' + url 'https://github.com/OpenAPITools/openapi-generator/issues' + } +} + +uploadArchives { + repositories { + + // credentials here would need to be passed along with the gradle command: + // ./gradlew -P ossrhUsername=yourUser + // or stored in ~/.gradle/gradle.properties as key=value pairs + mavenDeployer { + beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } + repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { + authentication(userName: ossrhUsername, password: ossrhPassword) + } + snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { + authentication(userName: ossrhUsername, password: ossrhPassword) + } + + pom.withXml { + def root = asNode() + root.appendNode('description', project.description) + root.children().last() + pomConfig + } + } + } +} + compileKotlin { kotlinOptions { jvmTarget = "1.8" @@ -86,4 +168,4 @@ compileTestKotlin { kotlinOptions { jvmTarget = "1.8" } -} \ No newline at end of file +} diff --git a/modules/openapi-generator-gradle-plugin/gradle.properties b/modules/openapi-generator-gradle-plugin/gradle.properties index cd288d87a9a..d4f55303ad5 100644 --- a/modules/openapi-generator-gradle-plugin/gradle.properties +++ b/modules/openapi-generator-gradle-plugin/gradle.properties @@ -1 +1,10 @@ openApiGeneratorVersion=3.0.1-SNAPSHOT + +# BEGIN placeholders +# these are just placeholders to allow contributors to build directly +ossrhUsername=user +ossrhPassword=pass +signing.keyId=unset +signing.password=unset +# signing.secretKeyRingFile=unset +# END placeholders diff --git a/modules/openapi-generator-gradle-plugin/pom.xml b/modules/openapi-generator-gradle-plugin/pom.xml index 6f188214b08..23785b6ad0e 100644 --- a/modules/openapi-generator-gradle-plugin/pom.xml +++ b/modules/openapi-generator-gradle-plugin/pom.xml @@ -56,10 +56,10 @@ - + clean - build - publishToMavenLocal + assemble + install diff --git a/modules/openapi-generator-gradle-plugin/samples/local-spec/build.gradle b/modules/openapi-generator-gradle-plugin/samples/local-spec/build.gradle index 52f80315398..a0f00237d8a 100644 --- a/modules/openapi-generator-gradle-plugin/samples/local-spec/build.gradle +++ b/modules/openapi-generator-gradle-plugin/samples/local-spec/build.gradle @@ -5,6 +5,12 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } + maven { + url "https://oss.sonatype.org/content/repositories/releases/" + } + maven { + url "https://oss.sonatype.org/content/repositories/snapshots/" + } } dependencies { classpath "org.openapitools:openapi-generator-gradle-plugin:3.0.0-SNAPSHOT" diff --git a/pom.xml b/pom.xml index 27eed456e7c..f1a652a06dc 100644 --- a/pom.xml +++ b/pom.xml @@ -60,6 +60,12 @@ github https://github.com/openapitools/openapi-generator/issues + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + Apache License 2.0 @@ -279,6 +285,40 @@ + + + release + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + sign-artifacts + verify + + sign + + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.8 + true + + ossrh + https://oss.sonatype.org/ + true + + + + + + release-profile diff --git a/sec.gpg.enc b/sec.gpg.enc new file mode 100644 index 0000000000000000000000000000000000000000..e5594adbd4d8a33255e8e1ce050d18aa620137cf GIT binary patch literal 5664 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