Instalação do Gitlab e introdução ao Git

Republicado de vivaolinux.com

Instalação do Gitlab e introdução ao Git

Autor: Leonardo Macedo Cerqueira <noventagraus at hotmail.com>
Data: 24/02/2016

Introdução ao Git e Gitlab



GIT é um sistema de controle de versão rápido, confiável, distribuído e altamente gerenciável, muito popular e largamente utilizado no mundo todo, hoje sem dúvidas é o melhor CVS disponível.

Inicialmente criado para o gerenciamento de códigos fonte, no entanto hoje é utilizado para diversos casos como por exemplo documentações de TI, e na abordagem da infraestrutura como código, ou seja, versionando serviços como automação, orquestração, bootstrap, integração contínua etc.

Quem criou o GIT foi pai de todos nós, Linus Torvalds.

Gitlab, Github e Bitbucket são serviços de repositório, gestão de projetos, códigos e colaboração, existem vários repositórios como estes, são nestes serviços que você vai fazer o upload do seu código fonte e gerir tudo que é produzido.

Neste tutorial vamos instalar o GitLab Community Edition (CE) - Omnibus package e aprender a utilizar o Git.

É uma instalação sólida, você pode tranquilamente utilizar em produção, desenvolvimento ou apenas testes.

Pré-requisitos

Sistema operacional: Centos 7 64 bits.

1. Criação de um domínio

Primeiramente crie uma domínio para testes, sugiro usar seu próprio arquivo de hosts, já que se trata de um Lab, porém se tiver um DNS para isto melhor ainda.

Meu domínio para teste ficou: gitlab.devopslab.com.br

2. Instalar os pacotes*: curl, policycoreutils, openssh-server, openssh-clients, postfix

# yum install curl policycoreutils openssh-server openssh-clients
# systemctl enable sshd
# systemctl start sshd

# yum install postfix
# systemctl enable postfix
# systemctl start postfix


* Alguns pacotes podem existir no seu sistema, neste caso basta pular pois é sucesso =).

3. - Configuração do Firewall

Abrir de forma permanente as portas 80 e 443 TCP.

# firewall-cmd --permanent --add-service=http
# firewall-cmd --permanent --add-service=https
# systemctl reload firewalld



Instalação do GitLab



Versão utilizada neste tutorial: gitlab-ce-8.4.4

Existem várias formas para instalar o GitLab, por exemplo via pacote .rpm, gitlab compilado etc, no entanto eu optei por instalar via yum, mas no final deste artigo vou deixar o link com a documentação referente a outros tipos de instalação.

1. Adicionar o repositório Yum.

# curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | bash

2. Instalar o Gitlab:

# yum install gitlab-ce
# gitlab-ctl reconfigure


O comando "gitlab-ctl reconfigure" completará a instalação do Gitlab, instalando o Nginx, PostgreSQL, Redis, Ruby, Chef e outras coisas mais. Pode demorar alguns minutos.

Pronto, seu Gitlab já está instalado e pronto para uso, podendo ser acessado pelo navegador via IP, mas antes disto vamos configurar a URL (senha de acesso username: root / password: 5iveL!fe).

SSL/HTTPS - Gerar um certificado SSL auto-assinado e habilitar o HTTPS

O Gitlab vai armazenar dados sensíveis, então é muito recomendado utilizar um certificado SSL, principalmente se a URL for pública.

Vamos gerar um certificado auto-assinado, mas em produção provavelmente você utilizará um certificado válido, com CA e tudo mais.

1. Criar o certificado SSL

Com o OpenSSL instalado faça:

# openssl req -x509 -nodes -days 365 -sha256 -newkey rsa:1024 -keyout gitlab.devopslab.com.br.key -out gitlab.devopslab.com.br.crt

Copie a chave ".key" e o certificado ".crt" para a pasta** /etc/gitlab/ssl/:

# mkdir -p /etc/gitlab/ssl
# chmod 700 /etc/gitlab/ssl
# cp gitlab.devopslab.com.br.key gitlab.devopslab.com.br.crt /etc/gitlab/ssl/
# ls /etc/gitlab/ssl/

gitlab.devopslab.com.br.crt gitlab.devopslab.com.br.key

