This page was moved to https://cwiki.apache.org/confluence/display/CAUSEWAY/Make releases easier and more frequent
Click in the link above if you are not automatically redirected in 10 seconds.


You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 11 Next »

Discussion

In the mailing lists we've been discussing how to restructure the codebase to make releases easier to do, see isis-users thread and isis-dev thread.

Interim Conclusions (as of 12:30gmt 30 Nov 12):

  • yes, to idea of independent, more granular releases
  • yes, flatten the modules at least as an interim step
  • also, rename the groupId/artifactId's
  • all artifactIds have an 'isis-' prefix so that, when assembled together in a single directory (eg WEB-INF/lib), they are easily identifiable as being Isis'.
  • all artifactids also specify the component type, otherwise would be confusion between isis-sql.jar: is it an objectstore, or is it a security impl, or what?
  • break linkage so that separate modules so don't share common parent (ie are separate artifacts)
  • perhaps... move the separate modules into their own git repos

Refactoring the codebase

The following table summarises proposed refactorings etc.

Type column:

  • C = core, parented by "org.apache.isis:isis" (as currently)
  • A = alternate implementation, not parented by org.apache.isis:isis (instead would define its own parent), thus separately releasable. Might move to own git repo
  • E = edition, ie an archetype, not parented by org.apache.isis:isis (instead would define its own parent), thus separately releasable. Might move to own git repo
  • X = excluded, parented by "org.apache.isis:isis" but not released (excluded through use of Maven profile). Might one day be promoted to being an alternate implementation.
  • R = retired
  • D = deleted

Some additional notes:

  • Rob suggested renaming 'tck' to compatibility. I've left it as is for now because otherwise all the other -tck submodules would need to be renamed.
  • New location column is relative to 'trunk/framework'
  • I've reinstated dflt-objectstore into core, but there is NO default viewer. In other words, a user is required to decide which viewer to use. Typically that will be done by deciding which edition's archetype to run.
  • I suggest we retire html-viewer, profilestore-xml and monitoring modules.

Module

Type

New location

groupId:artifactId

Notes

isis

C

.

o.a.i:isis

 

isis.applib

C

applib

o.a.i:isis-applib

 

isis.core

C

core

o.a.i.core:isis-core

with 6 submodules

isis.quickstart-archetype

E

quickstart-archetype-xxx-yyy

o.a.i.edition:isis-archetype-xxx-yyy

one per edition; separately releasable

isis.runtimes

D

Delete module, due to flattening

isis.runtimes.dflt

C

runtime

o.a.i.core:isis-runtime

With 4 submodules (below)

isis.runtimes.dflt.bytecode

C

bytecode

o.a.i.core:isis-bytecode

 

isis.runtimes.dflt.monitoring

X

monitoring

o.a.i.monitoring:isis-monitoring

Suggest we retire this module

isis.runtimes.dflt.objectstores

D

Delete module, due to flattening

isis.runtimes.dflt.objectstores.dflt

C

objectstore-dflt

o.a.i.core:isis-objectstore-dflt

Reinstated as a core module

isis.runtimes.dflt.objectstores.jdo

A

objectstore-jdo

o.a.i.objectstore:isis-objectstore-jdo

 

isis.runtimes.dflt.objectstores.nosql

A

objectstore-nosql

o.a.i.objectstore:isis-objectstore-nosql

 

isis.runtimes.dflt.objectstores.sql

A

objectstore-sql

o.a.i.objectstore:isis-objectstore-sql

 

isis.runtimes.dflt.objectstores.xml

R

../retired/objectstore-xml

Suggest we retire this module

isis.runtimes.dflt.profilestores

Delete module, due to flattening

isis.runtimes.dflt.profilestores.dflt

C

profilestore-dflt

o.a.i.core:isis-profilestore-dflt

 

isis.runtimes.dflt.profilestores.sql

X

profilestore-sql

o.a.i.profilestore:isis-profilestore-sql

 

isis.runtimes.dflt.profilestores.xml

R

profilestore-xml

o.a.i.profilestore:isis-profilestore-xml

Suggest we retire this module

isis.runtimes.dflt.runtime

C

runtime/runtime

o.a.i.core:isis-runtime-runtime

 

isis.runtimes.dflt.testsupport

C

runtime/testsupport

o.a.i.core:isis-runtime-testsupport

 

isis.runtimes.dflt.webapp

C

runtime/webapp

o.a.i.core:isis-runtime-webapp

 

isis.runtimes.dflt.webserver

C

runtime/webserver

o.a.i.core:isis-runtime-webserver

 

isis.progmodels

D

Delete module, due to flattening

isis.progmodels.dflt

C

progmodel-dflt

o.a.i.core:isis-progmodel-dflt

 

isis.progmodels.groovy

X

progmodel-groovy

o.a.i.progmodel:isis-progmodel-groovy

 

isis.progmodels.wrapper

X

progmodel-wrapper

