Howdy,

As we know, we have changes upcoming regarding publishing to central
(in short: oss/s01 are being sunset, Central Portal becomes the new
service; if unsure what am talking about, please google it up). Also,
while there were vendor and third-party plugins and solutions for
this, I am talking about the "vanilla Maven experience" here.

Maven aspect so far: all the "old" publishing services so far
(OSS/S01/RAO) were based on Sonatype Nx2 "tech", that provided support
for maven-deploy-plugin, basically allowing seamless use of these
services from within Maven (doing `mvn deploy` just worked) at the
cost of "pushing some buttons" as part of publishing workflow: you had
to close and release the staging repository that service created for
deploy, and the happy path was that after sync, we got artifacts
published to Central.

The new service is NOT maven-deploy-plugin friendly anymore. This
makes Maven, the project that invented Central, become unable to
publish to Central out of the box (again, "vanilla experience").

To continue, let's introduce some terminology to have all of us on the
same page:

* deploy(ing) - is what Maven always did (maven-deploy-plugin): it is
"uploading artifacts (one by one, request-wise) to some remote
location", by default it happens "interleaved as subproject lifecycle
runs" and it "edits" metadata as well. Later we introduced the "deploy
at end" feature, but nothing fundamentally changed here: the artifacts
are still deployed one-by-one, metadata handling is done by your
Maven, and to have your deployment complete, the last subproject of
the session must be deployed as well. Long time ago, when a remote
repository was imagined as a httpd+webdav, or today w/ MRM hosted
repository, this worked and works quite well.

* publish(ing) - Since 2010 things have changed: many tools already
use this term, and it is NOT the same thing as "deploying" or even
"deploying with a twist": is not even close to it. Publishing usually
has its own WORKFLOW, like explained above: get your payload there (in
some form), then do something (push some buttons), maybe spawn a vote
in between, and finally again do something (push some more buttons) to
finally get your artifacts somewhere. Publishing usually requires
handling your project output "as a whole", something not naturally
mapped onto the project itself. Finally, there is no (at least when
compared to deploy) much metadata requirement either, as "embedding"
your output to its final resting place is done by the vendor providing
the publishing service, as they have to, unless they want to end up
with corrupted metadata. Finally, "publishing" as described above is
not something Maven (3 or 4) is able to do today: so far all we had
was some variation of "deploy with a twist"-like hacks instead.

The new "publishing" involves two aspects:

* target - is WHERE you publish, to keep things simple, usually we
assume "target == Maven Central" but again, it could be anything (ie.
corporate MRM w/ staging used to get artifacts to some corporate
hosted repository). Targets also define the "requirements", like
mandatory and optional checksums, signatures and so on.

* service - is HOW you publish (basically a service implementing the
workflow mentioned above). Usually service implies target (ie. using
repository.apache.org you publish to Central) but does not have to.
Service is operated by some vendor, usually is not open source and
different services may require vastly different "ways" (protocols?) to
publish, as there are no standards defined in this area.

Today we have several services to publish, and they all end up on same
target, Central:
* repository.apache.org (apache-rao)
* oss.sonatype.org (sonatype-oss, soon to be sunset)
* s01.oss.sonatype.org (sonatype-s01, soon to be sunset)
* central.sonatype.com (sonatype-cp, the new "Central Portal" service)

In general, I'd propose the use of $vendor-$service naming to keep
things clear (and unique and future proof). Overuse of "central" is
just killing us, nor is it appropriate for any service, as it is the
target.

As said above, the sunset services are taking away the "native" Maven
deploy support. Moreover, Maven 4 is here to come, but we cannot leave
Maven 3 users alone either. In Maven 4 you can more easily hack up
some "deploy with a twist" solution, but this does not work for Maven
3 users.