** "/etc/gitlab/ssl" é a pasta padrão que o Gitlab armazena certificados SSL, porém é possível alterar conforme a documentação no fim da página.

2. Habilitar o Https no arquivo gitlab.rb

Adicione sua url https na linha "external_url" do arquivo /etc/gitlab/gitlab.rb:

# vi /etc/gitlab/gitlab.rb

external_url 'https://gitlab.devopslab.com.br'
nginx['redirect_http_to_https'] = true

3. Finalizando a instalação do Gitlab

# gitlab-ctl reconfigure

4. Acesse a URL do Gitlab:

https://gitlab.devopslab.com.br
Username: root / password: 5iveL!fe
Linux: Instalação do Gitlab e introdução do Git

Integração do LDAP



Este passo é opcional, porém dificilmente você não utilizará um LDAP na sua empresa. Para a autenticação centralizada você pode utilizar o Active Directory ou OpenLDAP, neste exemplo utilizei o OpenLDAP.

Algumas configurações mudam entre Active Directory e OpenLDAP.

1. Edite o arquivo /etc/gitlab/gitlab.rb e deixe as informações do LDAP conforme segue abaixo.

ATENÇÃO: este arquivo gitlab.rb tem indentação (yaml), sendo assim não mude os espaços, não use tab, cada linha que você descomentar, deixe os espaços exatamente como estavam, não tente deixar mais para esquerda, mais para direita, não mexa na formatação, apenas apague o "#", mude os atributos e pronto.

Você precisa de um usuário/senha "bind_dn" no LDAP, e saber qual a "base" que estarão os usuários.

# vi /etc/gitlab/gitlab.rb

###OpenLDAP
gitlab_rails['ldap_enabled'] = true
  gitlab_rails['ldap_servers'] = YAML.load <<-'EOS' # remember to close this block with 'EOS' below
    main: # 'main' is the GitLab 'provider ID' of this LDAP server
      label: 'LDAP'
      host: 'ldap.devopslab.com.br'
      port: 389
      uid: 'mail'
      method: 'plain' # "tls" or "ssl" or "plain"
      bind_dn: 'cn=usuario_ldap,cn=dev,ou=Users,dc=devopslab,dc=com,dc=br'
      password: 'senha_texto_plano'
      active_directory: false
      allow_username_or_email_login: false
      block_auto_created_users: false
      base: 'ou=Users,dc=devopslab,dc=com,dc=br'
      user_filter: ''
  EOS

DICA: para o Active Directory do Windows altere os valores abaixo para:

uid: 'sAMAccountName'
active_directory: true

Obs.: testei apenas o OpenLDAP, mas em teoria deve funcionar no Active Directory.

2. ldapsearch

Rode o comando "ldapsearch" para garantir que o servidor do Gitlab esteja se comunicando com o LDAP.

# ldapsearch -h ldap.devopslab.com.br -x -w senha_texto_plano -D 'cn=usuario_ldap,cn=dev,ou=Users,dc=devopslab,dc=com,dc=br' -b 'ou=Users,dc=devopslab,dc=com,dc=br'

O resultado é uma Query no OpenLDAP.

# usuario_ldap, dev, Users, devopslab.com.br
dn: cn=usuario_ldap,cn=dev,ou=Users,dc=devopslab,dc=com,dc=br
givenName: usuario_ldap
gidNumber: 502
homeDirectory: /home/users/usuario_ldap
sn: macedo
loginShell: /bin/sh
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
userPassword:: e01ENX1WSATFpCeW1LRWxTSmp3eSFEtVZ0NTNnPT0=
uidNumber: 1000
uid: usuario_ldap
cn: usuario_ldap
mail: usuario_ldap@devopslab.com.br


3. Finalizando a configuração do LDAP:

# gitlab-ctl reconfigure


GitLab UP and Running, com HTTPS, e autenticação centralizada.


Utilizando o Git



1.1. Acesse a interface Web e crie alguns usuários, grupos e um projeto.

Por exemplo:
  • Grupo: streetfighter
  • Usuários: Ryu, Chun-Li, Sagat
  • Projeto: Newgame1

1.2. Gerar uma chave ssh