o.a.i.progmodel:isis-progmodel-wrapper

 

isis.viewer

D

Delete module, due to flattening

isis.viewer.bdd

X

viewer-bdd

o.a.i.viewer:isis-viewer-bdd

 

isis.viewer.dnd

A

viewer-dnd

o.a.i.viewer:isis-viewer-dnd

 

isis.viewer.html

D

../retired/viewer-html

Suggest we retire this module

isis.viewer.junit

X

viewer-junit

o.a.i.viewer:isis-viewer-junit

 

isis.viewer.restfulobjects

A

viewer-restfulobjects

o.a.i.viewer:isis-viewer-restfulobjects

 

isis.viewer.scimpi

A

viewer-scimpi

o.a.i.viewer:isis-viewer-scimpi

 

isis.viewer.wicket

A

viewer-wicket

o.a.i.viewer:isis-viewer-wicket

 

isis.security

Delete module, due to flattening

isis.security.dflt

C

security-dflt

o.a.i.core:isis-security-dflt

 

isis.security.file

C

security-file

o.a.i.core:isis-security-file

 

isis.security.ldap

X

security-ldap

o.a.i.security:isis-security-ldap

 

isis.security.sql

X

security-sql

o.a.i.security:isis-security-sql

 

isis.tck

C

tck

o.a.i.core:isis-tck

 

Profiles

The 'C' and 'A' modules will be independent of each other.

The 'X' modules will be part of the core, but will not be released. We can use profiles to exclude them when doing a release, eg:

<profiles>
	<profile>
		<id>core-release</id>
		<modules>
			<!-- core modules -->
			<module>applib</module>
			<module>core</module>
			<module>runtime-dflt</module>
			<module>bytecode</module>
			<module>objectstore-dflt</module>
			<module>profilestore-dflt</module>
			<module>progmodel-dflt</module>
			<module>security-dflt</module>
			<module>security-file</module>
			<module>tck</module>
		</modules>
	</profile>
        ...
</profiles>

Original text that initiated the discussion


At the moment it's a daunting task to fully verify all the components of the framework are working correctly prior to pushing out a release. I suppose that wouldn't be so much of a concern if we had better automated tests, but, hey, that's how things are.

Moreover, frankly, some of the modules are best considered spikes and probably don't constitute something that we would consider production-ready. Or, at least, they haven't been used in a real-world context, so it's not possible to say whether they are really fit-for-purpose. I include here quite a lot of the stuff that I have worked on over the last few years, eg the wrapper-progmodel, the groovy progmodel, probably also the JUnit viewer and BDD viewer. Now that we are a top-level project, I'd like it that the code we put out is thought of as production ready.

In order to make the framework easier to release, I propose that we use Maven profiles to be able to release subsets of modules, that a given contributor can stand behind and say: "yes, those modules are working and are fit for general consumption". Each release would consist of the certain core modules, along with selected additional viewers and object stores.

For example, we might have:

  • v0.3.1 core + objectstore-jdo + viewer-wicket + viewer-restfulobjects // a "wicket/jdo release" - eg tested and released by Dan
  • v0.4.0 core + objectstore-nosql + viewer-scimpi // a "scimpi/nosql release" - eg tested and released by Rob
  • v0.5.0 core + objectstore-dflt + objectstore-xml + viewer-dnd // a "dev release" - eg tested and released by Rob
  • v0.6.0 core + objectstore-jdo + viewer-wicket + viewer-restfulobjects // another "wicket/jdo release"
  • v0.7.0 core + objectstore-sql + viewer-html // a "html/sql release" - eg tested and released by Kevin
  • v0.8.0 core + objectstore-jdo + viewer-wicket + viewer-restfulobjects // another "wicket/jdo release"

Whenever a release goes out, we would update the site to indicate the most recent version of the components.

Now, when I say "release", what I actually mean here is the deployment of binary artifacts up to the Maven central repo. This, after all, is what most users/would-be users in the community would use and consider a release. However, Apache's own formal definition of "release" is actually the source code release ... this is what the VOTE mechanism is for. I don't see this changing... the vote basically says that the software complies with all the legal license stuff etc. The whole codebase is tagged with that release number, and the generated src.zip is a zip of this release.

One benefit of this is that it allows the deployment of other modules to be performed "after the fact". For example, suppose that I (Dan) puts out the v0.3.1 release as above, and then Rob later on tests the scimpi viewer in that tag and finds it works well. He can (I think) push the release of the scimpi viewer up to Maven central repo.

As I see things there are several benefits to this scheme:

a) (as already noted) the user community will only see binary releases that are known to be of production ready. This should mitigate the "is it safe to use this component" worry
b) (as hinted at) it should be possible for individual contributors to put out releases of their modules more rapidly
c) we get visibility of which modules aren't being released; for example, we might say that if a module hasn't been released by anyone for 18 months, say, then it's probably time to remove it from the codebase.

  • No labels