Recovering from a broken staged Sonatype Maven repository
The uPortal 4.1.1
release process staged a broken Maven repository in Sonatype. I only noticed this after pushing the 4.1.1
release commits and tags to GitHub. This is the story of how I recovered.
What went wrong
In the uPortal release process, the release engineer runs
mvn release:prepare
and then
mvn release:perform
Among other things, these commands update local metadata files associated with the Maven build (pom.xml
s), commit those changes to local Git, and push built artifacts and signatures on those artifacts up to the Sonatype staging repository for preparing open source software releases for publication to Maven Central.
When I released uPortal 4.1.1
, I ran those commands, and they seemed to be just fine. The release process called for locally building the quickstart and testing, which I did, and then pushing the commits up to GitHub, which I did, and then Closing and Releasing the staged Maven repository from Sonatype, which I tried to do.
Oops.
Apparently the staging process can fail to push some of the artifacts up to the Sonatype repository such that the repository is incomplete. In this particular case an md5 checksum file was outright missing. When i tried to close the repository, the repository failed the Central-suitability checks.
By the time I realized this, I had mvn clean
'ed my local environment and no longer had copies of those signed artifacts.
Things that didn't work in fixing it
So, now I had a GitHub state that reflected the uPortal 4.1.1
release commits and tag, but I didn't have a proper staged Sonatype repo to close and release.
mvn deploy
So, mvn package
locally builds the stuff that your Maven project is supposed to build. .jar
s and .war
s and .ear
s, oh my. And mvn install
further installs that stuff into your local Maven repository (e.g. that .m2/repository/
directory.
But mvn deploy
, that's supposed to deploy your stuff out to the remote Maven repository, right?
Eh. Naive invocation didn't work. In releasing open source stuff up to Maven Central, one likes to cryptographically sign the artifacts. Apparently naive invocation of mvn deploy
doesn't do that, which is one reason it's not sufficient.
Release the tag
So I tried naively checking out the published uportal-4.1.1
tag and mvn release:prepare
, mvn release:perform
ing on that.
That didn't work either. The release plugin likes to work from a SNAPSHOT
state, not a tagged version state.
Manually generate the one missing signature
It probably would have worked to manually generate the one missing signature and use it to fix the exiting staged repository or to build a new correct repository. I didn't look into this option because the solution I'm about to describe worked first.
Of course, had I kept around that .md5
file then fixing the repo to include the needed file would have been a great way to get un-stuck.
What actually worked
I checked out the commit prior to when i ran mvn release:prepare
for the 4.1.1
release. This allowed me to locally do the release again against a detached HEAD
that is the code base exactly as it was when I originally did the release. (I could and should have done this in a local branch, since the detached HEAD
made the local commits that mvn release:prepare release:perform
wants to do fail, but as it turns out those failed commits don't matter.)
I told the Maven release
to use the target SCM tag dup-uportal-4.1.1
so it didn't conflict with the existing already-pushed uportal-4.1.1
tag.
And hey, it worked. It staged a uPortal 4.1.1
Maven repository with Sonatype that successfully Closed and successfully Released. So now the 4.1.1
artifacts are up on Maven Central.
The dup-uportal-4.1.1
String does show up in the uportal-parent
pom.xml
as the project
--> scm
--> tag
,
<project ...>
...
<scm>
...
<tag>dup-uportal-4.1.1</tag>
...
but that doesn't seem to matter.
Fail fast
I've updated the uPortal release process checklist so that the Sonatype repository Close step comes before pushing the release commits and tag up to GitHub. The next time Maven / Sonatype get confused about staging the Maven artifacts for release, this should be discovered sooner.
Fail loudly
When the upload of artifacts to Sonatype fails, that should, of course, fail the mvn:release
step, rather than failing silently. It matters to the release engineer, of course, that the mvn release command didn't do all the things it needed to do, like actually upload the generated release artifacts.
I haven't done anything with this insight so far, but that would be the deeper fix.
Failing silently isn't cool.
Gradle?
I'm told I'll love Gradle. Maybe it doesn't fail in these ways. These experiences with Maven do remind me of The Maven.
Cover photo: Model of MAVEN spacecraft : CC-BY-NC.