A comunicação do Git com o Gitlab utiliza o protocolo SSH, portando gere uma chave ssh e copie na interface do Gitlab.

# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ryu/.ssh/id_rsa):
Created directory '/home/ryu/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ryu/.ssh/id_rsa.
Your public key has been saved in /home/ryu/.ssh/id_rsa.pub.


Copie o conteúdo da chave id_rsa.pub para o Gitlab.

Logado no Gitlab vá para "Home -> Profile Setting -> SSH Keys", e copie a chave.
Linux: Instalação do Gitlab e introdução do Git
Faça isto para todos os usuários.

1.3. Configurações iniciais do Git

Logue com um dos usuários criados, por exemplo "ryu" e faça as configurações iniciais do Git, para a correta conexão com o repositório e definição do editor de texto e merge.

git config --global user.name "ryu"
$ git config --global user.email "ryu@devopslab.com.br"
$ git config --global core.editor vim
$ git config --global merge.tool vimdiff
$ git config --global color.ui true


Verificação:

git config --global --list
user.name=ryu
user.email=ryu@devopslab.com.br
core.editor=vim
merge.tool=vimdiff


1.4. Primeiro Commit

O comando "git clone" vai copiar o projeto do Gitlab para sua máquina.

git clone git@gitlab.devopslab.com.br:StreetFighter/Newgame.git
$ cd Newgame


Dentro da pasta Newgame tem uma pasta oculta ".git", dentro desta pasta está toda a estrutura de funcionamento do Git.

1.5. Primeiro arquivo

Crie o arquivo de README.md.

touch README.md
$ vi README.md

$ cat README.md

Meu primeiro projeto.
Commit 1.
Teste Git


1.6. Indexando o README.md

git add README.md

1.7. Commit

O comando "git commit" vai gravar as alterações no repositório local.

git commit -m "comentário"

$ git commit -m "criei o arquivo README com o primeiro conteúdo"

[master (root-commit) 7862fe2] comentário criei o arquivo README com o primeiro conteúdo
1 file changed, 3 insertions(+)
create mode 100644 README.md


1.8. Push

O commando "git push", sincroniza o repositório local com o Gitlab.

git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 281 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@gitlab.devopslab.com.br:StreetFighter/Newgame.git
* [new branch]      master -> master
Branch master set up to track remote branch master from origin.


Explicação:
  • Origin -> É o seu repositório atual, "Newgame", é o projeto que você está trabalhando.
  • Master -> É o branch master principal deste projeto.

Poderia ser outro branch, cada projeto tem um branch master, e neste branch master podem ser anexados vários branchs paralelos. Mais para frente vamos criar um branch adicional para melhor entendimento.

Por fim, logue na interface web do gitlab, vá para o projeto "Newgame", e estará registrado quem fez o commit, comentário, horário, nome do arquivo e outros metadados.

1.9. Verifique o status da sua fila:

git status
$ git log
$ git show


2.1. Criando e sincronizando um novo código.

Quem vai trabalhar agora é a Chun-Li, ela vai criar um novo recurso no projeto. Execute os passos descritos no capítulo "6.1.3 - Configurações iniciais do Git".

git clone git@gitlab.devopslab.com.br:StreetFighter/Newgame.git
$ cd Newgame.git
$ vi index.html


<html>
<header><title>projeto Newgame</title></header>
<body>
Hello world
Viva o Linux
</body>
</html>

git add index.html
$ git commit -m "Acabei de criar a home page index.html"
$ git push -u origin master


2.2. Criar um novo branch.

Branch de feature.

Acima trabalhamos no branch master no projeto "newgame", porém na reunião de Scrum surgiu uma nova necessidade, e foi adicionado uma nova feature ao sprint, então criaremos um branch de feature paralelo ao master.

Vamos criar o branch de feature com o usuário "sagat". Execute os passos descritos no capítulo "1.3. Configurações iniciais do Git".

git clone git@gitlab.devopslab.com.br:StreetFighter/Newgame.git
$ cd Newgame

$ git branch novafeature1
$ git checkout novafeature1
$ git status


2.3. Criando a nova feature

vi apiBD.py

print "Hello World!"
print "Api de busca com o Banco de dados"

Indexar e commitar.

