Setting Up A Subversion Repository Using Apache, With Auto Updatable Working Copy - Page 2

Want to support HowtoForge? Become a subscriber!
 
Submitted by fahdaziz (Contact Author) (Forums) on Mon, 2007-06-18 18:14. ::

Creating a repository:

Suppose I want to create a Repository at /usr/local/subversion/repository using fsfs database so execute the command:

mkdir -v /usr/local/subversion/

/usr/bin/svnadmin create --fs-type fsfs /usr/local/subversion/repository

That should create a subversion repository under /usr/local/subversion/repository.

ls /usr/local/subversion/repository

conf/  dav/  db/  format  hooks/  locks/  README.txt

You should be able to see those files under the repository directory.

 

Setting up httpd.conf to serve the created repository:

Add the following lines to httpd.conf or the appropriate apache configuration file.

<Location /subversion>

  DAV svn

  SVNPath /usr/local/subversion/repository/

</Location>

Make sure that the module mod_dav is loaded in the apache configuration file and is also present under modules directory.

 

Setting up authentication:

For the authentication we need to make changes to the apache configuration yet another time.

Basic authentication requires that we just add the following lines to the httpd.conf where we added the svn repository earlier.

AuthType Basic

AuthName "{Name of the authentication popup tab}"

AuthUserFile {Location of the password file}

Require valid-user

So it should look like this.

<Location /subversion>

  DAV svn

  SVNPath /usr/local/subversion/repository/

  AuthType Basic

  AuthName "Subversion repository"

  AuthUserFile /usr/local/subversion/repository/conf/svn-auth-file

  Require valid-user

</Location>

It is necessary that we add users to the password file before anyone can access it, which is described in the next step.

 

Adding SVN users:

Since we are using svn with an apache server, and an apache basic authentication method.

We need to create a password file with the htpasswd binary provided with a standard apache installation.

htpasswd -cmd /usr/local/subversion/repository/conf/svn-auth-file {user-name}

-c option creates a new htpasswd file.

-m encrypts the password with an MD5 algorithm.

-d encrypts the password with a CRYPT algorithm.

Where {user-name} stands for an actual user name that will be used for authentication.

Warning: We should not use the -c option once we have added the first user. Using so will create and replace all existing user within the file.

htpasswd -md /usr/local/subversion/repository/conf/svn-auth-file {user-name}

 

Setting up the initial repository layout:

A repository mostly contains 3 standard folders.

branches

tags

trunk

For creating those standard folders in a repository, create a temporary folder anywhere you want, /tmp would be a good idea, with the following subdirectories.

mkdir -pv /tmp/subversion-layout/{branches,tags}

After we have made all the layout folders, move all the contents of your project to the trunk folder.

mv -v /usr/local/apache2/htdocs /tmp/subversion-layout/trunk

Then make an initial import of the temporary created directory.

/usr/local/subversion/bin/svn import /tmp/subversion-layout/ http://127.0.0.1/subversion/

This will setup you up with a default repository layout, and make a first revision.

 

Setting up a working copy:

We can delete the temporary folders we created in the last step, since all the files are already in the repository.

Now what we need to do is to make a working copy of all the files in the repository under /usr/local/apache2/htdocs.

So that whenever a developer updates the php codes, they can see the code changes taking effect in a working environment.

But setting up a working copy would not accomplish this task, we would need to make the hook scripts to work with a working copy.

Thus, whenever a developer commits to the repository, the hook script will run itself, and update the working copy.

Make sure that htdocs folder under /usr/local/apache2/doesn’t already exist.

If you want you can rename it to htdocs_old.

To setup a working copy, do the following.

cd /usr/local/apache2/

su – apache

/usr/local/subversion/bin/svn checkout http://127.0.0.1/subversion/trunk/ htdocs

 

Setting up the hook scripts:

A hook is a program triggered by some repository event, such as the creation of a new revision or the modification of an unversioned property. Each hook is handed enough information to tell what that event is, what target(s) it's operating on, and the username of the person who triggered the event. Depending on the hook's output or return status, the hook program may continue the action, stop it, or suspend it in some way.

The hooks subdirectory is, by default, filled with templates for various repository hooks.

post-commit.tmpl          post-unlock.tmpl          pre-revprop-change.tmpl

post-lock.tmpl            pre-commit.tmpl           pre-unlock.tmpl

post-revprop-change.tmpl  pre-lock.tmpl             start-commit.tmpl

For now, I will be discussing about the post-commit hook script, since that is what we need in our case.

Copy the post-commit.tmpl file into post-commit in the same hooks directory, and give post-commit execution rights.

cp -v /usr/local/subversion/repository/hooks/post-commit.tmpl /usr/local/subversion/repository/hooks/post-commit

chmod +x /usr/local/subversion/repository/hooks/post-commit

Now edit the post-commit script and comment the follow two lines at the bottom, and add the following line to it.

#commit-email.pl "$REPOS" "$REV" commit-watchers@example.org

#log-commit.py --repository "$REPOS" --revision "$REV"

/usr/bin/svn update /usr/local/apache2/htdocs/ >> /usr/local/subversion/repository/logs/post-commit.log

After doing that, make a new folder logs, under /usr/local/subversion/ so that we can enable logging, and create a blank the post-commit.log file.

mkdir -v /usr/local/subversion/repository/logs/

touch /usr/local/subversion/repository/logs/post-commit.log

Once again, we need to make sure the repository folder has the proper user ownership, it is advised to set ownership on /usr/local/subversion/repository/ for user apache.

chown -Rv apache.apache /usr/local/subversion/repository/

If all goes well, that's should be it.

You now have a working subversion repository server up which is ready for further imports, as soon as you start the apache server.


Please do not use the comment function to ask for help! If you need help, please use our forum.
Comments will be published after administrator approval.
Submitted by Noah (not registered) on Tue, 2008-10-28 22:51.

Everything is working except the last auto update bit... The post-committ log file is writing: "Skipped '/usr/local/apache2/htdocs'", which is strange because the directory exists, and when I run the full command outside of the post-committ file, everything updates normally.

 What gives?

Submitted by Zlatan Momic (not registered) on Wed, 2008-12-17 16:21.

Yes, content of post-commit was the problem, cause it has been launched under user apache:apache which has /sbin/nologin option in /etc/passwd, at least on my system. So no one ever accessed /usr/bin/svn update and enetered user and pass for svn repo using user apache. In this case this helps:

chown -Rv apache.apache /usr/local/subversion/ /usr/local/apache2/

and in post-commit you type:

/usr/bin/svn update /usr/local/apache2/htdocs/ --username svn_user --password svn_pwd --non-interactive >> /usr/local/subversion/repository/logs/post-commit.log

 Cheers!