Aula 11 - Gestão de Repositório
Apresenta a ferramenta de gestão de repositórios Gitlab
Gestão de Repositórios
O GitLab é uma plataforma baseada em Git que integra um grande número de ferramentas essenciais para desenvolvimento e implantação de software e gerenciamento de projetos:
- Hospedagem de código em repositórios com controle de versão;
- Acompanhamento de propostas para novas implementações, relatórios de bugs e feedback;
- Rastreador completo de problemas;
- Organização e priorização com os painéis de questões;
- Revisão o código em Merge Requests
- Construção, teste e implantantação com integração contínua integrada (CI/CD).
- Implantação de sites estáticos pessoais e profissionais com as páginas do GitLab.
- Integração com o Docker usando o GitLab Container Registry.
- Rastreio do ciclo de vida do desenvolvimento usando o GitLab Cycle Analytics.

Gitlab
Um repositório é o que você usa para armazenar sua base de código no GitLab e alterá-lo com o controle de versão. Um repositório é parte de um projeto.
A interface web do GitLab permite:
Uma ramificação é uma versão da árvore de trabalho de um projeto. Você cria uma ramificação para cada conjunto de alterações relacionadas feitas. Isso mantém cada conjunto de mudanças separadas umas das outras, permitindo que alterações sejam feitas em paralelo.
Depois de enviar suas alterações para um novo branch, é possível:
- Comparar branches
- Criar uma solicitação de mesclagem
- Realize a revisão de código em linha
- Discuta sua implementação
- Visualizar alterações enviadas para um novo branch
O branch padrão é chamado de master. Você pode selecionar o branch padrão nas configurações do projeto, que é automaticamente protegido contra deleção acidental.
As issues são o meio fundamental para colaborar com idéias e planejar o trabalho no GitLab.
Casos de uso comuns incluem:
- Discussão da implementação de uma nova ideia;
- Tarefas de acompanhamento e status de trabalho;
- Aceitar propostas de recursos, perguntas, solicitações de suporte ou relatórios de bugs;
- Elaboração novas implementações de código;
As Merge Requests permitem visualizar e colaborar nas alterações propostas ao código-fonte que existem conforme confirmadas em uma determinada ramificação Git.
Com as Merge Requests do GitLab, você pode:
- Comparar as mudanças entre dois ramos;
- Rever e discutir as modificações propostas linha a linha;
- Testar e implantar seu código por branch;
- Impedir merges antes de estar pronta com os WIP (Work In Progress);
- Visualizar o processo de implantação por meio de gráficos de pipeline;
- Fechar automaticamente problemas que originaram a implementação proposta no merge;
- Atribuir o merge a um usuário;
- Atribuir um milestone e acompanhar o desenvolvimento de uma implementação mais ampla;
- Identificar com labels;
- Adicionar uma estimativa de tempo e o tempo gasto;
- Resolver conflitos de mesclagem;
- Ativar fast-forward merges;
- Criar novas merge requests por email;
- Integrar merge requests em um único commit;
As Milestones no GitLab são uma maneira de rastrear issues e merges criadas para atingir uma meta mais ampla em um determinado período de tempo.
Uma Milestone pode ser utilizada, por exemplo, em forma de Agile Sprints ou Releases.

Um Fork é uma cópia de um repositório original que você coloca em outro `namespace`, onde você pode experimentar e aplicar alterações que você pode decidir posteriormente compartilhar ou não (através de `Merge Requests`), sem afetar o projeto original.

Continuous Integration (CI) funciona enviando pequenos pedaços de código para a base de código do seu aplicativo hospedada em um repositório Git e, a cada envio, execute um pipeline de scripts para criar, testar e validar as alterações de código antes de mesclá-las na ramificação principal.
Continuous Delivery (CD) consiste em um passo adicional da CI, implantando seu aplicativo na produção a cada push na ramificação padrão do repositório.
O CI/CD do GitLab é configurado por um arquivo chamado .gitlab-ci.yml, colocado na raiz do repositório. Os scripts definidos neste arquivo são executados pelo GitLab Runner.
image: node:8.10.0
cache:
paths:
- node_modules/
stages:
- deploy_production
Production:
image: ruby:latest
only:
- master
stage: deploy_production
script:
- apt-get update -qy
- apt-get install -y ruby-dev
- gem install dpl
- dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_API_KEY

Grupos
Um grupo é um conjunto de projetos, juntamente com dados sobre como os usuários podem acessar esses projetos. Cada grupo tem um namespace de projeto (da mesma forma que os usuários). Dessa forma é possível utilizar a integração de grupos para alocar times para projetos ou estabelecer projetos inteiros dentro de um grupo.
Snippets
Snippets são blocos de código que você deseja armazenar no GitLab, dos quais você tem acesso rápido.
Webhooks
Os webhooks do projeto permitem acionar um URL se, por exemplo, um novo código for enviado ou um novo problema for criado. Você pode configurar webhooks para ouvir eventos específicos. O GitLab enviará uma solicitação POST com dados para o URL do webhook.

API
A API REST do GitLab permite que os desenvolvedores acessem e integrem a funcionalidade do GitLab com outros aplicativos e criem novos aplicativos. Alguns exemplos de métodos de API incluem recuperação e gerenciamento de usuários, publicação e recuperação de problemas e gerenciamento de informações do projeto.
Bônus: Implantação
Heroku é uma Plataforma como Serviço (PaaS - Plataform as a Service) que suporta a implantação de aplicações nas mais variadas plataformas e linguagens de programação. Através do Heroku é possível hospedar um container de aplicação com a possibilidade de escalar em diversos servidores.
O Heroku usa um servidor git para gerenciar as requisições do usuário. Todos os serviços hospedados são feitos sobre a Amazon EC2.
Para implantar um projeto de maneira simples no heroku é necessário os seguintes requisitos:
- Um projeto na linguagem/plataformas suportadas pelo heroku (Lista de Linguagens)
- Versionamento do projeto usando Git
- O Heroku CLI
A aplicação precisará também, de um arquivo de configuração que é específico para cada linguagem, como o pipfile para Python e project.json para pacotes Node. Nele deve estar especificado como a aplicação deve ser aberta e quais suas dependências.
Outro requisito é que a aplicação deve usar uma variável de ambiente para especificar a porta que será utilizada pela aplicação. Com node/dyno poderiamos utilizar a seguinte função:
process.env.PORT
Essa mesma variável pode ser configurada pela interface web do Heroku
Para realizar o deploy é preciso logar no Heroku através da aplicação CLI e criar uma nova aplicação:
heroku login
heroku apps:create meuApp
Por fim, vamos adicionar o repositório criado no heroku e enviar a aplicação:
heroku git:remote -a meuApp
git push heroku master
Lembre-se de executar todos os comandos dentro da pasta raiz do projeto
Mão na Massa
Crie um fork do repositório deste endereço https://gitlab.com/ppw-unesc/pokemon-api e implemente uma das alterações nas funções da pasta API.
Você deve comentar uma das issues presentes no repositório, confirmando que fará o desenvolvimento da respectiva função
No final, deverá inserir criar um novo Merge Request a partir de seu repositório no repositório original do exercício
Não é necessario realizar nenhuma postagem no AVA. Este exercício será avaliado de acordo com a função implementada e seu devido Merge Request
Exercícios Complementares
Crie um fork do repositório. Adicione um link remoto para o seu novo repositório (fork) utilizando o comando git remote e envie as alterações para o seu repositório utilizando o comando git push.


