Skip to content

Commit

Permalink
Publish to Maven Central
Browse files Browse the repository at this point in the history
  • Loading branch information
jmewes committed Mar 11, 2021
1 parent bf19039 commit 3d9bdeb
Show file tree
Hide file tree
Showing 10 changed files with 163 additions and 70 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
*.gpg

.gradle/
.*
!.gitignore
Expand Down
22 changes: 17 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
dist: trusty
language: java
jdk:
- openjdk8
Expand All @@ -6,12 +7,23 @@ cache:
directories:
- "$HOME/.gradle"
install: true
script: "./gradlew clean build jacocoTestReport coveralls"
script:
- ./ci_build.sh
before_install:
- openssl aes-256-cbc -K $encrypted_c2f58914b0fd_key -iv $encrypted_c2f58914b0fd_iv -in secret-keys.gpg.enc -out secret-keys.gpg -d
after_success:
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then ./publish.sh; fi
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then ./ci_publish.sh; fi
env:
global:
- CI_NAME=travis-ci
- secure: "eIA27RK7BgAcOuyRFKWqN7V8T3Ta5ZcqYPU3NTrg26ljesZLp9kdtdpjxcW+wyhca8ilHG1x/ci+kfSmnxTIrxohfAsPMqCmK0QBxX5CH2b91DxrsadyPMpn602wVU4z/L8POgYnlK+JHS2EO7ZurazkdQtlJ5BFIW7uw4L9rxvU4MWVK3D6zEKX9n0dSRgy+B1zriD9ujok1WaEEVnvjDOxblemYGAOsOl+zyvB+3SfUZ/lgXLFjEgDoHx2MinEtmMT5hX+Hzpd333XrQ8TOTO45LVsZyQnkyMPO9xo6OiFUh5vbNyjRomSVx1jdIGfXE00SkudCCLSeiWtvWHc+xrZ3AboabEgFU5vUwSKyL2uCc/7MeRZI38ZSla4d7QH0zWULDJkF6UgH7GwuYlYmUwhYAnVxUMsaGceGN9ucf3S0YuL1yF3qCbRzKiADrdPxXYJ64kt7yJZsXW6Xv0maFem/zVq2kZJHvSuTbpiWZ2tthTgEMgdTL0Yat9l2umNYGFjuLLcuDndwRLwYyjwgL/M7xhuMK0SlpNI0xBgnUqxi42zH/yKR5A+kWxbC567SxVDPVyOp3sooU1A83AB2sCobsfnywTIV9IwvPtVUE6XPFFvXuasS6p8ZnIHk+RPMBp2CKzJEMGRiMKBH1+uJOpfW2aLlBd6QOqxzMjg1IM=" # coveralls
- secure: "Kor77MWuy1BhEvjjs84F6bOksF9DVsFduIhcWYvFFivqoFL4GyL34KOFHjhQRZEl5sfjSNQO07qdKNzCNJLAWS6x9jJczBhkRdl2zaGSywRyMHFgwnvosajR8rSNvaCu61JC12Wpge8lA8+NbO9p887LufFG/dPWY1lKVINaC1LKqUW91draP51G03UGJnCCh1mjWSB39hOoHmkVvA+db6/99ow9hunDwCadGh1T7beQy/WFSrMN40iNBAGe/1Cc2bp8f8sCknCI9jzX9GRjA6BtTCip9ZstNvI9CSCrUHDKccNoi7sibsZM8RvacFV+uVbfb2pnCo58nnIylts2JEJ52TSDUj0sHRDonlCkO4ppAPETQr0BjHB+f9wWE7o7uDBcTVZNV2t1C0nix13XrKyj7W/5f5uEtqwblKtJQZynHnkJ1HVwlQ3gsQc+3SiGtmriAjFLO00YRyUb1WP3WS7mKyly7kwCHY6t5/iQhuqD7D7nXTHo9V2FAcS/5pW7Hov7XuHwj7N9STP6/wDgYPkERgQlCNVk2MFjp+Rgpq3s6P8DzgUjtAvKg5XyOQVYmdjA8+DiEnJ42VTKDNLV37/d6dlHlnS2OocpB9u7SmGC+Kc8lnX5pk1Yf4eReNz4V2AwXuRw/M275OwW9QGGAHCOoDCsafDNYtnGyi32INQ=" # bintray
- secure: "kmGxa9Lozos4g4Y9OqPgxlz5OUJobtIlQjeTTun9RcB5FxUcyV/nxVSrc/yw00k2BwiD70DfB1Ajzwm6mYcpQYe/eTB5soiPfsFZhGDRhFzkvP5HOkvHbAUp0CgwvgaGAaLXg+lb3Lxrdc2tn0AajRMlkXVTGGxDfwFXJAS6rBF855s/h/VqFdlw/BmXwbf625vBhRTZ7YHQ2oQJGTafQpYMf0UdedLcn58RrqRBDE+tCiH/GqTjABc22rDI2uAzoZICkdnuOwedGaX4HzEkjrTD9dkhA16D3zojgPXqiQLT+AihGbVqVenC6Vws7Zy8KEAgYrTrINLDcu2c2C9mHud3q9bcdzBFDqk2nC11KffUxgCDu//NTayTBx6TleGuN3py5RAWTnTalHt/Nf282Dmfd50HSrD4DvDnMmDP8sZOMTENM4H4rit49J+MbDPP/6SLbfKm4c9HsrFjVd3mKfJh3UHLGCYU0DO7/YZUd9HV9pn8vdpsckWby37JoQ/cYwEJgdXzumd9OPYgwIGnLVqWZxQV1aiOK+1umFCiF32522OE0CjPhfDWNNBfKZMTquXEC+lVIhzWeS7LRXI/B299WjEdmNUIdbDz1eSLV0eu0d4Vc9hznRWdWdlRkk0O+DuQg2RR/t/BpnuKRkycqYSe9Wexkd+fnXulR1Lsh54=" # bintray
- SIGNING_KEYRING_FILE="${TRAVIS_BUILD_DIR}/secret-keys.gpg"
# coveralls
- secure: "eIA27RK7BgAcOuyRFKWqN7V8T3Ta5ZcqYPU3NTrg26ljesZLp9kdtdpjxcW+wyhca8ilHG1x/ci+kfSmnxTIrxohfAsPMqCmK0QBxX5CH2b91DxrsadyPMpn602wVU4z/L8POgYnlK+JHS2EO7ZurazkdQtlJ5BFIW7uw4L9rxvU4MWVK3D6zEKX9n0dSRgy+B1zriD9ujok1WaEEVnvjDOxblemYGAOsOl+zyvB+3SfUZ/lgXLFjEgDoHx2MinEtmMT5hX+Hzpd333XrQ8TOTO45LVsZyQnkyMPO9xo6OiFUh5vbNyjRomSVx1jdIGfXE00SkudCCLSeiWtvWHc+xrZ3AboabEgFU5vUwSKyL2uCc/7MeRZI38ZSla4d7QH0zWULDJkF6UgH7GwuYlYmUwhYAnVxUMsaGceGN9ucf3S0YuL1yF3qCbRzKiADrdPxXYJ64kt7yJZsXW6Xv0maFem/zVq2kZJHvSuTbpiWZ2tthTgEMgdTL0Yat9l2umNYGFjuLLcuDndwRLwYyjwgL/M7xhuMK0SlpNI0xBgnUqxi42zH/yKR5A+kWxbC567SxVDPVyOp3sooU1A83AB2sCobsfnywTIV9IwvPtVUE6XPFFvXuasS6p8ZnIHk+RPMBp2CKzJEMGRiMKBH1+uJOpfW2aLlBd6QOqxzMjg1IM="
# SONATYPE_USERNAME
- secure: "l+LAlZDOO50tZTDfMa8DJVtlFj6PeQ+4i9pbo0UAQiLutJt/OQWcH30j0gEZ5LVufcrg71YDKQ95cB0crf8WJivsfY7xQMLdMniT3NNIqSkTI9nBMzeCyoBc36OWkxZlfjmz8NumpXlIk84ykP/j3wRkA7c8jy8MO084/XltaTOBHOR19cUFUGwXKXhgucI6arV107EwA9VsXv1Ed+9bjhIm534qb9E+gpk44xTNOTaLk6dMdz4Px5K7k0mrH2uPYDnJLzw3BE07HodxkfTrTrInXyH+f4hqw8VdQ3GzeYJ2zKseersthVlQkt6v/CuBE6warSve/yt31QupYAM0Ge4OMNI8O4DS3Lc8W4xOhk570knPgmAuFLXQyib8B6o52ciPiI0P+wB0HIXO0if46A7q2NDyBwGIRv4Q7aJ73PtI4IL3jro5d5UFIKBIMBn2hIDG5Dk9S+NMDn6MAOmNFJ4R3DbNPI09Ifb07nSJfIX/lhUZbXkYZS8uU9N555InZEqtjKDZuMjqHP3n4PL/U1a3RoKWDevgqcidQPllqXcXexx2wvo8RXYVD1YcQy8q/ZsDuZlIIsCfLmHfEHm+eKWKPpl/BHSChbD9jV+NIkpo7/vWA+DLSr8JMouuxa4XDokgkNW6r4fszwM8OXKcDI81e/h1N3uJamoXGhEn8k8="
# SONATYPE_PASSWORD
- secure: "ia1S1vro9qq8yobyoYqvmxVbQeeVbZRUhH+EOj6ZUZhB3N32rerAlZkA/G/fc4Et4+fB6TxcfaY06e2Fefq1WHmhVOGwgAnCSCJc1VQ+2jfiiXLrlxr8YX8L/tFCEYF5ePPmUQqR3qUwD2S5xJXAGNCu6jn+l+nzYFlW/XPrWVk12KP/2Gbsvo+PxngekgGYCtIU9MSJ8xL9ijIOTdP1+1qh87WhUAxBV3Q8l2+DbNtcpuFS53ID45FEU66o9wtysvTtDN7HR43tCiznqKWB2/QobENlxomE4/hDYkjq3TWEZ0diehVK/XN1Xl/L4D9HCf3ltz3zkdjUnGviSyy8xvZ+qcdHqkhcJqPDbufQZr5zd9pEGo8rqbWgBV/GoBh9aS2t/sRN3T6/5LiDwa7y5KXkwhjSGY55gYJc7WyPyXaV8LmU2BRd2CHW+B2JP3Zq1xCcatz+D9pmAxWXVBOztyfmFrqCFV/QXiW6CsIxuF684cuvh6LJ6xyC+2bDdTmmrDsdl7nwpD+w8zK6C2NYsLXUL4UPkf5c788jsB+ibyzv0wb001Khazwzn0/9EnoHD8XSbzsOFQMIWKWqq3D/Zv0dOaUqoiXmImsBAOz0dz0tPb+q+jwRpIS+8Q8XHC23zUjK58OUrP1mt73xyGOyWrV9zT60SPGQlaiFYLdQLIw="
# SIGNING_KEY_ID
- secure: "LKbkCPDhCOVnmqaO72aWCHtTFQzJsx3AWuVPkQsYrJb+OwmJO9gsB0p1yPKIJZGfJOrFxyiRJ0QrtBt+0wtiLLUS0iU9f9so/z4PCpSvsT5cABqS33JRRM5NqokhlyH/+leyR3NLKK/A41Flo/0htuYZ/avsFzX7VVISSZXYaMFRNy1+j+reAbH95Yz/R5E0IzF7rxIgniRDqZ4oo0d4OeqOoWSOGt2oPLE55CArhL7MeUx4F8xSbDmkWQ+gP9zikq6KfLz7GlTKtJ+HpPNyJQvID3VUwIUYZqJcEdvoy7v+yEuw08PNR2RzEc6SrrckQSOI/dWEyJhj/8K9rJf8dDdTJ2CX4S+J1lc5bwXalgZr2goWK0RRzZVlaqpobkFofALrxTqxSnJzOXnyQkPoVIWASs6gMyYRV0T36cbCAkCUWmtdyPkUA5z+Ja0AWqsfDFRF5WGUHpvGAR2rklGoCBDJ5ijgdTZmkLqDUKUnMgGVBXQZ0FVBumY4P2dGac1x/PtTmbCZ8GXyxSrWzcZIW/J4N9SNN29eap6EmfN78kIhMOwoPjRII7dkZXrAMPz99+ribA1rDPB9k9YSEDYepgQF/DFaM79h11rx2s8GoVdMIa5wCyrwbK4AZ2XhmCgoU0DKwjlxCKd0Wr+1UhtlPt6b4/q/4pE6sC+Cnm6ni+0="
# SIGNING_PASSWORD
- secure: "ixVx7DbwtOslNK9NTSvLjOws64k6f748ST9koQq7hmbiBLWlavhfK7w1dkdbmbrTQClcitMxgKDyoFCodnxgC942bRkiwz8+1hxCHPIxupaIGFhJeZzit09fLoe4Quc8861jVL3Cu/JMhd5p0shkuhuMg9vdXpISPXyI7OaujKTZg+H2drCoUsPGKwHWeHMu5C7wLQoUZaHdyRPYgq6T/3Wz35CJn6Vgtduw9WuuPBxUfgIPKvU4soIX/vKumi10UChDQeYL+pjNy1lXYtBn+SWn5sfiekUeJbZJseVLsgbr0z5G9C4ACE7aR4u9o4WLBSVLISgxFqvY6PNqUjLJ9Fk6megCgp7+BxtScl9W3rJrUSBTuLysSvgF8GiIFyxWO5hZ4gMZ6O/0mYpnxIvnYibTKoc9hV/J0rbvhRlj2czmZD8i3ynqIQwXHxOF/l4Wo8DpG4oMHDGMYfe8IFTrEVrNszAKUqOp+gcMXRuK/ZOJQKbgwBVJTBi+2tm/irQ9FQyAhQL59CvNLW6rbHWGHDwxALKI2cHWThed5fGTXx686jesJTWOb8KcYaiUkoMzv9RxYpfi04cUcCzT1WtL3dQr4iXZVI36ZP8qnHCuPHWu50kcz8DCe3LgChWs01A7F61kLHYpJu087P18SAa3SQfN4dXzoyUEOufCZi9r2y0="
54 changes: 44 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,16 @@ Details and background information can be read on our [ePages Developer Blog](ht
<!-- /TOC -->
## Contents

This repository consists of four projects
This repository consists of two libraries:

* `restdocs-wiremock`: The library to extend Spring REST Docs with WireMock stub snippet generation.
* `restdocs-server`: A sample server documenting its REST API (i.e. the Spring REST Docs "notes" example).
Besides producing human-readable documentation it will also generate JSON snippets to be used as stubs for WireMock.
* `wiremock-spring-boot-starter`: A spring boot starter which adds a `WireMockServer` to your client's ApplicationContext for integration testing.
This is optional, but highly recommended when verifying your client contract in a SpringBootTest.

And two sample projects:

* `restdocs-server`: A sample server documenting its REST API (i.e. the Spring REST Docs "notes" example).
Besides producing human-readable documentation it will also generate JSON snippets to be used as stubs for WireMock.
* `restdocs-client`: A sample client using the server API, with integration testing its client contract against the stubs provided via WireMock.


Expand Down Expand Up @@ -334,6 +337,17 @@ public class MyTest {
## Building from source
This project uses JDK 8.
JDK 8 can be used via [SDKMAN!](https://sdkman.io/).
```
# (a) not installed, yet
sdk install java 8.0.282.j9-adpt
# (b) already installed
sdk use java 8.0.282.j9-adpt
```
Please execute at least step 1 + 2 if before importing restdocs-wiremock into your IDE.
1. Publish the current restdocs-wiremock library code into your local maven repository.
Expand All @@ -359,17 +373,37 @@ Please execute at least step 1 + 2 if before importing restdocs-wiremock into yo
## Publishing
This project makes use of the [axion-release-plugin](https://github.com/allegro/axion-release-plugin)
and publishing is automated in travis, when a new release is tagged in git.
Locally you should be able to create a new release by running the `release` task on gradle. A successful
travis build of this tag should finally end up on [bintray](https://bintray.com/epages/maven/restdocs-wiremock/).
Given that the `master` branch on the upstream repository is in the state from which you want to create a release, execute the following steps:
```shell
./gradlew clean build release
git checkout master
git pull upstream master
# Print current version to the terminal
./gradlew currentVersion
# (a) Release new patch version
./gradlew release -Prelease.versionIncrementer=incrementPatch
# (b) Release new minor version
./gradlew release -Prelease.versionIncrementer=incrementMajor
## (c) Release new major version
./gradlew release -Prelease.versionIncrementer=incrementMajor
# Print current version to the terminal
./gradlew currentVersion
```
TravisCI will then take care to call the Gradle tasks which upload the release to Sonatype.
A new staging repository will be create at [oss.sonatype.org](https://oss.sonatype.org/#stagingRepositories).
You need to login there, go to the latest staging repository, and then close and release the repository in the Sonatype UI.
(Once this process is working reliably we can also automate the final manual steps.)
## Other resources
- [gradle-nexus/publish-plugin](https://github.com/gradle-nexus/publish-plugin)
- [allegro/axion-release-plugin](https://axion-release-plugin.readthedocs.io)
- [Maven Publish Plugin](https://docs.gradle.org/current/userguide/publishing_maven.html)
- A similar approach is taken by [Spring Cloud Contract](https://cloud.spring.io/spring-cloud-contract/)
13 changes: 8 additions & 5 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@ buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0"
}
}

plugins {
id 'io.github.gradle-nexus.publish-plugin' version '1.0.0'
id 'pl.allegro.tech.build.axion-release' version '1.9.1'
id 'com.github.ben-manes.versions' version '0.20.0'
id 'publishing'
Expand All @@ -28,9 +26,14 @@ scmVersion {
}
}

group = 'com.epages'

allprojects {
project.version = scmVersion.version
}

publish.dependsOn(':restdocs-wiremock:bintrayUpload')
publish.dependsOn(':wiremock-spring-boot-starter:bintrayUpload')
nexusPublishing {
repositories {
sonatype ()
}
}
6 changes: 6 additions & 0 deletions ci_build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/bash
set -e # Exit with nonzero exit code if anything fails

./gradlew clean build jacocoTestReport coveralls \
--exclude-task signMavenJavaPublication \
--exclude-task signArchives
13 changes: 13 additions & 0 deletions ci_publish.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/bin/bash
set -e # Exit with nonzero exit code if anything fails

if [[ "$TRAVIS_TAG" =~ ^[0-9.]+ ]] ; then
./gradlew publishToSonatype \
--exclude-task :restdocs-server:publishToSonatype \
--info \
-Dorg.gradle.project.sonatypeUsername="${SONATYPE_USERNAME}" \
-Dorg.gradle.project.sonatypePassword="${SONATYPE_PASSWORD}" \
-Dorg.gradle.project.signing.keyId="${SIGNING_KEY_ID}" \
-Dorg.gradle.project.signing.password="${SIGNING_PASSWORD}" \
-Dorg.gradle.project.signing.secretKeyRingFile="${SIGNING_KEYRING_FILE}"
fi
6 changes: 0 additions & 6 deletions publish.sh

This file was deleted.

Binary file added secret-keys.gpg.enc
Binary file not shown.
59 changes: 37 additions & 22 deletions wiremock-spring-boot-starter/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,15 @@ buildscript {
}

plugins {
id 'eclipse'
id 'java'
id 'maven'
id 'maven-publish'
id 'eclipse'
id 'signing'
}

apply plugin: 'org.springframework.boot'

apply plugin: 'com.jfrog.bintray'

repositories {
jcenter()
}
Expand Down Expand Up @@ -47,28 +46,44 @@ publishing {
from components.java
artifactId 'wiremock-spring-boot-starter'
groupId = project.group

artifact sourceJar {
classifier 'sources'

pom {
name = 'WireMock Spring Boot Starter'
description = 'A Spring Boot Starter which adds a WireMockServer to your client\'s ApplicationContext for integration testing.'
url = 'https://github.com/ePages-de/restdocs-wiremock'
licenses {
license {
name = 'The Apache License, Version 2.0'
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id = 'ePages'
name = 'ePages Devs'
email = '[email protected]'
}
}
scm {
connection = 'scm:git:git://github.com:ePages-de/restdocs-wiremock.git'
developerConnection = 'scm:git:ssh://github.com:ePages-de/restdocs-wiremock.git'
url = 'https://github.com/ePages-de/restdocs-wiremock'
}
}
}
}
}

bintray {
user = project.findProperty('bintrayUser') ?: System.getenv('BINTRAY_USER')
key = project.findProperty('bintrayApiKey') ?: System.getenv('BINTRAY_API_KEY')
publications = ['mavenJava','sourceJar']
publish = true
pkg {
repo = "maven"
name = 'wiremock-spring-boot-starter'
userOrg = 'epages'
websiteUrl = 'https://github.com/ePages-de/restdocs-wiremock'
issueTrackerUrl = 'https://github.com/ePages-de/restdocs-wiremock/issues'
vcsUrl = 'https://github.com/ePages-de/restdocs-wiremock.git'
githubRepo = 'ePages-de/restdocs-wiremock'
githubReleaseNotesFile = 'README.md'
licenses = ['Apache-2.0']
}
java {
withSourcesJar()
withJavadocJar()
}

javadoc {
options.addStringOption('Xdoclint:none', '-quiet')
}

signing {
sign publishing.publications.mavenJava
sign configurations.archives
}
58 changes: 36 additions & 22 deletions wiremock/build.gradle
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
plugins {
id 'com.github.kt3k.coveralls' version '2.8.2'
id 'jacoco'
id 'java'
id 'maven'
id 'maven-publish'
id 'jacoco'
id 'com.github.kt3k.coveralls' version '2.8.2'
id 'signing'
}

apply plugin: 'com.jfrog.bintray'

repositories {
jcenter()
}
Expand Down Expand Up @@ -49,28 +48,43 @@ publishing {
artifactId 'restdocs-wiremock'
groupId = project.group

artifact sourceJar {
classifier 'sources'
pom {
name = 'REST Docs WireMock'
description = 'Spring REST Docs WireMock Integration'
url = 'https://github.com/ePages-de/restdocs-wiremock'
licenses {
license {
name = 'The Apache License, Version 2.0'
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id = 'ePages'
name = 'ePages Devs'
email = '[email protected]'
}
}
scm {
connection = 'scm:git:git://github.com:ePages-de/restdocs-wiremock.git'
developerConnection = 'scm:git:ssh://github.com:ePages-de/restdocs-wiremock.git'
url = 'https://github.com/ePages-de/restdocs-wiremock'
}
}
}
}
}

java {
withSourcesJar()
withJavadocJar()
}

bintray {
user = project.findProperty('bintrayUser') ?: System.getenv('BINTRAY_USER')
key = project.findProperty('bintrayApiKey') ?: System.getenv('BINTRAY_API_KEY')
publications = ['mavenJava','sourceJar']
publish = true
pkg {
repo = "maven"
name = 'restdocs-wiremock'
userOrg = 'epages'
websiteUrl = 'https://github.com/ePages-de/restdocs-wiremock'
issueTrackerUrl = 'https://github.com/ePages-de/restdocs-wiremock/issues'
vcsUrl = 'https://github.com/ePages-de/restdocs-wiremock.git'
githubRepo = 'ePages-de/restdocs-wiremock'
githubReleaseNotesFile = 'README.md'
licenses = ['Apache-2.0']
}
javadoc {
options.addStringOption('Xdoclint:none', '-quiet')
}

signing {
sign publishing.publications.mavenJava
sign configurations.archives
}

0 comments on commit 3d9bdeb

Please sign in to comment.