terça-feira, 25 de maio de 2010

Instalando e Configurando o Gitosis no Ubuntu

Este é primeiro artigo de uma série que irei escrever falando sobre o Git que, na minha opinião, é uma das melhores ferramentas de SCM disponíveis no mercado. Posteriormente falarei um pouco sobre o histórico do Git, porém no momento vou me concentrar em como configurar um servidor para servir de repositório central para todos os seus repositórios Git. Apesar de ser um DCVS, ter um repositório centralizado oferece diversas facilidades como, por exemplo, um referência de onde todos os desenvolvedores podem atualizar seus repositórios locais.
Existem bons serviços disponíveis na web para armazenar repositórios Git como, por exemplo, o GitHub e o Assembla, sendo que este último é um portal de gerenciamento de projetos que oferece também o serviço de armazenamento de repositórios. Porém, devido aos mais variados motivos, pode ser conveniente ou necessário que os nossos repositórios sejam armazenados num servidor próprio, seja local ou nas nuvens. Assim sendo, vou mostrar neste tutorial como instalar e configurar o Gitosis, que é uma ferramenta para armazenar repositórios Git, numa máquina rodando Ubuntu.

Instalando o Gitosis

Antes de iniciar, é sempre bom atualizarmos nossos repositórios do Ubuntu:

sudo apt-get update

Feito isso, vamos criar um diretório onde vamos clonar o Gitosis:

cd ~
mkdir src
cd src

Tudo pronto pra clonagem (lembrei de alguns filmes de ficção científica e da novela "O Clone" :D ):

git clone git://eagain.net/gitosis.git

Se aparecer uma mensagem de erro, falando que o git não está instalado, você pode instala-lo da seguinte maneira:

sudo apt-get install git-core

Após finalizar o clone, vai ser criado dentro de ~/src um diretório gitosis. Para prosseguir com a instalação:

cd gitosis
sudo python setup.py install

Normalmente você não terá problemas com o Python, pois o mesmo já vem instalado por padrão, mas pode ocorrer um erro relacionado ao setuptools, que é uma biblioteca python usada em scripts de instalação. Para resolver este problema:

sudo apt-get install python-setuptools

Feito isso, o Gitosis estará instalado. Passamos, então, à fase de configuração.

Configurando o Gitosis

A primeira coisa a fazermos é criar o usuário sob o qual rodará o Gitosis:

sudo adduser \
--system \
--shell /bin/sh \
--gecos 'git version control' \
--group \
--disabled-password \
--home /home/git \
git

No comando acima estamos criando um usuario chamado git, que não precisa ter senha (--disable-password), porém precisa de um shell válido (--shell /bin/sh). O diretório home (--home /home/git) foi definindo seguindo o padrão linux, porém poderia ser configurado para qualquer outra pasta; neste diretório serão armazenados os repositórios Git.

Agora precisamos gerar uma chave RSA de acesso, visto que o Git roda sobre SSH:

ssh-keygen -t rsa
Vamos, então, iniciar o nosso repositório de configuração do Gitosis:

sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub

Isso já vai incluir a chave do nosso servidor na lista de permissões do Gitosis. Se tudo der certo, aparecerá duas vezes uma mensagem falando que o repositório foi inicializado.

Por segurança, devemos garantir que o hook de post-update do repostório de configuração está com permissão de execução:

sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

Agora vamos clonar o repositório de configuração do Gitosis:

cd ~
git clone git@localhost:gitosis-admin.git

Se ocorrer um erro de connection refused na porta 22, é preciso instalar o OpenSSH-Server (lembra-se que o Git roda sobre SSH??):

sudo apt-get install openssh-server

Quando ele perguntar se você deseja adicionar a chave do servidor na lista de hosts conhecidos, responda yes.

OK, agora dentro de ~ temos o diretório gitosis-admin e dentro dele temos os seguintes itens:
  • Arquivo gitosis.conf => Onde configuramos os repositórios disponíveis e o acesso dos usuários a eles;
  • Diretório keydir => Onde devem ser armazenadas as chaves RSA dos usuários que poderão acessar os repositórios do servidor.
Como o diretório gitosis-admin é um repositório Git, todas as alteração feitas nele deverão ser comitadas (git commit) e enviadas para o repositório central (git push).

Criando novos repositórios

Para começar, abra o arquivo gitosis.conf. Ele deve parecer da seguinte forma:

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = usuario@nome_ubuntu

Onde temos o nome do grupo entre [], o nome dos projetos com permissão de escrita (writeable) e o usuário que possui esta permissão. Para adicionar um novo projeto, podemos adicionar as seguintes linhas:

[group equipe]
writable = projeto1 projeto2 projeto3
readonly = projeto4
members = usuario1@maquina1 usuario2@maquina2

No exemplo acima, estamos dando permissão de escrita para os projetos 1, 2 e 3 e acesso somente leitura (readonly) ao projeto4 para os usuários usuario1@maquina1 e usuario2@maquina2. Esses nomes de usuario vem do arquivo id_rsa.pub que é gerado em cada máquina:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAniABr9ynN57KK0ScYDM0lM3h9KBRpa7b
FBIM1aoX2slOKbj4gSdFk2P29tmFb505lly+xsXXCJ//iHheLgpRUcIPG+fLUXYiOhT6
+dv3ERlrhHQ0XmByayMafWyKvsQw6HYjfPNbt4RUnKSLuERSuQsiORCrT0j34lg2ASMk
0+QLOl6HRI1+4GQHXnLydMVbV1dvHeCf1hHfRMcjk5dAmb8m+EW7JJuNjnCby4psEFpG
70ff1T8l8JL1bUwcECfoEQ7GtpjeOTdGCW14D0cb36uXRWvU03kBLJFBbGn7Wuu4VPFz
t2ACPfim8fe9LWGguVVcEKjFonxXJs9BJsMecQ== usuario1@maquina1

Após serem gerados nas máquinas, os arquivos id_rsa.pub devem ser copiados para a pasta ~/gitosis-admin/keydir e renomeados de acordo com o nome do usuário. Seguindo o exemplo acima, teriamos 2 arquivos dentro do diretório keydir chamados usuario1@maquina1.pub e usuario2@maquina2.pub .

Após feitas estas configurações, como já foi dito anteriormente, devemos comitar as alterações e enviar para o repositório central:

cd ~/gitosis-admin
git add keydir
git add gitosis.conf
git commit -m "Adicionados novos projetos e usuarios"
git push

Feito isso, as configurações já estão valendo no servidor e os usuários que tiverem acesso já podem clonar os repositórios normalmente.

Um comentário:

Alexander disse...

Wevertooooon, qual a principal diferença entre o GIT e outros gerenciadores de arquivos como por exemplo o SVN e o CVS?