Plus, I'd dare to say that publishing is something orthogonal to your
project. What if you want to publish to two places? Or what if you are
about to (or forced to) switch services you use for publishing? These
changes should be "simple" (as in light, simple to implement), but
instead, many times this imply quite a lot of changes on your project,
introducing new profiles, properties, plugins, maybe extensions, and
so on. Even if we consider the same target (Central), moving from one
service to another is not trivial. So far, Maven "got away" by using
(hence, changing) Nx2 staging endpoint in
distributionManagement.repository.url (ie. when moving from S01 to
RAO), but again, this is simply not enough today.

Site note: many Maven projects used one of RAO, OSS or S01 to publish
to central, and almost all of them used "own invented" server.id for
authentication, even if it was pointing to the same service. User who
was hopping from project to project had to fill up his settings.xml
with all the variations of used server IDs for these 3 services, even
if auth material was usually the same (as the user had own account on
these). Hence, by separating service from POM. it would allow users to
have only as many service related server entries in settings.xml as
much they are really using (currently max would be 4).

(a digression: IMHO distributionManagement.repository.url should
contain the TARGET URL, not the SERVICE -- that may not even be
describable with a single URL -- , but that's another thing and topic,
not for this thread).

Maven did a great job of abstracting things away ("everything is an
artifact", "remote repository is from you get them" etc) hence WHERE
and HOW you publish should be abstracted as well. In fact, nothing
should stop you from publishing to two places as well. Who knows what
the future brings?

Hence, IMO we need to act in this area. We should:
* provide OOTB solution for both, Maven 3 and Maven 4
* have it non-invasive (as opposed to vendor supplied, closed source
solutions) that poses requirements to alter/adapt your build AND ties
you to one service
* still, it should not reinvent the whole universe, it should rely on
Maven infrastructure as much as possible (ie. user should not
reconfigure the solution ground-up, or use alternate means to provide
auth etc). It should be a Maven thing, not some side stuff.

Users are concerned as well, for example, here is this issue, that
nicely collects all the known problems, worth reading:
https://issues.apache.org/jira/browse/MNG-8584

---

So, after a long email, a short(er) proposal: as you may know,
Maveniverse umbrella is the place for "fast paced prototyping and
experiments", but it also hosts projects that our members voted to not
have under the ASF Maven project (like Mason Maven4 extension is).
There were several attempts to provide solutions for the problems
above. The initial attempt named MDK
https://github.com/maveniverse/mdk was deemed overly complicated (and
spanning across several things), so it was dropped.

Next attempt is Njord:
https://maveniverse.eu/docs/njord/
https://github.com/maveniverse/njord

It is still prototyping, many things are not there yet, like automatic
workflow handling (ie. publishing still happens as with RAO/OSS/S01
service with "vanilla experience", like most ASF projects do: you need
to push some buttons), but solves the problems explained above and
also enables Maven 3 and Maven 4 to publish to the new Sonatype
Central Portal without any hassle. Importantly, it is not invasive nor
forces users to "reinvent" anything. As extra, it offers "local
staging" (analog to Nx2 "remote staging") and much more.

In short, with Njord:
* to use it, you need no project change at all (!) -- ideally with
Maven 4 it can be just "user extension", similar to Mimir
* you can deploy "as usual", your project works as before, no need to
change anything (but undoing "tricks" for current Central publishing
is worth to do).
* with it, you can locally stage the project as many times you want,
it works with or without release plugin
* once you have staged the artifacts, you can publish locally staged
repositories (and drop it, or maybe keep it and re-publish it
somewhere else, etc) and many more.

So, I'd like to ask you to:
* please take a peek at Njord, scrutinize it, propose improvements and
changes for it, maybe even test drive it
* if you want, fall in and help pushing it toward 1.0.0
* and once (and if) we agree it is "done" (whatever it would mean),
I'd like to propose to "bring it in" into the ASF Maven project, and
make it some sort of "Maven 3/4 Solution for Publishing".


Thanks
T

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
For additional commands, e-mail: dev-h...@maven.apache.org

Reply via email to