git add apiBD.py
$ git commit -a -m 'Criei a API de integracao com o BD'

[novafeature1 9615f56] Crie a API de integracao com o BD
1 file changed, 2 insertions(+)
create mode 100644 apiBD.py


Sincronização com o branch "novafeature1":

git push -u origin novafeature1
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 382 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@gitlab.devopslab.com.br:StreetFighter/Newgame.git
   90f41fb..9615f56  novafeature1 -> novafeature1
Branch novafeature1 set up to track remote branch novafeature1 from origin.


Veja os 2 branchs:
Linux: Instalação do Gitlab e introdução do Git
2.4. Merge

Após criado o Branch de Feature, falta sincronizar o branch de feature com o branch master.

git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.


git merge novafeature1
Updating 90f41fb..9615f56
Fast-forward
apiBD.py | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 apiBD.py


git push origin master
Total 0 (delta 0), reused 0 (delta 0)
To git@gitlab.devopslab.com.br:StreetFighter/Newgame.git
90f41fb..9615f56 master -> master
Linux: Instalação do Gitlab e introdução do Git

Backup do Gitlab



Após você ter criado o Gitlab, colocado em produção, tenha em mente que este ambiente é crítico, todos os desenvolvedores, arquitetos, sysadmins, devops etc vão armazenar os códigos e documentações no GitLab.

Você tem a obrigação de ter no mínimo um backup íntegro do Gitlab, e dependendo da empresa é interessante colocar o GitLab em HA, mas para a maioria dos casos um backup bem feito é mais que suficiente.

Tem ainda um porém, se um dia acontecer um problema, e merdas acontecem, você vai preferir o Kid Bengala te fungando no cangote, do que falar para os times que não tem backup do ambiente, neste caso se prepare, pois a mandioca vai vir sem vaselina. FAÇA BACKUP.

1. Backup dos arquivos de configuração, chaves de autenticação e certificados SSL.

# mkdir BACKUP-GITLAB
# tar cvzf /BACKUP-GITLAB/gitlab.tar.gz /etc/gitlab/


Os arquivos mais importantes são: gitlab.rb (configuração), gitlab-secrets.json (chaves de acessos dos usuários), e os certificados ".crt" e ".key".

2. Backup do banco de dados, repositórios e anexos.

Por padrão os backups serão armazenados no diretório /var/opt/gitlab/backups, porém isto pode ser alterado editando o arquivo /etc/gitlab/gitlab.rb.

# gitlab-rake gitlab:backup:create
Dumping database ...
Dumping PostgreSQL database gitlabhq_production ... [DONE]
done
Dumping repositories ...
* StreetFighter/Newgame ... [DONE]
* StreetFighter/Newgame.wiki ... [SKIPPED]
done
Dumping uploads ...
done
Dumping builds ...
done
Dumping artifacts ...
done
Dumping lfs objects ...
done
Creating backup archive: 1455574026_gitlab_backup.tar ... done
Uploading backup archive to remote storage ... skipped
Deleting tmp directories ... done
done
Deleting old backups ... skipping


# ls /var/opt/gitlab/backups/
1455574026_gitlab_backup.tar

Cada backup é gerado com um número de identificação único, no caso 1455574026, este id vai ser utilizado no restore.

O Gitlab permite que você faça o upload automático dos backups para o S3 da Amazon, Rackspace CloudFiles, Google Storage entre outros, isto tem na documentação oficial do Gitlab.

3. Restore Full do Gitlab.

O restore só funciona com a mesma versão do Gitlab, se você fez backup da verão gitlab-ce-8.4.4, então o restore tem que ser na mesma versão gitlab-ce-8.4.4. Se você quiser fazer um upgrade, terá que restaurar o backup e depois o fazer upgrade.

Simularemos que perdemos tudo, então crie uma máquina zerada e instale apenas o Gitlab, siga os capítulos 2 e 3 deste tutorial.

Assumindo que você tenha um servidor do Gitlab instalado e funcional, vamos restaurar a pasta /etc/gitlab.

