Seit ein paar Tagen setze ich mich wieder intensiv mit dem Zend Framework auseinander und bastle an einer Applikation. Um meine Änderungen einfach nachzuverfolgen habe ich mir ein Subversion-Repository auf meinem Server eingerichtet. Um in verschiedenen Testumgebungen die Applikation testen zu können, soll diese automatisch in einen Webroot “deployed” werden. Hierzu habe ich ein kleines Skript geschrieben, welches sind an den post-commit-Mechanismus von Subversion hängt und darüber den Export steuert.

Die Funktionsweise ist simpel, es wird einfach ein Checkout des Repository gemacht and anschließend bei jedem commit ein “svn update” auf das Checkout-Verzeichnis. Zunächst wird daher in den Webroot gewechselt, wo das Update hin soll. Dort wird der Checkout ausgeführt:

1
svn co http://your.reposito.ry/trunk/ .

Dankbarerweise werden die Userdaten im Cache abgelegt, daher sollte man die .svn-Verzeichnisse über eine Direktive schützen, sodass diese nicht für Webserver-Nutzer abrufbar sind. Für den Apache sieht das so aus:

1
2
Order deny,allow
Deny from all

Doch nun zum eigentlichen Script. Dieses Skript legt man als “post-commit-export.sh” im “hook”-Verzeichnis des SVN-Verzeichnisses auf dem Server ab:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/bin/sh
#############################################
# SVN-Deployment-Script for post-commit by: #
# Ulrich Wolf - https://wolf-u.li #
#############################################

# Configure this:
# Where did you checkout your SVN?
EXPORTDIR="/var/www/your/export/webroot/"
# To which user should be chown?
USER="someuser"
GROUP="somegroup"
# Maximum number of tries to update while a lockfile is present?
MAXTRIES=10
# How long should the script wait until the next try?
WAITTIME=20

# Don't touch the stuff below!
REPOS="$1"
REV="$2"
LOCKFILE=".post-commit.lock"

T=0
SUCCESS=0

(
while [ $T -lt $MAXTRIES ]
do
 if [ ! -e $LOCKFILE ]; then
 trap 'rm -f "$LOCKFILE"; exit $?' INT TERM EXIT
 touch "$LOCKFILE"
 sleep 5
 svn update -r $REV $EXPORTDIR
 chown $USER:$GROUP -R $EXPORTDIR
 rm -f "$LOCKFILE"
 trap - INT TERM EXIT
 SUCCESS=1
 break
 else
 sleep $WAITTIME
 let T++
 fi
done
) > /dev/null 2>&1 &

Nun muss es noch eingebunden werden. Dazu muss in die Datei “post-commit” folgende Zeile eingetragen werden:

1
hooks/post-commit-exporter.sh $1 $2

Die Dateien post-commit-exporter.sh und post-commit müssen dann noch mit dem Ausführungsbit gekennzeichnet werden:

1
chmod +x post-commit post-commit-exporter.sh

Und das wars ;)