Apache Suvbersion (SVN)

nov. 1, 2011·
Julio Batista Silva
Julio Batista Silva
· 5 min de lectura
blog Programação

Subversion (SVN) é um sistema de controle de versão (VCS) open source que surgiu para substituir o limitado CVS. O SVN gerencia arquivos e diretórios e as alterações realizadas sobre eles através do tempo. Isso nos permite recuperar versões antigas dos seus dados ou examinar o histórico de mudanças.

Apesar de eu não ser muito fã do subversion (Git FTW!), eu também não o odeio, como o Linus e já precisei usar para um projeto na faculdade.

  1. Efetue as instalações e configurações iniciais

    1. Instale o Subversion

      julio@julio-acer ~> sudo pacman -S subversion
      
    2. Instale o Apache

      julio@julio-acer ~> sudo pacman -S apache
      

      Dicas para configurar o Apache estão disponível na Wiki.

    3. Verifique se as seguintes linhas estão presentes no

      /etc/httpd/conf/httpd.conf e adicione as que não estiverem:
          LoadModule dav_module           modules/mod_dav.so
          LoadModule dav_fs_module        modules/mod_dav_fs.so
          LoadModule dav_svn_module       modules/mod_dav_svn.so
          LoadModule authz_svn_module     modules/mod_authz_svn.so
      
    4. Certifique-se de que a linha Include /etc/httpd/conf/extra/httpd-ssl.conf está descomentada no /etc/httpd/conf/httpd.conf

    5. Gere um certificado SSL

      [root@julio-acer ~]# cd /etc/httpd/conf/
      [root@julio-acer conf]# openssl req -new -x509 -keyout server.key -out server.crt -days 365 -nodes
      Generating a 1024 bit RSA private key
      ..++++++
      ........++++++
      writing new private key to 'server.key'
      -----
      You are about to be asked to enter information that will be incorporated
      into your certificate request.
      What you are about to enter is what is called a Distinguished Name or a DN.
      There are quite a few fields but you can leave some blank
      For some fields there will be a default value,
      If you enter '.', the field will be left blank.
      -----
      Country Name (2 letter code) [AU]:BR
      State or Province Name (full name) [Some-State]:Sao Paulo
      Locality Name (eg, city) []:Sao Jose dos Campos
      Organization Name (eg, company) [Internet Widgits Pty Ltd]:
      Organizational Unit Name (eg, section) []:
      Common Name (eg, YOUR name) []:Julio
      Email Address []:julio@…
      
    6. Adicione as seguintes linhas ao arquivo

      `/etc/httpd/conf/extra/httpd-ssl.conf` para fazer o Apache suportar SVN
          ## Para o SVN
          <Location /svn>
              DAV svn
              SVNParentPath /srv/svn/repositorios
              AuthName "SVN Repositories"
              AuthType Basic
              AuthzSVNAccessFile /srv/svn/svn-policy
              AuthUserFile /srv/svn/svn-auth
              Satisfy Any
              Require valid-user
          </Location>[/sourcecode]
      
  2. Configure os diretórios, usuários e permissões

    1. Crie um grupo para acesso ssh aos repositórios

      [root@julio-acer ~]# groupadd svnusers
      
    2. Crie um diretório onde todos os repositórios serão mantidos

      julio@julio-acer ~> mkdir -p /srv/svn/repositorios
      julio@julio-acer ~> chmod -R 755 /srv/svn/repositorios
      

      Este diretório pode ser criado em outro local. Aqui deixei no /srv/svn pois é o diretório que utilizei quando instalei o rTorrent a partir do SVN, conforme esse Post.

    3. Garanta a você e ao Apache acesso aos repositórios

    julio@julio-acer ~> sudo gpasswd -a http svnusers
    Adding user http to group svnusers
    julio@julio-acer ~> sudo gpasswd -a julio svnusers
    Adding user julio to group svnusers
    

    Faça logout para ter efeito.

  3. Crie o arquivo /srv/svn/svn-policy e deixe-o parecido com o seguinte

    julio@julio-acer ~> cat /srv/svn/svn-policy
    [/]
    * = r
    
    [projeto:/]
    julio = rw
    
  4. Crie o arquivo /srv/svn/svn-auth com o htpasswd ou o htdigest

    [root@julio-acer ~]# htpasswd -cs /srv/svn/svn-auth julio
    New password:
    Re-type new password:
    Adding password for user julio
    

    Para adicionar outros usuários basta tirar o -c do comando.

  5. Crie um repositório

    julio@julio-acer ~> svnadmin create /srv/svn/repositorios/projeto
    
    1. Altere as permissões

      julio@julio-acer ~> sudo chown -R http.svnusers /srv/svn/repositorios/projeto
      julio@julio-acer ~> sudo chmod -R g-w /srv/svn/repositorios/projeto
      julio@julio-acer ~> sudo chmod -R g+w /srv/svn/repositorios/projeto/{db,locks}
      
  6. Estrutura de um repositório

    A estrutura típica de um repositório se parece com o seguinte:

    project
    |--branches
    |--tags
    |--trunk
    
    • Branches: Guarda cópias dos arquivos sendo desenvolvidos ou em manutenção, mas em uma linha de desenvolvimento separada. Por exemplo, o código para a v4 pode estar dentro de um Branchpara permitir pessoas trabalharem em mudanças futuras que não serão implementadas tão cedo. Isso permite elas fazerem seu trabalho sem colocar código prematuramente no trunk.

    • Tags: Guarda cópias do software em seus vários estágios de desenvolvimento, como v1, v2 e v3.

    • Trunk: - É usada para manter a versão estável mais atualizada do software.

  7. Colocando um projeto sob controle de versão Supondo que já temos um projeto chamado codefest, vamos importar os seus arquivos para a pasta trunk do repositório “projeto”:

    julio@julio-acer ~> svn import ~/codefest/ file:///srv/svn/repositorios/projeto/trunk -m 'importacao inicial'
    Adding         /home/julio/codefest/amostras
    Adding  (bin)  /home/julio/codefest/amostras/codefest.xls
    Adding         /home/julio/codefest/amostras/imagens
    Adding  (bin)  /home/julio/codefest/amostras/imagens/1.jpg
    Adding  (bin)  /home/julio/codefest/amostras/imagens/2.jpg
    Adding  (bin)  /home/julio/codefest/amostras/imagens/3.jpg
    Adding         /home/julio/codefest/amostras/codefest.txt
    Adding         /home/julio/codefest/código
    Adding         /home/julio/codefest/código/matching.py
    Adding         /home/julio/codefest/código/color_name.py
    Adding         /home/julio/codefest/código/inicializador.py
    Adding         /home/julio/codefest/código/image.py
    Adding         /home/julio/codefest/código/dominant_color.py
    
    Committed revision 1.
    

    Para listar o diretório trunk após o commit, basta usar o seguinte comando

    julio@julio-acer ~> svn ls file:///srv/svn/repositorios/projeto/trunk
    amostras/
    código/
    
  8. Checkout

    julio@julio-acer ~> svn co file:///srv/svn/repositorios/projeto/trunk ~/codefest-svn
    A    /home/julio/codefest-svn/amostras
    A    /home/julio/codefest-svn/amostras/codefest.xls
    A    /home/julio/codefest-svn/amostras/imagens
    A    /home/julio/codefest-svn/amostras/imagens/1.jpg
    A    /home/julio/codefest-svn/amostras/imagens/2.jpg
    A    /home/julio/codefest-svn/amostras/imagens/3.jpg
    A    /home/julio/codefest-svn/amostras/codefest.txt
    A    /home/julio/codefest-svn/código
    A    /home/julio/codefest-svn/código/matching.py
    A    /home/julio/codefest-svn/código/color_name.py
    A    /home/julio/codefest-svn/código/inicializador.py
    A    /home/julio/codefest-svn/código/image.py
    A    /home/julio/codefest-svn/código/dominant_color.py
    Checked out revision 1.
    
  9. Protocolos

    • file:// → Básico, mas você só poderá trabalhar na mesma máquina que hospeda os repositórios.
    • svn:// → Utiliza um servidor para comunicar com o Subversion (Apache neste caso).
    • svn+ssh:// → Utiliza SSH para comunicar com o servidor
    • http:// → Amigável, utiliza WEBDAV para permitir comunicação via HTTP com os repositórios do Subversion.
    • https:// → Como o http, porém com criptografia SSL
  10. Reinicie o Apache

    julio@julio-acer ~> sudo /etc/rc.d/httpd restart
    Password:
    :: Restarting Apache Web Server                             [DONE]
    

    Agora você deve conseguir navegar pelo projeto acessando https://localhost/svn/projeto/.


Julio Batista Silva
Autores
Senior Cloud Developer

Soy un ingeniero informático brasileño radicado en Alemania, apasionado por la tecnología, la ciencia, la fotografía y los idiomas.

Llevo programando cerca de dos décadas, explorando desde apps móviles y desarrollo web hasta aprendizaje automático. Hoy me enfoco en SRE en la nube e ingeniería de datos.

Soy voluntario en las comunidades de open source y Python, ayudando a organizar PyCon DE y PyData Berlin, dando mentorías y contribuyendo con código y traducciones.

En mi blog comparto consejos de Linux, guías de configuración y notas personales que escribí como referencia futura. Espero que también sean útiles para otras personas. El contenido está disponible en varios idiomas.

Visita mi galería para ver algunas de mis fotografías.

Fuera del teclado, me encontrarás en conciertos, tocando el clarinete, en bicicleta, buceando o explorando nuevos lugares, culturas y cocinas.

¡Siempre feliz de conectar! 🙂

comments powered by Disqus