Como criar e usar um servidor Subversion (SVN)
Resumo
Subversion é um software muito usado para controle de versões de sistemas. Muitas vezes desenvolvemos um projeto e precisamos ter um bom controle do seu versionamento, nesse caso o svn é uma ferramenta muito interessante.
Introdução
Nesse documento estão descritas algumas maneiras de configurar um servidor svn e alguns comandos úteis para usá-lo.
Os pacotes necessários para a instalação e configuração são os seguintes:
httpd [ou apache ou apache2 (depende da distribuição)]
subversion
mod_dav_svn [ou subversion-server ou libapache2-svn (depende da distribuição)]
Partiremos do princípio que os pacotes do httpd já estejam instalados na máquina que será o servidor svn. Para outras informações úteis sobre svn temos "Apresentação da Ferramenta de Versionamento" e "Comandos úteis".
1. Site oficial
2. Instalando os pacotes svnComo o yum calcula as dependências automaticamente, podemos iniciar com o módulo para o protocolo httpd (apache), que o servidor svn será juntamente instalado. # yum -y install mod_dav_svnResolved =================================================== Package Arch Version Repository Size =================================================== Installing: mod_dav_svn i386 1.4.2-2.fc6 updates 70 k subversion i386 1.4.2-2.fc6 updates 2.3 M Transaction Summary =================================================== Install 2 Package(s) Update 0 Package(s) Remove 0 Package(s) 3. Criar um repositório svn no servidorNos passos abaixo usaremos um repositório chamado /var/svn, mas se desejar criá-lo em /home/usuário/svn, ou em qualquer outro local desejado, basta trocar /var/svn pelo qual será usado em seu servidor. Antes de criar o repositório precisamos ter o diretório correspondente no sistema, por isso, use o comando abaixo para criá-lo: # mkdir /var/svn Agora vamos executar o comando necessário para criar o repositório /svn, vale lembrar que o comando abaixo deve ser executado em um diretório vazio, porém, já existente no sistema, pois o subversion irá apenas criar a estrutura necessária para o controle de versões, então execute o comando abaixo para tal procedimento: # svnadmin create /var/svn Vale uma observação aqui, até a versão 1.1 do subversion, o tipo de repositório padrão era o Berkeley DB, mas a partir da versão 1.2 o padrão passou a ser o FSFS. O suporte FSFS apareceu na versão 1.1. Na 1.0 apenas o Berkeley DB era suportado. Para especificar o tipo do repositório pode-se usar o argumento --fs-type: # svnadmin create --fs-type fsfs /var/svn; ou # svnadmin create --fs-type bdb /var/svn O repositório criado estará vazio e começará a contar a partir da revisão 0 (zero), a qual corresponderá à sua criação. Para mais informações sobre o tipo do repositório acesse:
|
Customizando o servidor SVN4. svnserve, um servidor customizadoO programa svnserve é um servidor leve, capaz de comunicar-se com clientes através de TCP/IP utilizando um protocolo customizado. Clientes podem contatar um servidor svnserve através de URLs iniciadas por svn:// ou svn+ssh://. Neste tópico iremos explorar as diferentes maneiras de executar o svnserve, como os clientes se autenticam com esse servidor e como configurar controles de acessos apropriados para seus repositórios. 4.1. Iniciando o servidor
Quando iniciado com a opção --inetd, o svnserve espera comunicar-se com um cliente Subversion através da entrada e saída padrão (stdin e stout) utilizando um protocolo customizado, um comportamento padrão para programas executados via inetd. A IANA (Internet Assigned Numbers Authority) reservou a porta 3690 para o protocolo Subversion, então em um sistema UNIX podemos adicionar as seguintes linhas ao arquivo /etc/services (se já não estiverem lá): svn 3690/tcp # Subversion svn 3690/udp # Subversion
(svnserve agora está rodando, escutando a porta 3690) Ao rodar o svnserve em modo daemon, você pode usar a opção --listen-port e --listen-host para customizar a porta e hostname nos quais o "bind" será efetuado. Há ainda uma terceira maneira para invocar o svnserve, em modo "tunelamento", com a opção -t. Este modo assume que um programa de serviço remoto como RSH ou SSH autenticou com sucesso um usuário e está invocando um processo svnserve privado como aquele usuário. O programa svnserve atua de maneira normal, assumindo que o tráfego está sendo automaticamente redirecionado por algum tunelamento para o cliente. Quando o svnserve for invocado por um tunelamento, como descrito, certifique-se de que o usuário autenticado tem permissão total de leitura e escrita no repositório. É essencialmente o mesmo procedimento de um usuário local acessando o repositório através do método file:///. /> Autenticação e autorização integrada Quando um cliente se conecta a um processo svnserve, as seguintes situações acontecem:
Até o momento, o svnserve só é compatível com o método de autenticação CRAM-MD5. Essencialmente, o servidor envia um pacote de dados ao cliente, que usa um algoritmo de hash MD5 para criar uma assinatura dos dados e da senha combinados, e então a envia como resposta. O servidor calcula a assinatura em conjunto com a senha local para verificar que o resultado é idêntico. Em nenhum momento a senha do usuário atravessa a rede. Obviamente, também é possível que o cliente seja autenticado externamente através de um agente de tunelamento, como o SSH. Neste caso, o servidor simplesmente examina o usuário com o qual está executando e o utiliza para acessar o repositório. Como você já deve ter desconfiado, o arquivo svnserve.conf de um repositório é o mecanismo central de controle de autenticação e autorização. O arquivo tem o seguinte formato: seções são identificadas por colchetes - [], comentários são iniciados por cerquilha - #, e cada seção contém variáveis que podem ser ajustadas - variável = valor. 4.2. Criando um arquivo e domínio 'users'Por ora, a seção [general] do arquivo svnserve.conf contém todas as variáveis de nosso interesse. Defina inicialmente um arquivo contendo usuários e senhas, bem como um domínio de autenticação:[general] password-db = userfile realm = domínio exemplo O domínio é um nome definido pelo administrador que indica aos clientes o domínio de autenticação ao qual estão se conectando; o cliente Subversion mostra esse domínio no prompt de autenticação, e o utiliza como uma chave (juntamente com o hostname do servidor e a porta) para fazer cache de credenciais no disco. A variável password-db aponta para um arquivo em separado que contém uma lista de usuários e senhas, utilizando o mesmo formato. Por exemplo: [users] joao = foopassword maria = barpassword O valor de password-db pode ser qualquer caminho absoluto ou relativo de diretórios até o arquivo users. Para muitos administradores, é conveniente manter o arquivo dentro do diretório conf/ do repositório, juntamente com svnserve.conf. Por outro lado, é possível que você deseje que dois ou mais repositórios compartilhem o mesmo arquivo users, caso em que o arquivo provavelmente deveria ficar em um local de acesso mais irrestrito. Os repositórios compartilhando o arquivo users poderiam ainda ser configurados para ter o mesmo domínio, já que uma lista de usuários define essencialmente um domínio. Qualquer que seja o diretório onde se encontra o arquivo, certifique-se de que as permissões de leitura e escrita estão ajustadas corretamente. 4.3. Ajuste de controle de acessoHá ainda duas variáveis interessantes a serem ajustadas em svnserve.conf: elas determinam o que usuários não-autenticados (anônimos) e usuários autenticados poderão fazer no repositório. As variáveis anon-access e auth-access podem ser ajustadas para os valores none, read ou write. Ajustando o valor para none restringe qualquer tipo de acesso; read permite acesso somente de leitura e write permite acesso completo de leitura e escrita ao repositório. Por exemplo:[general] password-db = userfile realm = domínio exemplo # usuários anônimos podem apenas ler do repositório anon-access = read # usuários autenticados podem ler e escrever auth-access = write Essas configurações de exemplo são, de fato, os valores padronizados para as variáveis, caso não sejam definidas. Se você deseja ser ainda mais conservativo, você pode bloquear acesso anônimo por completo: [general] password-db = userfile realm = domínio exemplo # usuários anônimos não são autorizados anon-access = none # usuários autenticados podem ler e escrever auth-access = write Observe que o svnserve suporta apenas controle de acesso por usuário. Um usuário pode ou ter acesso universal de leitura e escrita, acesso universal de leitura ou nenhum acesso. Não há controle detalhado sobre diretórios específicos do repositório, o que, para muitos projetos, é suficiente e adequado. No entanto, se você necessita de controle de acesso por diretório, será necessário utilizar o mod_authz_svn do Apache (a ser visto no tópico seguinte), ou utilizar um hook pre-commit para controlar acesso de escrita. O controle de acesso via tunelamento é bastante semelhante ao descrito anteriormente, mas, dada a especificidade do tema, deixamos aqui o link do SVN Book que explica esse tópico em maior detalhe aos alunos interessados nesse tipo de configuração:
|
Configurando o apache para conexões http com svn5. Configurar o apache para conexões http com svnO apache é usado porque além de ser o servidor http mais usual, através do módulo mod_dav_svn.so ele consegue acessar um repositório svn e torná-lo acessível para clientes que usam o protocolo WebDAV? /DeltaV, (é o caso do comando svn, o qual veremos ainda neste documento), ele é uma extensão do protocolo HTTP. ou # rpm -ql mod_dav_svn |grep subversion.conf Por isso, neste documento, trataremos o arquivo de configuração apenas por: subversion.conf. Vamos abordar duas formas de configuração, são elas:
Antes de tudo faça um backup do arquivo de configuração original: # cp subversion.conf subversion.conf.orig No Fedora Core este arquivo já virá pré configurado, necessitando apenas completar alguns pontos das configurações vista neste documento.6. Ajustar o dono do svnComo vamos configurar o apache para o gerenciamento do repositório, é importante configurarmos o seu dono, pois estaremos lendo e escrevendo no svn através do protocolo HTTP. Mude o dono do diretório /var/svn de root para apache: # chown -R apache.apache /var/svn Essa modificação é necessária para que o svn fique acessível via http. Caso o usuário root continuasse como dono do diretório e dos demais arquivos, o apache não teria permissões para acessá-los. Em algumas distribuições o usuário chama-se www ao invés de apache, verifique o nome do usuário do apache antes de executar esse comando.7. Acesso irrestrito para leitura e escritaAbaixo segue um exemplo de configuração do arquivo subversion.conf para o acesso sem senha. Use-o caso deseje configurar um servidor svn sem senha. # início do arquivo subversion.conf LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so <Location /var/svn> DAV svn SVNPath /var/svn # desativar senha SVNPathAuthz off </Location>
8. Acesso irrestrito para leitura e acesso restrito para escritaAbaixo segue um exemplo de configuração do arquivo subversion.conf para o acesso com senha. Use-o caso deseje configurar um servidor svn com senha para escrita. # início do arquivo subversion.conf LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so <Location /var/svn> DAV svn SVNPath /var/svn # autenticando um usuário AuthType Basic AuthName "Subversion repository" AuthUserFile /etc/httpd/securety/svn-passwd # qualquer operação que não seja # leitura requer um usuario valido LimitExcept GET PROPFIND OPTIONS REPORT> Require valid-user </LimitExcept> </Location>Mais informações sobre como configurar o arquivo subversion.conf. 9. Criar o arquivo de senhaSe o svn foi configurado com senha, como em um dos exemplos acima, será necessário criar o arquivo /etc/httpd/securety/svn-passwd ou o correspondente da sua configuração, onde serão armazenados os usuários, os quais terão acesso de escrita no repositório /var/svn e suas respectivas senhas. Ele pode ser criado por meio do seguinte comando: # htpasswd -c /etc/httpd/securety/svn-passwd user O comando acima cria o arquivo /etc/httpd/securety/svn-passwd e pede que a senha do usuário user seja informada. Para adicionar um novo usuário pode-se usar o comando abaixo: # htpasswd /etc/httpd/securety/svn-passwd brito O usuário digita a senha e o arquivo é automaticamente atualizado. Ou o usuário executa o seguinte comando: # htpasswd -n brito New password: Re-type new password: brito:QVZvldBtl6gZw Envia o resultado do comando (em azul) para o administrador do svn e ele inclui o usuário e a sua respectiva senha no arquivo correspondente.10. Tornar o svn disponível no apachePara efetivar as configurações e tornar o svn acessível através da url: http://nome_do_servidor/svn, precisamos iniciar o apache caso ele esteja parado ou reiniciá-lo, se ele já estiver sendo executado na máquina. O comando abaixo reinicia o apache estando ele ligado ou desligado: # service httpd stop && service httpd start; ou # service httpd restart; ou # /etc/init.d/httpd restart Observe que o comando pode ser diferente dependendo da distribuição que estiver sendo usada, ou seja, ao invés de httpd pode ser apache ou até mesmo apache2. Agora o seu repositório svn já pode ser acessado, usando um navegador qualquer, através do endereço: http://servidor/svn Se o servidor svn foi configurado em sua rede, em casa, e não há nenhum dns configurado, para responder pelos nomes das máquinas, pode-se usar apenas o ip do servidor: http://ip_do_servidor/svn Alguns comandos úteis para manusear projetos no svn configurado. Após criarmos um repositório svn é interessante conhecermos alguns comandos que possibilitam o manuseio desta ferramenta. Se uma das variáveis de ambiente $SVN_EDITOR, $VISUAL ou $EDITOR não estiverem definidas, provavelmente uma mensagem de erro, semelhante a que segue abaixo, será exibida ao tentar efetuar uma alteração no svn. svn: Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the --message (-m) or --file (-F) options svn: None of the environment variables SVN_EDITOR, VISUAL or EDITOR is set, and no 'editor-cmd' run-time configuration option was found Para definir o editor de texto padrão, o qual será usado para escrever os logs dos commits, pode-se usar a seguinte linha de comando: # export SVN_EDITOR='vim' Acima definimos que o editor padrão será o vim. * Para que todos os usuários tenham essa variável configurada, basta adicionar a linha de comando acima no arquivo /etc/profile. Criar um diretório no svn. Antes de adicionarmos um projeto em nosso repositório precisamos criar o diretório onde ele ficará armazenado. Pode-se fazer isso através do seguinte comando: # svn mkdir http://servidor/svn/projeto
|
Gerenciando projetos e arquivos no svn11. Importar um projeto para o svnAlgumas vezes já temos um projeto em algum canto de nossa máquina. Importe-o para o svn usando a linha de comando abaixo: O comando acima importará todos os arquivos do diretório /tmp/projeto para o repositório projeto em http://servidor/svn/ Uma outra maneira de executar o procedimento acima é acessar o diretório e então importá-lo para o svn: # cd /tmp/projeto # svn import http://servidor/svn/projeto 12. Baixar um projeto do svnQuando for preciso efetuar modificações em um projeto que já está no svn, antes é preciso fazer o checkout, ou seja, efetuar o download dos arquivos correspondentes ao projeto. 13. Efetivar alterações em um projeto do svnDepois de concluídas as modificações necessárias precisamos colocar a nova revisão do projeto no svn, para isso precisamos efetuar um commit (check in). ou # svn ci 14. Listar arquivos de um projetoDepois de efetuar várias mudanças em um projeto baixado do svn, é importante poder listar o seu conteúdo e saber quais arquivos estão armazenados e quais não estão no seu respectivo repositório no svn. 15. Adicionar arquivos a um projetoNo decorrer de um projeto novos arquivos surgem e precisam ser adicionados no repositório svn. Quando o commit for efetuado, o arquivo projeto.c será adicionado à árvore correspondente do projeto em que estava trabalhando. Remover arquivos de um projeto: A medida que arquivos vão sendo incluso no projetos, há a necessidade de excluir alguns. Use o seguinte comando para efetuar tal operação: # svn rm projeto.c É possível remover um projeto inteiro do svn, para isto basta executar: # svn rm http://servidor/svn/projeto Quando o commit for efetuado, o arquivo projeto.c será removido da árvore onde ele era armazenado e na nova revisão ele não fará mais parte do projeto. 16. Verificar as alterações antes de efetuar um commitNa maioria das vezes é interessante, antes de efetuar o commit, verificar quais são as modificações. Jogando a saída para um editor de texto, no caso o vim (Sistemas Operacionais Unix Like): # svn diff | vim - Lembrando que o comando acima mostra as diferenças do diretório onde foi executado e o seu correspondente no svn. Para verificar todas as modificações de um projeto, basta executá-lo na raiz principal dele. 17. Verificar o log de um projetoMuitas vezes esquecemos o que fizemos, por isso, ao efetuar um commit o svn sempre pede uma mensagem para ser adicionada ao log do projeto. 18. Obter ajuda dos próprios comandosPara verificar os comandos disponíveis use: Uma série de comandos, possíveis, será listada. Para obter informações sobre um comando em específico use: # svn comando --help 20. Obter Status# svn stLegenda:
|
Dicas adicionais e bibliografia 21. Clientes gráficos21.1. Interface gráfica de usuário (GUI) para SVN
21.2. Projetos Alternativos para SVN
22. Bibliografia
|
Atualizações28/05/2008; |
publicado também em http://www.vivaolinux.com.br/artigo/Configurando-Subversion |
Comentários