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

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.

Criação de um domínio
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

1. Instalação de pacotes básicos para o funcionamento do Gitlab

Instalar os pacotes curl, policycoreutils, openssh-server, openssh-clients, postfix e ativação dos servidores no startup.

#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 =).

2. 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 

3. 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.

Adicionar o repositório Yum
# curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | bash

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.

Após a finalização do comando seu Gitlab estará instalado e pronto para uso, podendo ser acessado pelo navegador via IP, mas antes disto vamos configurar a URL do nosso Gitlab.
Acesso gitlab: username:root / password:5iveL!fe

4. Gitlab com https – Gerar um certificado SSL auto-assinado e habilitar o https

O Gitlab vai armazenar dados sensíveis, então é muito recomendado utilizar uma conexão https, 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.

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.

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

Finalizando a instalação do Gitlab
#gitlab-ctl reconfigure

Acesse a URL do Gitlab
https://gitlab.devopslab.com.br
Username: root / password: 5iveL!fe

HomeGitLab1

5. Integração do Gitlab com 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.

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.

Teste de conexão com a base de dados 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' 

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

Se a conexão e autenticação com a base de dados do LDAP tiver ok o resultado será uma query como acima.

Finalizando a configuração do LDAP e Gitlab
#gitlab-ctl reconfigure
GitLab UP and Running com HTTPS e autenticação centralizada.

6. Comandos básicos com Git e simulação de um cenário

Vou demonstrar a utilização de alguns comandos do Git em um cenário exemplo de utilização, o intuíto é fazer um laboratório.

6.1 – Criação de usuário, grupos e projetos.
Acesse a interface Web do Gitlab e crie alguns usuários, grupos e um projeto por exemplo:

  • Grupo: streetfighter
  • Usuários: Ryu, Chun-Li, Sagat
  • Projeto: Newgame1
  • 6.2 – Gerar uma chave ssh para cada usuário
    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 cole a chave.
    chavegitssh1
    Faça este processo de copia de chave para todos os usuários.

    6.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 
    

    6.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.

    6.5 – Criação arquivo README.md
    Crie o arquivo de README.md, ele não é obrigatório mas muito recomendado.

    $touch README.md
    $vi README.md
    
    $ cat README.md
    Meu primeiro projeto.
    Commit 1.
    Teste Git 
    

    6.6 – Indexando o README.md

    $git add README.md 
    

    6.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 
    
    <strong>6.8 - Push </strong>
    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.

    6.9 – Verifique o status da sua fila

     
    $git status
    $git log
    $git show 
    

    6.10 – 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 “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 
    

    6.11 – Criar um novo branch
    Branch de feature

    Acima trabalhamos no branch master do 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”, então execute os passos descritos no capítulo “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 
    


    6.12 – Criando a nova feature

     
    $vi apiBD.py 
    
    print "Hello World!"
    print "Api de busca com o Banco de dados"
    

    6.13 – 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 
    

    6.14 – 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:
    gitbranchdefeature1

    6.15 – Merge
    Após criado o Branch de Feature, falta sincronizar o branch de feature com o branch master. São 3 comandos: git checkout, git merge e git push.

    $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
    

    commits-merge-master1

    7. 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.

    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”.

    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.

    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 de instalação do Gitlab neste 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

    # 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 a falta de permissão de leitura.

    gitlab-rake gitlab:backup:restore BACKUP=1455574026
    # 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 e boa documentação.

    Tudo que foi abordado neste tutorial pode ser encontrado neste endereços:
    http://doc.gitlab.com/omnibus/
    https://git-scm.com/

    See you.

    Deixe uma resposta

    O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *