Reliable releasing to Maven Central from Travis using Gradle – 2019 edition
Make your (automatic) releasing to Maven Central from Travis (and not only) more reliable thanks to the explicit staging repository creation feature set implemented at the edge of 2018 and 2019.
Background
If you are only interested in getting information how to make your artifacts releasing more reliable from Travis, move forward to the another section.
Automatic artifacts releasing (using a staging repository and its promotion) from Gradle to Maven Central has been always tricky. The Nexus REST API related to those operations is very poorly documented. In addition, Gradle doesn’t natively support uploading artifacts to a dedicated staging repository even if it was already created explicitly. In the result a heuristic to determine which repository contains just uploaded artifacts has to be used, what brings some serious limitations. The apogee of the problems was to have Travis changes its architecture to more stateless in the late autumn of 2018. It caused the upload requests for particular artifacts to be routed via machines with different IP addresses, which resulted in multiple stating repositories created for a single gradle uploadArchives
or gradle publish
calls. That made automatic artifact releasing with Gradle from Travis completely broken. Up until now.
Improvements
Two good things happened at the edge of the years. The first was the appearance of the new nexus-publish plugin by Marc Philipp. It creates an explicit staging repository using the Nexus API and enhance the Gradle publish task to use that repository. The second thing was an enhancement in my gradle-nexus-staging plugin which started to allow setting the staging repository ID which should be used during the release operation. That leaded to improve the reliability of releasing to Maven Central using Gradle.
Instead of relying on a heuristic to determine which repository should be used for release, the new staging repository is explicitly created. The artifacts are uploaded directly to it, it is closed and releasing. Thanks to that, everything works smother and it more error-proof. In addition, there is no problem with parallel releasing of different projects belonging to the same staging profile and it finally works properly back again with Travis.
Configuration
This post assumes you have already configured uploading your artifacts to Maven Central (aka The Central Repository) using the maven-publish
plugin. If not you may consult this link. This configuration will make your deployment and releasing more reliable without a need to do any manual operations in Nexus UI.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | plugins { ... //other plugins used in your project id 'io.codearte.nexus-staging' version '0.20.0' id 'de.marcphilipp.nexus-publish' version '0.2.0' } publishing { ... //your current publishing to Maven Central configuration } //optionally nexusStaging { packageGroup = "your-package-group-if-different-than-groupId" } //optionally nexusPublishing { //for custom configuration if needed - credentials are by default taken from nexus-staging } |
Do you expect much more code (configuration) to write? Everything is hidden in the plugins which leverage each other. Just please remember to use nexus-staging 0.20.0+ and nexus-publish 0.2.0+.
After that artifacts uploading with releasing is a matter of one command:
1 | . /gradlew publishToNexus closeAndReleaseRepository |
Instead of publish
there is the publishToNexus
task used which sets the staging repository ID and closeAndReleaseRepository
which closes and releases that one particular repository. After a few minutes your artifacts should be available in Maven Central.
Important. Bear in mind that publishToNexus
and closeAndReleaseRepository
has to be used in one Gradle execution to be able to leverage explicitly created staging repository.
Summary
Gradle is a very nice build tool where (almost) the sky is the limit. Unfortunately, there are still some long lasting issues which require using some hacks or writing custom plugins to overcome them. The promising is that with every release they are slowly fixed/implemented. To solve that particular problem a bottom-up work was required to bring releasing back for Travis and more reliable in general.
Please note. The presented approach works pretty well for using the (recently improved) publishing plugin. If you still use the old maven
plugin (having the uploadArchives
task instead of publish
one) you need to migrate and/or put your comment in the corresponding issue.
Published on Java Code Geeks with permission by Marcin Zajaczkowski, partner at our JCG program. See the original article here: Reliable releasing to Maven Central from Travis using Gradle – 2019 edition Opinions expressed by Java Code Geeks contributors are their own. |