Hi Jukka,

Thanks for bringing this up in this concise form. I basically agree with what you propose. Yet a big question turns around in my head: What exactly _is_ Jackrabbit ?

Well, Jackrabbit is a JCR 1.0 implementation you might say. Quite true. But this falls short, because this only relates to jackrabbit-core (along with the API and commons libraries required).

So, you might say Jackrabbit is a project providing a JCR 1.0 implementation and other stuff related to JCR in general and Jackrabbit in particular. Some such stuff coming to mind is SPI, RMI, Object Content Mapping, Web Application, two flavors of WebDAV and more ...

<sidenote>SPI and RMI actually are in some sense JCR 1.0 implementations on their own right</sidenote>

So, what _is_ Jackrabbit ? Or maybe: What is _the_ Jackrabbit Release ? I can't tell. And maybe it is not important right now.

Right now, it is important to say:

  * Each component has its own versioning scheme and release
    cycle.
  * Components maybe released at the same time if there exist
    dependencies.
  * Whether a component is released at a minor or micro version
    number depends only on the changes contained in the
    component.
  * Jackrabbit Release(s) comprising multiple components have
    their own version number themselves. Whether minor or micro
    versions are released has to be decided on a release by
    release level.
  * Jackrabbit Release(s) do _not_ trigger component releases.
    Rather they just "package" the latest component releases.

The "Jackrabbit release" does not need to contain the latest nitty gritty feature. Rather it must be easily usable out of the box to test drive it or to just have something proven and tested (over time not just with automated tests).

As corrolary to these notes, I would add (yes these will be controversial, I know):

  * Branches are used for development and not for releases.
  * Releases are (almost) only cut from trunk
  * In case of an important bugfix to be applied to an old
    release, a branch will be created from the respective
    release tag and a release number with qualifier (fourth
    place in the version number, the major/minor/micro
    version numbers are the same) is created. E.g. 1.4.2.1433
    where 1433 might be the JIRA issue containing the comments
    leading to this release and 1.4.2 is the release (tag)
    from which the bug fix release was branched.


Why this ?

Trunk should always be as stable as possible. Releases are built from tags based on trunk. This further simplifies the release procedure as there is no more branching and nore more bug fix back porting.

Major new developments -- the implementation of the foreseen JCR 2.0 ACL functionality comes to mind -- should be done on development branches and merged back into trunk as the developer(s) see fit aka ready for release. Regular development still takes place on trunk, of course.

This simplifies the world for our users: We just tell them take the latest Jackrabbit release or take trunk. Both will work. It complicates matters a bit for those developers implementing major features having to work on a branch instead of trunk. But these are a minority compared to all the other developers and -- most importantly -- our users.

WDYT?


Regards
Felix


Jukka Zitting schrieb:
Hi,

There's been a lot of discussion about release strategy and
componentization lately, and I've been trying to figure out how to fit
all the different requirements into a single solution for Jackrabbit
1.5+. Here's what I have in mind...

First, the main requirements for componentization:

* The codebase should be reasonably modular based on exposed
functionality and required dependencies
* Component release cycles should be independent except as constrained
by functional dependencies

But also:

* It should be easy to download (or checkout) and build all of Jackrabbit
* A Jackrabbit installation should have a clear version number that
identifies the exact contents of the installation

To cover all of these requirements I propose:

* We keep a single release cycle for all of Jackrabbit (including a
single trunk,branches,tags structure, single Jira project, etc.)
* Each component within Jackrabbit trunk (and branches) has an
independent version number that is only increased based on actual
changes in the component
* Thus a "Jackrabbit release" contains a collection of different
component versions that are known to work well together
* When making a release, only those components that have been modified
(and thus have a new version number) are deployed to the Maven
repository
* Release notes will contain a list of included component versions and
the changes to each component

The effects of this policy would be:

* Downstream projects like Sling that use direct Maven dependencies to
Jackrabbit components have an easier time tracking actual changes in
the components
* The concepts "Jackrabbit release" and "Jackrabbit version" are still
simple to grasp and use for example when reporting or reproducing
issues
* There's still a single trunk where development of all components occurs

Applied to the Jackrabbit 1.4.x release cycle, this would have given
us the following releases:

* Jackrabbit 1.4.1, including core 1.4.1
* Jackrabbit 1.4.2, including core 1.4.2
* Jackrabbit 1.4.3, including jcr-commons 1.4.1 and jcr-rmi 1.4.1
* Jackrabbit 1.4.4, including core 1.4.3
* Jackrabbit 1.4.5, including core 1.4.4
* Jackrabbit 1.4.6, including core 1.4.5

Also, each release would have contained updated versions of aggregate
components like jackrabbit-webapp and jackrabbit-jca, whose version
numbers would thus follow the top level version number.

WDYT?

BR,

Jukka Zitting

Reply via email to