Subversion (SVN) is a popular open source, source code change control package. Today we are going to install and configure Subversion on Red Hat Enterprise Linux 5.2 (a.k.a. RHEL 5.2), I will actually be doing my testing on CentOS 5.2 but the process should be completely identical.
Installing Subversion on Linux
Installation of subversion is very simple if you are using yum. In addition to Subversion itself, you will also want to install Apache as you will most likely want to access Subversion through a WebDAV interface. You can simple run:
yum -y install subversion httpd mod_dav_svn
Once Subversion is successfully installed we need to create the initial repository. This can be done on the local file system but I prefer to keep high priority and highly volatile data stored directly on the NAS filer as this is far more appropriate for this type of data.
As an aside, I like to keep low volatility data (say, website HTML) stored on local discs in general for performance reasons and since backups are not as difficult to take using traditional backups methods (e.g. tar, cpio, Amanda, Bacula, etc.) High volatility files I prefer to be on dedicated network storage units where backups can be easily taken using more advanced methods like Solaris 10’s ZFS snapshot capability. It is not always clear when data makes sense to keep locally or to store remotely but I feel that you can gauge a lot of the decision on two factors: frequency of data changes – that is changes to existing files not the addition of new files necessarily and the level to which the data is the focus of the storage – that is if the data is incidental or key to the application. In the case of Subversion the entire application is nothing but a complex filesystem frontend so we are clearly on the side of “data focused” application.
I started writing this article on RHEL4 on a system with a small, local file system. When I returned to the uncompleted article and continued with it I was implementing this on a RHEL5 system with massive local storage and decided to keep my Subversion repository local on a dedicated logical volume for easy Linux based snapshots.
Subversion has two optional backend storage solutions. The original method of storing Subversion data was with the venerable Berkley DataBase, known as BDB, which is now a product of Oracle. The newer method, and the method which has been the default choice since Subversion 1.2, is FSFS (I don’t know exactly for what its initials stand) which uses the native filesytem mechanisms for storage. In my example here and for my own use I choose FSFS as I think it is more often the better choice. Of most important note, FSFS supports remote filesystems over NFS and CIFS while BSB does not. FSFS is also easier to deal with when it comes to creating backups. My feeling is that unless you really know why you want to use BDB, stick with the default FSFS, there is a reason that it was selected as the default.
Another note about creating Subversion repositories: some sources recommend putting Subversion repos under /opt. All I have to say is “No No No!” The /opt filesystem is not appropriate for regularly changing data. Any data that is expected to change on a regular basis (e.g. log files, source code repos, etc.) belongs in /var. This is the entire purpose of the /var filesystem. It stands for “variable” and is purposed for regular filesystem changes. Files going to /var is another indicator that external network filesystem may be appropriate as well.
mkdir -p /var/projects/svn
At this point you can either use /var/svn as a normal or mounted remotely in some manner such as NFS, CIFS or iSCSI. Regardless of how the repository is set up the rest of this document will function identically.
We are now in a position to use svnadmin to create our repository directory:
svnadmin create /var/projects/svn/
At this point, Subversion should already be working for you. If you are new to Subversion, we will do a simple import to test our installation. To perform this test, create a directory called “testproject” and put it in the /tmp directory. Now touch a couple of files inside that directory so that we have something with which to work. Then we will do our first Subversion import.
mkdir /tmp/testproject; cd /tmp/testproject; touch test1 test2 test3
svn import tmp/testproject/ file:///var/projects/svn/test -m “First Import”
Your Subversion installation is now working, but few people will be happy accessing their Subversion repositories only from the local machine as we have done here. If you are used to working from the UNIX (Linux, Mac OSX, Cygwin, etc.) command line you may want to try accessing your new Subversion repository using SVN+SSH. Here is an example taken from an OpenSUSE workstation with the Subversion client installed:
svn list svn+ssh://myserver/var/projects/svn
testproject/
At this point you now have access from your external machines and can perform a checkout to get a working copy of your code. To make the process really simple be sure to set up your OpenSSH keys so that you are not prompted for a password. For many users, most notably Windows users, you are going to want access over the HTTP protocol since Windows does not natively support the SSH protocol.
The first thing that you are going to need to do, if you are running SELinux and Firewall security on your RHEL server like I am, is to open ports 80 and 443 in your firewall so that Apache is enabled. Normally I shy away from management tools but this one I like. Just use “system-config-securitylevel-tui” and select the appropriate services to allow.
You will also need to allow the Apache web server to write to the Subversion repository location within SELinux. To do so we can use the command:
restorecon -R /var/projects/svn/
We have one little trick that we need to perform. This trick is necessary because of what appears to be a bug in the way that Subversion sets the user ID when it runs. This is not necessary for all users but can be a pretty tough sticking point for anyone who runs into it and is not aware of what can me done to remedy the situation.
cp -r /root/.subversion/* ~apache/.subversion/
Configuring Apache 2 on Red Hat 5 is a little tricky so we will walk through it together. The first thing that needs to be added is the LoadModule line for the WebDAV protocol. This goes into the LoadModule section of the mail /etc/httpd/conf/httpd.conf configuration file.
LoadModule dav_module modules/mod_dav.so
The rest of our configuration changes for Apache 2 will go into a dedicated configuration file just for our subversion repository: /etc/httpd/conf.d/subversion.conf
I am including here my entire configuration file sans comments. You will need to modify your SVNPath variable accordingly, of course.
# grep -v \# /etc/httpd/conf.d/subversion.conf LoadModule dav_svn_module modules/mod_dav_svn.so <Location /svn> DAV svn SVNPath /var/projects/svn/ </Location>
At this stage you should now not only have a working Subversion repository but should be able to access it via the web. You can test web access from you local box with the svn command. Here is an example:
svn list http://localhost/svn/
References:
Mason, Mike. “Pragmatic Version Control Using Subversion, 2nd Edition“, Pragmatic Programmers, The. 2006.
Installing Subversion on Apache by Marc Grabanski
Subversion Setup on Red Hat by Paul Valentino
Setting Up Subversion and Trac As Virtual Hosts on Ubuntu Server, How To Forge
The SVN Book, RedBean
Additional Material:
Subversion Version Control: Using the Subversion Version Control System in Development Projects
This post helped a lot… Thanks a ton
Thanks for the guide; it really helped me. I have one question, though. Is there a way to force Apache to only respond to to https requests to the repo? Meaning, http://svn.domain.tld/repo will not work, but https://svn.domain.tld/repo will work? Thanks.
This link should help Jason:
http://www.google.com/search?q=RewriteHTTPToHTTPS.txt&rls=com.microsoft:en-us&ie=UTF-8&oe=UTF-8&startIndex=&startPage=1#hl=en&expIds=17259,25907,26637,27295,27404,27510,27583&sugexp=ldymls&xhr=t&q=Rewrite+HTTP+To+HTTPS&cp=21&pf=p&sclient=psy&rls=com.microsoft:en-us&aq=0&aqi=&aql=&oq=Rewrite+HTTP+To+HTTPS&gs_rfai=&pbx=1&fp=6a5522c36838bbe
PS: I do appreciate your notes as well. It is difficult to know who uses an article without having theses feedbacks.
But I do assure you, they do get used and it helps a load of people.
BIG THANKS.
svn: Local, non-commit operations do not take a log message
BIG UPS! Much respect, this actually works quite well. Rock on! 😀