Svn post-commit auto update hook ohne Rechteprobleme (mal etwas anders)


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 🙂

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s