Wade Preston Shearer wrote:
I am interested in opinions on where best to locate a repository.
Concider the following situation:

There are individual development environments for each developer. They
commit their code to the repository. Code is updated on a common "dev"
server from the repository for testing. When updates or releases are
ready to by published, the code involved is then updated on a beta
("staging") server (that identically matches the production servers)
from the repository where it is confirmed to be ready. Once verified,
the code is then updated on all production servers (behind a load
balancer) from the repository.

Myn question is where would you put the repository? All servers have
to have access to it. I like the idea of putting it on the dev server,
but for security, the production servers can currently only
communicate with beta. So, with my current setup, the repository would
have to be on beta.

If you were setting up a system such as this, how would you do it?
If you are using Subversion via Apache and WebDAV, you have all the Apache tools available to do security. If you want to use all the Subversion tools for history, merge etc. then it makes a big difference whether or not two versions of the code are in the same repository, because that's what determines what automatic tools you can apply.

Given all that, I set up Subversion for DharmaTech's site as follows:

  1. There is one repository for each piece of software that we work
     with.  By "piece of software" I mean software development project
     with a release schedule.  Thus Drupal and TinyMCE are two pieces
     of software since they are developed independently by different
     groups.  Drupal uses TinyMCE and Drupal brings in its copy of
     TinyMCE by using an external reference to the TinyMCE repository.
  2. Within each repository, the setup is basically what is described
     in the Subversion book:
         * vendor/ for the code as it came from the developers, with no
           local changes
         * trunk/ for the latest stable, tested code, basically the
           contents of vendor/ with our modifications
         * tags/x.y.z/ for versions of trunk that represent  known
           fixed points  of stable, reliable functionality
         * branches/something/  for work in progress.  We create a
           named development branch for each line of development by
           making a copy of trunk/.  When development on a branch has
           reached its conclusion we merge the changes back into trunk/
           (or throw them away, depending :-)
         * branches/clientname/ for each client.  If we did this on
           Fantasy Island we would never need to make a custom code
           change for a client.  Since we work in the real world,
           however, we set up a client by creating a branch for them
from the latest tags/x.y.z version then do what we need to. If an important security patch comes out, we start by
           applying it to vendor/ (if it came from the original vendor)
           then merge it in to trunk/, the next incremental tags/../
           and clients as needed.  This gives us the ability to do an
           orderly merge and back the change out if necessary.

Each client's site is a working copy of their branch. If we need to do development for a client that is in production, we will create a branch from their production branch, develop the changes on their branch, then merge the results back into their production branch.

Since our software is free software and openness is one of DharmaTech's core values, you can have a look at our repositories here:

 https://justice.dharmatech.org/svn/drupal/

 https://justice.dharmatech.org/svn/civicrm/

 https://justice.dharmatech.org/svn/tinymce/

-- Walt



_______________________________________________

UPHPU mailing list
[email protected]
http://uphpu.org/mailman/listinfo/uphpu
IRC: #uphpu on irc.freenode.net

Reply via email to