Website Backup Strategies, Part II
The second part of this series will take a look at revision control strategies for the core Drupal source.
CVS
Drupal is maintained in cvs. So cvs seems like a natural option. Pro Drupal Development covers this quite well in Chapter 21 “Development Best Practices”. There is a very short paragraph in the chapter about mixing SVN and CVS to deal with custom source.
Assuming cvs is installed, using CVS is as easy as
$ cd /var/www/html $ /usr/bin/cvs \ > -d:pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal checkout \ > -r DRUPAL-5 mysite
Which will create /var/www/html/drupal
And updates are as simple as
$ cd /var/www/html/drupal $ /usr/bin/cvs update -dP -r DRUPAL-5
But if you customize anything within the core source, then you’ll start to run into some difficulty. For starters, you will need to store the custom code in a different repository. Remember the short paragraph in Pro Drupal Development about mixing CVS and SVN? If custom source is not stored in another repository, the custom changes will not survive the update.
I’m pretty sure that I’ll be customizing something, headers, logos, maybe some javascript to get transparent images to work properly in IE. So, for my purposes, I’m going to look for another approach.
SVN
Using a svn repository solves the problem of keeping core source and custom source in a single repository at the cost of a little additional work. In the case of Drupal, the source is not in SVN so we cannot simply checkout the source from the development team repository. If you are new to svn, a good resource is Mike Mason’s excellent book Pragmatic Version Control: Using Subversion(2nd Edition). Another good resource is Version Control with Subversion
The following workflow assumes everything is being done on a local machine, and the user has appropriate permissions.
Create a repository
$ mkdir /var/svn/repos $ svnadmin create /var/svn/repos
Get the source
$ cd /usr/local/src $ wget http://ftp.drupal.org/files/projects/drupal-5.1.tar.gz
Uncompress the archive
$ tar xvf drupal-5.1.tar.gz
Import the source into the repository
$ svn import --no-auto-props -m"initial import of drupal 5.1" \ > drupal-5.1 file:///var/svn/repos/vendorsrc/drupal/current
Create a tag
$ svn copy -m"Tag 5.1 vendor drop" \ > file:///var/svn/repos/vendorsrc/drupal/current \ > file:///var/svn/repos/vendorsrc/drupal/5.1
Create project
$ svn mkdir -m"Create project myproject" file:///var/svn/repos/myproject
Copy into main development branch
$ svn copy file:///var/svn/repos/vendorsrc/drupal/5.1 \ > file:///var/svn/repos/myproject/trunk
Check out the project to create a working directory
$ svn co file:///var/svn/svnrepos/myproject/trunk \ > /var/www/html/myproject
Ignore files/ directory
$ svn mkdir files files/images files/images/temp files/css files/color $ svn propset svn:ignore "*" files/ files/images \ > files/images/temp files/css files/color $ svn commit -m "ignore files/ and subdirectories content from now"
If you don’t set ignore on the files/ directory and its subdirectories then svn status will get pretty busy. You need to set the ignore property on files/ and each subdiretory in files/, for example, files/css, files/images, files/images/temp, etc.
Any custom changes we make can go into the same project respository.
When it’s time to upgrade Drupal to a new version, the basic update workflow is as follows:
checkout the current version of the core source in a working directory
make the working directory look like a pristine copy of the new version by copying, and svn adding or deleting as required. To make your life easier, use svn.load.dirs.pl
commit the new version and add a tag
merge the old and new versions in your project’s working directory make sure you use the tag because the branch moves, the tag is fixed
resolve any conflicts and commit the changes to your project
More details can be found at Vendor Branches
Finally, you may want to consider using svnsync to mirror your repository.
GIT
In part one, I mentioned the excellent article on Verion Control Blog. This is my preferred process for source control of Drupal powered sites. The article is a very comprehensive how-to, so I don’t need to duplicate it here.
The basic workflow involves creating lines of development for
drupal- contains the core source distributiondrupal-and-modulesis a clone of drupal plus contributed modules and themesdrupal-productionis a clone of drupal-and-modules with project customizations
The lines of development are chained together with cloning and changes propogate from drupal/ through drupal-production/.
I will point out one area of concern with the approach as detailed in the article. Exploding the latest version of Drupal in the drupal/ line of development does not deal with files or directories that may have been deleted in the latest version.
For more info on git, you should start with the documentation.
So there you have it, three approaches to keeping the Drupal source under revision control. I’ve stated my preference but everyone’s situation is different and you can choose.
In the next part, I’ll detail how to backup the files that are not under revision control, for example, the files/ directory. The final segment will address backing up the MySQL database.