Apache Suvbersion (SVN)

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
Julio Batista Silva
Engenheiro de Dados

Eu sou um engenheiro de computação apaixonado por ciência, tecnologia, fotografia e idiomas. Atualmente trabalhando como Engenheiro de Dados na Alemanha.

comments powered by Disqus