jueves, 24 de noviembre de 2011

svn + ssh

Servidor SVN accesible mediante SSH

¿Porque?
El usar conexiones SSH para manejar repositorios de subversion, nos da seguridad al manejar la capa cifrada del SSH, ademas de que podremos hacer uso de los usuarios en el S.O. para el acceso a los repositorios en lugar de estar creando usuarios y contrasenias individuales solo para acceder a los repos.

Como se hace
  1. Instalar subversion
    yum install subverison
  2. Crear un grupo de usuarios para subversion
    groupadd -g 800 svn
  3. Crear el directorio donde estaran los repositorios
    mkdir -p /usr/local/svn/repos
  4. Dar pertenencia de grupo al directorio para que los usuarios puedan escribir en el
    chown -R :svn  /usr/local/svn
    chmod -R 775 /usr/local/svn/repos
  5. Crear un repositorio con svnadmin
    svnadmin create /usr/local/svn/repos/mi_repo
  6. Agregar al grupo a los usuarios que modificaran los repos
    usermod -G svn fulanito
  7. Crear un wrapper para evitar problemas de permisos al acceder por ssh.
    Cuando se esta ejecutando el servidor de subversion y es accedido por ssh, el demonio crea una instancia de si mismo con nuestro propio usuario (por ejemplo svnserve ejecutado por fulanito) y por default los permisos de archivos creados seran de solo lectura y escritura para el usuario que los creo. Para evitar esto hay que colocar un script que sirva de wrapper, como el siguiente:

    #!/bin/sh
    # permite escritura al grupo
    umask 002

    # invocamos a svnserve, pasando como argumentos el directorio de los repos
    exec /usr/bin/svnserve "$@" -r /usr/local/svn/repos
  8. Guardamos este script como /usr/local/bin/svn
  9. Lanzamos svnserve como demonio
    /usr/bin/svnserve -d -r /usr/local/svn/repos
  10. Ahora los clientes se podran conectar a servidor/mi_repo
    svn list svn+ssh://servidor/mi_repo


Troubleshooting

  • Revisar que la creacion del repositorio y el directorio root de svnserve sea coherente, por ejemplo si se uso como root directory /usr/local/svn/ y se hizo svnadmin create /usr/local/svn/puppet entonces los clientes haran el checkout con svn co svn+ssh://noc2/puppet