[Kolab-devel] Native Packaging, Issue Tracking & Restructuring the SCM

Jeroen van Meeuwen (Kolab Systems) vanmeeuwen at kolabsys.com
Wed Sep 8 19:28:20 CEST 2010


Hello there,

I wanted to open up the discussion on Source Code Management, in relation to a 
product (component) road map and development processes -such as testing and 
release engineering, which gets us to Issue Tracking as well, and native 
packaging efforts.

Since I feel many things are interconnected at many levels, I threw them all 
in this one thread and I hope you can all draw from it what you think is 
important and nice; If you have any questions regarding anything in 
particular, please ask!

I would propose that the various components that are all in the server 
repository now, would need to become separate components.

E.g., for example, the following become separate, standalone repositories:

- kolab-cyrus-imapd/
- kolab-daemon/
- kolab-perl/
- kolab-utils/
- kolab-webadmin/
- .../

Note that it doesn't have to be separate repositories if a proper branching 
and tagging policy is set, which I'll get to later. For now though, to 
illustrate the advantages of separate component repositories and/or 
directories, please just bear with me while I explain some of the advantages 
of separate repositories;

This would help accommodate the following;

- The components can be developed as Kolab *components*, meaning;

  - they become optional components (even though they may be required 
components by other components),

  - they can have a different road map -and different milestones to complete 
for such road map,

  - they could even have a different (group of) contributors,

  - the component may have a different branch and/or tag policy or release 
cycle.

  - they can be released with a separate 'make dist', possibly including their 
own versioning schema (while adhering to some sort of standard, of course).

- Each component that is forcefully tied to another component (such as a 
kolab-daemon or kolab-utils component and a kolab-perl component) inherently 
also forces us to work with proper, verifiable APIs,

- Proper, verifiable APIs get us to reasonable product versioning, where you 
can only bump so much at a certain time, and you are required to bump the X or 
Y or Z in a X.Y.Z product versioning schema given the inclusion of certain API 
changes.

- 3.0 development version of one component could be *separately* tested more 
easily in a 2.x kolab* environment (goes to upgrade paths),

Note that, either way we look at it, the components end up on a consumer 
system using native packages *as separate components*, possibly on separate 
systems.

Right now, the opposite is the case;

- one group of contributors contributes to all components,

- the releases are tied in together - an update for one component forces us to 
mark the other components as well (from an SCM perspective), which holds us 
back from actually releasing anything until it's worth the effort, which poses 
a (perceived) risk to consumers who may think bug- and security fixes are 
being held back until the bunch of them justify releasing, which is easier to 
do with separate components,

- Kolab expects certain sets of components to be installed on the local 
machine, which does not always make sense in different existing 
infrastructures, or more sensible architectures thereof.

You can find a few examples I've put up for the purpose of visualizing such 
structures on;

http://git.kolabsys.com/kolab-perl.git/
http://git.kolabsys.com/kolab-utils.git/
http://git.kolabsys.com/kolab-webadmin.git/

Please note that I'm not expecting any comments wrt. the exact conversion 
method used.

Again, whether it be in one big repository or not is besides the point I'm 
trying to make as well. However, if it is in one big repository, consider the 
following;

Suppose the webadmin component is refactored, and needs to branch off for such 
purpose as to not break master (which may have a milestone approaching and may 
need to be released before any merging back happens). Given one bug 
repository, the new branch name would require a "component prefix", a target 
milestone and the topic which is being worked on; Example, given we are on 2.2 
now, and two topics on the roadmap for a version of the product yet to be 
determined (future feature development):

git checkout -f master
git checkout -b webadmin/2.3-dev-refactor

This could just be mutually exclusive with;

git checkout -b webmaster/2.3-zpush-admin

So pragmatic source code managements says, use;

git checkout -b webmaster/<owner>-<target>-<topic>

Maybe, though, we have already named the milestones against the 2.3 series of 
products (a proper issue tracker would know). Suppose the goals for 2.3 are;

- isp patches
- z-push

Then frankly, 'master' should have branched off to kolab-2.3-testing, and 
further development can continue on both master as well as towards the 2.3 
milestone. The regrettable aspect of one big repository is; you require 
branching off all components and will need to merge bug-fixes that may occur 
from either branch to the other.

Right now, this results in an insurmountable set of changes being in the 
master branch, versus what is in the 2.2 branch; some things are in the 2.2 
branch but have not been merged back in with the master branch leaving us with 
fixes for 2.2 that will not be in whatever we branch off of master.

Anyway, I feel like I may have started off rambling for a little so I'll stop 
making the argument and allow for some feedback ;-)

Summarizing;

- strong preference for separate repositories for Kolab components,
- proper product component versioning,
- branching/tagging policy,
- adjacent features in the issue tracker (roadmap, milestones),
- guidelines for handling issues in tracker,
- native packaging from tarball releases.

Kind regards,

-- 
Jeroen van Meeuwen
Senior Engineer, Kolab Systems AG

e: vanmeeuwen at kolabsys.com
t: +316 42 801 403
w: http://www.kolabsys.com

pgp: 9342 BF08




More information about the devel mailing list