On 16/09/2010 10:48 AM, Stefan Schulze wrote:
Hi,

My problem is not really only about Maven, but more about a general 
buildmanagement-strategy using Maven. I didn't found a mailinglist or newsgroup 
dedicated for general buildmanagement-topics, so try to post my issue in this 
list.

I'm quite new to buildmanagement and have to think about a concept to support the 
evolutionary architecture (or better "evolutionary development of the 
architecture") we want to employ in the future of our product.
After hours and days of considering and contemplating we found two possible 
solutions. Because both has serious drawbacks, I hope that anybody of you 
already knows this scenario/requirements (I think it's not too unusual) or has 
any suggestions to improve our solutions.

The requirements:
1) It is neccessary to support different modules (WARs) depending on the same module (JAR) in 
different versions: For example, first we developed a module "booking" in version 1. Some 
common stuff is implemented in "core" (version 1, too), where booking-1 depends on. Some 
time after release our customer wants to have an reporting-module, so wie develop reporting-1 and 
implement some improvements to core (because during the last project and in the meantime we saw, 
that there some decisions weren't ideal). So reporting-1 depends on core-2. We do not want to 
upgrade booking-1 to use core-2, because in this case, booking would have to pass QA again (and the 
customer wouldn't pay this - there is no new feature).
This is a common problem and when you quote the cost of reporting-1, you need to include the cost of releasing booking-1 with the new core library. You can reduce the cost by breaking core onto multiple smaller libraries that are less susceptible to change. With small changes to large systems, the cost of the release of a new system can be larger than the programming and testing of the actual change.


2) It is neccessary, that it's possible to fix booking-1 or even core-1 (a bug 
in booking-1 is in core-1, in truth), although core-2 is the current version of 
core and booking-1 wouldn't even compile against core-2.

The infrastructure:
1) We use Synergy/CM for version-control. For this case it's similar to 
Subversion with release-branch strategy. In opposite to Subversion, cheap 
and/or history-preserving copies are not supported.
2) We use Maven2 with an own Nexus-repository. Currently we use Maven and Nexus 
just to serve third-party-libs and to give the developers the possibility not 
to have to checkout the full source, but only these parts, they work with. So 
the repository isn't really part of releasing a new version of our system - we 
not even create a Release-version of our snapshots.

The (possible) solutions:
1) In each module are additional directories for the different versions. Each 
version-directory contains quite the same code (differing only in the changes 
made between the versions):
    core-
        |-1-src-...
        |-2-src-...
        ...
This doesn't feel rights. It's somehow ugly, we copy code and we have to merge 
bugfixes manually from one version to all others. But it's a quite simple 
solution to solve both requirements.

2) Each release-branch contains only the current version of code. The other versions are 
taken from the Maven-repository (in this case we have to use release-version and all the 
stuff). If a bugfix is core-1 is neccessary, a developer check-out the release-branch 1, 
implement the bugfix, start the build and calls a build- or release-manager to deploy the 
release-version to the repository. If it's time to go live with a new version, an 
appropriate assembly is built, which contains in parts of "fresh compiled" code 
and in parts of artifacts out of the the Maven-repository.
At the detail, this is a quite complex approach. I don't really like, that we 
don't have a release-branch containing the full production-code - instead we 
would release a mixture of different release-branches.


If any of you has some experience with similar requirements, has an idea for a 
different solution or an suggestion to improve the one or the other solution, I 
would really appreciate your ideas and comments.
You create releases that you store in Nexus (or some other repository). In your SCM, you store your software with properly named branches so that you can patch and rebuild anything that you have released.




Thanks for reading all of this quite long mail. :-)

   Stefan


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to