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.
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.
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.
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.
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:
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
closeAndReleaseRepository has to be used in one Gradle execution to be able to leverage explicitly created staging repository.
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.