# tar xvzf gitlab.tar.gz -C /
etc/gitlab/
etc/gitlab/ssl/
etc/gitlab/ssl/gitlab.devopslab.com.br.key
etc/gitlab/ssl/gitlab.devopslab.com.br.crt
etc/gitlab/gitlab.rb
etc/gitlab/gitlab-secrets.json


Restauração da base de dados.

Pare os processos que utilizam o banco de dados.

# gitlab-ctl stop unicorn
# gitlab-ctl stop sidekiq
# gitlab-ctl status


Faça a correção da permissão do arquivo de backup.

# chown git. /var/opt/gitlab/backups/1455574026_gitlab_backup.tar

Este comando vai restaurar o banco.

# gitlab-rake gitlab:backup:restore BACKUP=1455574026
Unpacking backup ... done
Restoring database ...
Restoring PostgreSQL database gitlabhq_production ... SET
SET
DROP INDEX
CREATE INDEX
WARNING: no privileges could be revoked for "public"
REVOKE
WARNING: no privileges could be revoked for "public"
GRANT
[DONE]
done
Restoring repositories ...
* StreetFighter/Newgame ... [DONE]
Put GitLab hooks in repositories dirs [DONE]
Restoring uploads ... done
Restoring builds ... done
Restoring artifacts ... done
Restoring lfs objects ...done
This will rebuild an authorized_keys file.
You will lose any data stored in authorized_keys file.
Do you want to continue (yes/no)? yes
Deleting tmp directories ... done
done


Inicie o Gitlab:

# gitlab-ctl start
# gitlab-ctl status


Verificando a integridade do restore:

# gitlab-rake gitlab:check SANITIZE=true

Se tiver algum erro, o script vai pedir para corrigir já com a solução, no meu caso deu um erro de permissão.

# gitlab-rake gitlab:check SANITIZE=true
Checking GitLab Shell ...
GitLab Shell version >= 2.6.10 ? ... OK (2.6.10)
Repo base directory exists? ... yes
Repo base directory is a symlink? ... no
Repo base owned by git:git? ... yes
Repo base access is drwxrws---? ... yes
hooks directories in repos are links: ... 11/3 ... ok
Running /opt/gitlab/embedded/service/gitlab-shell/bin/check
Check GitLab API access: OK
Check directories and files:
/var/opt/gitlab/git-data/repositories: OK
/var/opt/gitlab/.ssh/authorized_keys: OK
Test redis-cli executable: redis-cli 2.8.21
Send ping to redis server: PONG
gitlab-shell self-check successful
Checking GitLab Shell ... Finished
Checking Sidekiq ...
Running? ... yes
Number of Sidekiq processes ... 1
Checking Sidekiq ... Finished
Checking Reply by email ...
Reply by email is disabled in config/gitlab.yml
Checking Reply by email ... Finished
Checking LDAP ...
LDAP is disabled in config/gitlab.yml
Checking LDAP ... Finished
Checking GitLab ...
Git configured with autocrlf=input? ... yes
Database config exists? ... yes
Database is SQLite ... no
All migrations up? ... yes
Database contains orphaned GroupMembers? ... no
GitLab config exists? ... yes
GitLab config outdated? ... no
Log directory writable? ... yes
Tmp directory writable? ... yes
Uploads directory setup correctly? ... skipped (no tmp uploads folder yet)
Init script exists? ... skipped (omnibus-gitlab has no init script)
Init script up-to-date? ... skipped (omnibus-gitlab has no init script)
projects have namespace: ...
11/3 ... yes
Redis version >= 2.8.0? ... yes
Ruby version >= 2.1.0 ? ... yes (2.1.8)
Your git bin path is "/opt/gitlab/embedded/bin/git"
Git version >= 1.7.10 ? ... yes (2.6.2)
Active users: 12
Checking GitLab ... Finished


Reconfigure o gitlab mais uma vez:

# gitlab-ctl reconfigure

Backup restaurado com sucesso, basta se logar na url do Gitlab e verificar os projetos, usuários, arquivos, chaves de autenticação e etc, backup 100%. Este projeto Gitlab é muito bom, todos os scripts funcionam corretamente, sem erros, tudo redondinho, boa documentação.

Tudo que foi abordado neste tutorial pode ser encontrado neste endereços:
Espero ter contribuído um pouco, até a próxima.




Comentários