Ein typisches Szenario im Webdevelopement ist ein Subversion Repository und ein Entwicklungsserver der automatisch geupdated werden soll, sowie ein Entwickler etwas committed. Das hierfür notwendige post-commit hook läuft mit den Rechten des committenden Users, so dass alle neuen Dateien von den anderen nicht mehr geschrieben werden dürfen… Keine Ahnung, wieso es dafür keine elegante Lösung gibt. Im Netz findet man häufig als Workaround ein compiliertes C Programm, welches immer als gleicher User ausgeführt wird. Es geht aber auch anders, und zwar so:
Voraussetzung:
– SVN Repository (hier /var/svn/project/trunk), Zugriff mit svn+ssh://
– Webserver (hier mit DocumentRoot in /var/www/project/dev)
– Eine Gruppe für SVN, der alle Entwickler angehören (hier subversion)
Für das Update benötigen wir einen eigenen User mit SSH Schlüsselpaar und Berechtigungen für das entsprechende DocumentRoot, im post-commit hook loggen wir uns einfach per SSH als Update-User auf die lokale Maschine ein und führen das Update durch. Klingt irgendwie nach „von hinten durch’s Auge“, hat aber sogar den Vorteil, dass das ganze auch dann funktioniert, wenn Repository und Webserver tatsächlich auf unterschiedlichen physikalischen Maschinen laufen.
1. User anlegen und SSH Schlüsselpaar erzeugen (ohne Passphrase)
adduser updater addgroup subversion updater su updater cd ~ mkdir .ssh chmod 700 .ssh ssh-keygen -t rsa
2. Public Key zu den authorisierten SSH Schlüsseln hinzufügen
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys2 chmod 600 ~/.ssh/authorized_keys2
3. Private Key für alle Entwickler (= alle User in der Gruppe subversion) zugänglich machen
cp ~/.ssh/id_rsa /var/svn/hooks/id_rsa chmod 640 /var/svn/hooks/id_rsa_updater chown updater:subversion /var/svn/hooks/id_rsa_updater
4. Document Root anlegen und Projekt erstmalig auschecken
su root mkdir /var/www/project/dev chown updater /var/www/project/dev su updater cd /var/www/project/dev svn checkout file:///var/svn/project/trunk/ ./
5. post-commit hook anlegen
mv /var/svn/hooks/post-commit /var/svn/hooks/post-commit.bak echo '#!/bin/sh' > /var/svn/hooks/post-commit echo 'ssh -i /var/svn/hooks/id_rsa_updater updater@127.0.0.1 svn up /var/www/project/dev' >> /var/svn/hooks/post-commit chmod 755 /var/svn/hooks/post-commit
6. Da beim erstmaligen Ausführen der RSA key fingerprint in den known_hosts abgelegt werden muss, muss das post-commit Script zunächst einmalig von jedem Entwickler in der Konsole ausgeführt werden.
su sui /svn/hooks/post-commit The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established. RSA key fingerprint is 81:7c:e0:bd:7a:c8:e5:56:0a:c8:7f:95:0c:b1:6a:d0. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '127.0.0.1' (RSA) to the list of known hosts. At revision 74.
Fertig 🙂