Ferramentas para Versionamento de

Código e Integração Contínua

Agenda

1

Introdução a gerenciamento de versão

2

Conceitos sobre integração contínua, deploy contínuo e entrega contínua

3

Utilização do Git

4

Ferramentas para integração contínua

#0 Apresentação

Quem sou?

  • Vanilton da Thálita 💍
  • Pai do Louie 👦🏻 e Lourenzo 👶🏻
  • Cientista da Computação 🤓
  • 🎓 Especialista  em Engenharia de Software e Gestão de Pessoas
  • 👨🏻‍💻Pessoas e Processos na @fpf.tech 😃
  • 👨🏻‍🏫 Professor na @etech
#1 Introdução a gerenciamento de versão

O que é uma versão?

#1 Introdução a gerenciamento de versão

O que é uma versão?

 Alterar, entornar, mudar

#1 Introdução a gerenciamento de versão

O que é uma versão?

 Alterar, entornar, mudar

O que é Gerenciamento?

Ato de administrar, dirigir

#1 Introdução a gerenciamento de versão

Gerenciamento de versão é?

Ato de administrar ou dirigir mudanças

#1 Introdução a gerenciamento de versão

Sistema que registra alterações em arquivos ao longo do tempo para que versões específicas possam ser recuperadas posteriormente.

Controle de Versão

#1 Introdução a gerenciamento de versão

Sistema de controle de versões:

  • VCS (do inglês version control system)
  • SCM (do inglês source code management)

Nomeclaturas

#1 Introdução a gerenciamento de versão

Nós versionamos apenas código?

Esses sistemas são comumente utilizados no desenvolvimento de software para controlar as diferentes versões — histórico e desenvolvimento — dos códigos-fontes e também da documentação.  

#1 Introdução a gerenciamento de versão
#1 Introdução a gerenciamento de versão

História

Source Code Control System (SCCS)

Marc Rochkind desenvolveu o SCCS em SNOBOL4 no Bell Labs para um computador IBM System/370 rodando OS/360 MVT

* Código proprietário

1972

1982

Revision Control System (RCS)

Lançado por Walter F. Tichy, enquanto ele estava na Universidade de Purdue, como uma alternativa livre e mais evoluída para o então popular Source Code Control System (SCCS)

* Código aberto

86-90

Concurrent Version System (CVS)

Dick Grune "Criei o CVS para poder cooperar com meus alunos Erik Baalbergen e Maarten Waage no ACK (Amsterdam Compiler Kit) Compilador C."

* Código aberto

#1 Introdução a gerenciamento de versão

História

1972 - SCCS

1982 - RCS

86-90 - CVS

Subversion (SVN)

Fundado pela CollabNet, Inc., o projeto e o software Subversion tiveram um sucesso incrível na última década.

* Código aberto

2000

2000

BitKeeper SCM

é um sistema de controle de versão distribuído, o primeiro beta utilizável estava disponível em Maio de 1999 e em 4 de Maio de 2000, o primeiro lançamento público do BitKeeper se fez disponível

* Código aberto

2005

Mercurial

é uma ferramenta multiplataforma de controle de versão distribuído para desenvolvedores de software. O criador e desenvolvedor líder do Mercurial é o Matt Mackall

* Código aberto

#1 Introdução a gerenciamento de versão
  • Reverter estados
  • Comparar mudanças
  • Modificações (identificar causas e quem ocasionou)
  • Quando foram introduzidos problemas

Benefícios

#1 Introdução a gerenciamento de versão

Benefícios

Text

Control de Histórico e Rastreabilidade

Confiança

Trabalho em Equipe

Marcação e Ramificação

Organização

Projetos de Software

Projetos de UX

Documentação

Estáticos de Site

Gestão de Projetos de Engenharia

Escrita de Livros e Publicações

DevOps e Integração Contínua (CI/CD)

Aplicações

#1 Introdução a gerenciamento de versão

Projetos de Software

Projetos de UX

Documentação

Estáticos de Site

Gestão de Projetos de Engenharia

Escrita de Livros e Publicações

DevOps e Integração Contínua (CI/CD)

Aplicações

#1 Introdução a gerenciamento de versão

Equipes de desenvolvedores podem trabalhar simultaneamente no mesmo projeto, cada um em suas próprias "ramificações" (branches), sem conflito.

Projetos de Software

Projetos de UX

Documentação

Estáticos de Site

Gestão de Projetos de Engenharia

Escrita de Livros e Publicações

DevOps e Integração Contínua (CI/CD)

Aplicações

#1 Introdução a gerenciamento de versão

Autores e editores podem rastrear diferentes versões de um manuscrito, identificando mudanças, correções e revisões.

Projetos de Software

Projetos de UX

Documentação

Estáticos de Site

Gestão de Projetos de Engenharia

Escrita de Livros e Publicações

DevOps e Integração Contínua (CI/CD)

Aplicações

#1 Introdução a gerenciamento de versão

Utilizado para rastrear alterações em documentos de projeto, especificações técnicas e manuais.

Diversas pessoas podem editar simultaneamente sem sobrescrever o trabalho de outras, comum em redação colaborativa de papers e relatórios.

Projetos de Software

Projetos de UX

Documentação

Estáticos de Site

Gestão de Projetos de Engenharia

Escrita de Livros e Publicações

DevOps e Integração Contínua (CI/CD)

Aplicações

#1 Introdução a gerenciamento de versão

Engenheiros podem usar sistemas de controle de versão para arquivos CAD, gerando diferentes versões de projetos mecânicos ou arquitetônicos.

Projetos de Software

Projetos de UX

Documentação

Estáticos de Site

Gestão de Projetos de Engenharia

Escrita de Livros e Publicações

DevOps e Integração Contínua (CI/CD)

Aplicações

#1 Introdução a gerenciamento de versão

Designers podem usar controle de versão para gerir diferentes versões de arquivos de design (ex: PSD, AI), permitindo a recuperação de trabalhos anteriores.

Projetos de Software

Projetos de UX

Documentação

Estáticos de Site

Gestão de Projetos de Engenharia

Escrita de Livros e Publicações

DevOps e Integração Contínua (CI/CD)

Aplicações

#1 Introdução a gerenciamento de versão

Sistemas como Jenkins, GitHub Actions, GitLab CI, ou Travis CI usam controle de versão para automatizar testes, builds e deploys contínuos.

Projetos de Software

Projetos de UX

Documentação

Estáticos de Site

Gestão de Projetos de Engenharia

Escrita de Livros e Publicações

DevOps e Integração Contínua (CI/CD)

Aplicações

#1 Introdução a gerenciamento de versão

Para conteúdos de sites estáticos utiliza-se controle de versão para facilmente verificar o que está presente de conteúdo e em casos específicos retornar versões ou até mesmo avançar versões.

Sistemas Locais de Versão

#1 Introdução a gerenciamento de versão

Um Sistema Local de Versionamento armazena o histórico de alterações de arquivos em um único computador, permitindo que o desenvolvedor rastreie versões, faça alterações e reverta mudanças.

Sistemas Locais de Versão

#1 Introdução a gerenciamento de versão

Quais vantagens e problemas possuímos nesse sistema?

Sistemas Locais de Versão

#1 Introdução a gerenciamento de versão

Colaboração Limitada

Escalabilidade Reduzida

Risco de Perda de Dados

Gerenciamento de Conflito Manual

Falta de Integração com CI/CD

Acesso Remoto Impossível

Histórico Local Incompleto

Falta de Transparência

Sistemas Locais de Versão

#1 Introdução a gerenciamento de versão

Simplicidade

Independência de Conexão

Desempenho

Custo Zero

Privacidade

Uso em Projetos Simples ou Temporários

Sistemas Locais de Versão

#1 Introdução a gerenciamento de versão

Atividade 1

  1. Siga as instruções no link.
  2. Tome nota das dificuldades enfrentadas na atividade.

10 Minutos

Sistema Centralizado de Versão (CVCS)

#1 Introdução a gerenciamento de versão

Um Sistema Centralizado de Controle de Versão (CVCS) armazena todo o histórico de versões e arquivos em um servidor central. Desenvolvedores fazem checkout do código diretamente desse servidor, e todas as alterações (commits) são registradas centralmente.

#1 Introdução a gerenciamento de versão

Quais vantagens e problemas possuímos nesse sistema?

Sistema Centralizado de Versão (CVCS)

#1 Introdução a gerenciamento de versão

Dependência do Servidor Central

Menor Flexibilidade

Risco de Falha no Servidor

Dificuldade de Trabalho Offline

Escalabilidade Limitada

Sistema Centralizado de Versão (CVCS)

#1 Introdução a gerenciamento de versão

 Controle Centralizado

 Fácil Controle de Acesso

Simplicidade de Configuração

Visão Unificada do Repositório

Histórico Centralizado e Seguro

Sistema Centralizado de Versão (CVCS)

#1 Introdução a gerenciamento de versão

Exemplos de CVCSs

#1 Introdução a gerenciamento de versão

Criando um CVCSs com SVN + Docker

version: '3.8'

services:
  svn:
    image: garethflowers/svn-server:latest
    container_name: svn-server
    ports:
      - "3690:3690" # Porta padrão do SVN
    volumes:
      - ./svn-repos:/var/opt/svn # Mapeamento do repositório SVN local
    environment:
      - SVN_REPOS=/var/opt/svn
      - SVN_USER=admin # Usuário admin do SVN
      - SVN_PASSWORD=admin # Senha para o usuário admin
    restart: always

O servidor SVN estará disponível em svn://localhost:3690. O repositório será armazenado na pasta ./svn-repos localmente no host.

#1 Introdução a gerenciamento de versão

Configurando um repositório com SVN + Docker

# Para criar um repositório

docker exec -it svn-server svnadmin create repositorio-xpto

# Para acessar o container com o server

docker exec -it svn-server sh

# Configurar usuários
## Edite o arquivo svnserve.conf para habilitar autenticação e definir permissões:

nano /var/opt/svn/<nome_do_repositorio>/conf/svnserve.conf

[general]
anon-access = none              # Bloqueia acesso anônimo
auth-access = write             # Habilita acesso com autenticação
password-db = passwd            # Arquivo de usuários e senhas
authz-db = authz                # Arquivo de controle de acessos

## Configurando usuários e senhas

nano /var/opt/svn/<nome_do_repositorio>/conf/passwd

[users]
joao = senha123
maria = senha456
vanilton = 123456
#1 Introdução a gerenciamento de versão

Configurando um repositório com SVN + Docker

# Configurar permissões

## Edite o arquivo svnserve.conf para habilitar autenticação e definir permissões:

nano /var/opt/svn/<nome_do_repositorio>/conf/authz

[groups]
devs = joao, maria              # Define um grupo chamado "devs"

[/]                             
* =                             # Bloqueia o acesso de todos os usuários
vanilton = r                    # Usuário específico com acesso somente leitura
@devs = rw                      # Grupo "devs" tem leitura e escrita
#1 Introdução a gerenciamento de versão

Customizando sua imagem com SVN + Docker

#Dockerfile
# Use a imagem base de garethflowers/svn-server
FROM garethflowers/svn-server:latest

# Instale o nano
RUN apk update && apk add nano
#1 Introdução a gerenciamento de versão

Criando um CVCSs com SVN Windows

https://www.visualsvn.com/downloads/

#1 Introdução a gerenciamento de versão

Configurando um CVCSs com VisualSVN Server

  1. Criar um usuário
  2. Criar um repositório permitindo ao usuário criado no passo 1 ter acesso de leitura e escrita
#1 Introdução a gerenciamento de versão

Acessando o repositório criado no VisualSVN Server

#1 Introdução a gerenciamento de versão

Instalando um Cliente SVN

#1 Introdução a gerenciamento de versão

Terminologias

O local central onde todo o código-fonte e histórico de versões de um projeto são armazenados.

#1 Introdução a gerenciamento de versão

Um commit no contexto destes sistemas de controle de versão refere-se a submeter as últimas alterações do código fonte ao repositório e tornar estas alterações parte da versão principal (head) do repositório.

Terminologias

#1 Introdução a gerenciamento de versão

Terminologias

Branch (Ramo): Uma linha paralela de desenvolvimento, permitindo que diferentes versões de um projeto coexistam. Branches são usados para desenvolver novos recursos ou corrigir bugs sem afetar o código principal.

#1 Introdução a gerenciamento de versão

Merge: O processo de integrar as alterações de uma branch a outra. Em geral, o merge une as modificações de uma branch secundária ao branch principal.

Terminologias

#1 Introdução a gerenciamento de versão

Terminologias

Tag: Um marcador para identificar versões específicas no repositório, como uma versão de lançamento (v1.0, v2.0 etc.). Diferente das branches, as tags são usadas como pontos fixos, sem intenção de novas alterações.

#1 Introdução a gerenciamento de versão

Checkout: Ação de copiar o código de uma versão específica do repositório para uma máquina local, permitindo ao usuário editar e visualizar o código em uma versão selecionada.

Terminologias

#1 Introdução a gerenciamento de versão

Terminologias

Conflict (Conflito): Ocorre quando alterações conflitantes são feitas na mesma linha de código por diferentes colaboradores. Normalmente, é necessário resolver conflitos manualmente durante um merge.

#1 Introdução a gerenciamento de versão

Diff: Uma comparação entre duas versões do código para destacar o que foi adicionado, removido ou alterado.

Terminologias

#1 Introdução a gerenciamento de versão

Terminologias

Blame: Uma funcionalidade que permite visualizar qual usuário fez mudanças específicas em linhas de código. Útil para rastrear o autor e a data de uma modificação.

#1 Introdução a gerenciamento de versão

Revert: Ação de desfazer uma ou mais alterações no código. Pode ser usada para voltar o código a um estado anterior sem remover completamente o histórico.

Terminologias

#1 Introdução a gerenciamento de versão

Terminologias

Log: Exibe o histórico de modificações de um dado repositório contendo informações como descrição de commits, data e hora e nome do responsável pelas versões.

#1 Introdução a gerenciamento de versão

Staging Area (ou Index): Um espaço onde as mudanças são preparadas antes do commit. O usuário seleciona quais mudanças deseja enviar ao repositório, permitindo controle sobre o que é incluído no próximo commit.

Terminologias

#1 Introdução a gerenciamento de versão

Atividade 2

  1. Siga as instruções no link.
  2. Tome nota das dificuldades enfrentadas na atividade.

45 Minutos

Sistema Centralizado de Versão (CVCS)

#1 Introdução a gerenciamento de versão

Em um DVCS os clientes não somente usam o estado mais recente dos arquivos: eles duplicam localmente o repositório completo.

Sistema Distribuídos de Versão (DVCS)

#1 Introdução a gerenciamento de versão

Desta maneira, se qualquer servidor morrer, e diversas pessoas estiverem colaborando por meio de um sistema distribuído de controle de versão, qualquer um dos repositórios de clientes podem ser copiado de volta para o servidor para restaurá-lo.

Sistema Distribuídos de Versão (DVCS)

#1 Introdução a gerenciamento de versão

Podemos afirmar que cada clone de repositório é, de fato, um backup completo de todos os dados.

Sistema Distribuídos de Versão (DVCS)

#1 Introdução a gerenciamento de versão

Complexidade Inicial

Menor Flexibilidade

Risco de Falha no Servidor

Dificuldade de Trabalho Offline

Escalabilidade Limitada

Sistema Distribuídos de Versão (DVCS)

#1 Introdução a gerenciamento de versão

Quais vantagens e problemas possuímos nesse sistema?

Sistema Distribuídos de Versão (DVCS)

#1 Introdução a gerenciamento de versão

Exemplos de DVCSs

#1 Introdução a gerenciamento de versão

Instalando Git

#1 Introdução a gerenciamento de versão

Instalando Clientes Git

#1 Introdução a gerenciamento de versão

Terminal

Windows

iTerm 

Terminator

#1 Introdução a gerenciamento de versão

Git - História

Git é um sistema de controle de versões distribuído, usado principalmente no desenvolvimento de software, mas pode ser usado para registrar o histórico de edições de qualquer tipo de arquivo.

O Git foi baseado na ferramenta proprietária chamada BitKeeper

#1 Introdução a gerenciamento de versão

Git - História

  • Linus criador do Git
  • O termo "Git", uma gíria em inglês britânico para cabeça dura, pessoas que acham que sempre têm razão, argumentativas, podendo ser também pessoa desagradável ou estúpida

"Eu sou um desgraçado egocêntrico, então batizo todos os meus projetos com meu nome. Primeiro Linux, agora Git."

— Linus Torvalds

#1 Introdução a gerenciamento de versão

Git - Licença

#1 Introdução a gerenciamento de versão

Git - Portabilidade

  • O Git foi primariamente desenvolvido para Linux, mas pode ser usado em outros sistemas operacionais baseados no Unix, incluindo o BSD, o Solaris e o Darwin. O Git é extremamente rápido em arquiteturas POSIX como o Linux.
    O Git também roda no Microsoft Windows.
#1 Introdução a gerenciamento de versão

Git - Quem usa?

#1 Introdução a gerenciamento de versão

Git - Estrutura

Todo o controle de versão realizado localmente.

#1 Introdução a gerenciamento de versão

Git - Estrutura

Processo de sincronização entre repositório local e remoto e vice versa.

#1 Introdução a gerenciamento de versão

Git - Estrutura

Utilizado para alternar entre branchs, restaurar arquivos ou recuperar uma versão específica de um arquivo ou commit. 

#1 Introdução a gerenciamento de versão

Git - Estrutura

#1 Introdução a gerenciamento de versão

Git - Vantagens

Open

Source

Trabalho em Equipe

Controle de histórico

Autonomia

Ramificação do Projeto

Segurança

Organização

Repositórios reduzidos

#1 Introdução a gerenciamento de versão

Sistema de Controle Convencional

  • Versões dos arquivos são armazenadas sequencialmente como deltas (Δ)
  • Δ representa as diferenças ou modificações incrementais feitas nos arquivos.
#1 Introdução a gerenciamento de versão

Sistema de Controle no Git

  • O Git guarda uma versão completa do repositório, mas otimiza o armazenamento armazenando apenas os arquivos que realmente mudaram
#1 Introdução a gerenciamento de versão

Snapshot

  • Cada commit (bolinha azul) no Git é, na verdade, um snapshot de todos os arquivos no projeto naquele momento. Assim, cada commit mantém um histórico completo do projeto.
#1 Introdução a gerenciamento de versão

Estratégia

O formato do objeto dos arquivos de repositório do Git usa uma combinação de codificação delta (armazenamento de diferenças de conteúdo)

v1

src/code.py 

work

src/code.py 

#1 Introdução a gerenciamento de versão

Os 3 estados

Prepara

Valida

Envia para o git

#1 Introdução a gerenciamento de versão

Conceitos de Git

Atividade 3

  1. Siga as instruções no link.
  2. Tome nota das dificuldades enfrentadas na atividade.

60 Minutos

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

O que é Integração Contínua (CI)?

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

O que é Integração Contínua (CI)?

Entregar continuamente, ou a cada commit

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

O que é Integração Contínua (CI)?

Integração Contínua geralmente se refere à integração, construção e teste de código dentro do ambiente de desenvolvimento. Entrega Contínua se baseia nisso, lidando com os estágios finais necessários para a implantação da produção.

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

O que não se quer com CI?

Picos de integrações

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

O que se quer com CI?

Cadência curta nas integrações

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Organização de repositórios

Multi-repositório

Mono-repositório

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Estratégia e modelos de Branch

v1.0.0v1.0.1v1.1.0Main/MasterDevelopHotfixFeatureRelease

Todos se comprometem com a linha principal todos os dias - Martin Fowler

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Pontos de atenção

v1.0.0v1.0.1v1.1.0Main/MasterDevelopHotfixFeatureRelease

Commits com foco em tarefas e simples

Muitas branches atrasam a integração

Branches curtas menor complexidade no merge

Quanto mais branches mais burocracia nas integrações

Mais que a decisão de um é o time que define o seu padrão

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Feature Branch

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Feature Branch e Pull Request

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Git Flow

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Git Flow

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Evitando branches de vida longa

Feature Flag

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Evitando branches de vida longa

Branch Abstraction

O importante é manter o trunk vivo

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Estratégia de merge

Merge

Rebase

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Estratégia de merge

Merge

Rebase

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Estratégia de merge

Merge

Rebase

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

O que não pode faltar no CI?

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Teste Automatizado

Lento

Rápido

$$$

$

# de testes

  • Automação de API
  • Contrato ou Mock
  • Unitário
  • Automação Funcional
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Teste Automatizado - TDD

2. Executar o Teste

  • Esperar a falha

1. Escrever um Teste para uma entidade

3. Implementar o código fonte

  • Mínimo Necessário

4. Rodar o Teste Novamente

  • Esperar o teste passar

Contexto

Considere que estamos desenvolvendo um sistema de e-commerce. O domínio principal é o gerenciamento de produtos, pedidos e clientes.

Iterar e Refinar

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Teste Automatizado - TDD - Benefícios

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Teste Automatizado - TDD - Atividade 4

1. Considerando o contexto ao lado crie a estrutura de um projeto python abaixo:

Contexto

Considere que estamos desenvolvendo um sistema de e-commerce. O domínio principal é o gerenciamento de produtos, pedidos e clientes.

ecommerce/
├── src/
│   ├── __init__.py
│   ├── product.py
├── tests/
│   ├── __init__.py
│   ├── test_product.py

2. Observe que foi criado um script para a entidade produto e outro para criar o teste de produto. 

3. Crie uma classe de teste para produto, e dentro dela um teste que cubra a criação de um Produto contendo nome e preço. Utilize o framework de teste unittest do python.

4. Implemente a classe de Produto e faça o teste passar. 

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
import unittest
from src.product import Product

class TestProduct(unittest.TestCase):
    def test_create_product(self):
        # Criamos um produto com nome e preço
        product = Product(name="Laptop", price=1500.00)
        
        # Verificamos se as propriedades foram atribuídas corretamente
        self.assertEqual(product.name, "Laptop")
        self.assertEqual(product.price, 1500.00)

    def test_set_price_negative(self):
        # Teste para verificar se o preço negativo é tratado
        product = Product(name="Smartphone", price=500.00)
        with self.assertRaises(ValueError):
            product.set_price(-100.00)

if __name__ == '__main__':
    unittest.main()
class Product:
    def __init__(self, name, price):
        self.name = name
        self.set_price(price)

    def set_price(self, price):
        if price < 0:
            raise ValueError("O preço não pode ser negativo")
        self.price = price
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Teste Automatizado - TDD X BDD

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Resumo sobre Teste e CI

Testes devem ser rápidos na execução

Não existe Build sem teste

Priorize os teste que atendam mais valor

Utilize padrões de teste

Execute testes antes de cada commit

Categorizar os tipos de testes criados

Executar os testes rápidos primeiro

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Pipeline Automatizada

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Pipeline Automatizada

Contínuo a cada commit

Independência de IDE

Tudo que é necessário está no repo

Um comando tudo automatizado

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Ferramentas para automação e controle

Linguagem Ferramentas
Java Ant, Maven, Gradle
Javascript Gulp, Grunt, Webpack
.Net MSBuild
Ruby Rake
Kotlin Gradle
Clojure Leiningen
C/C++ CMake/Make
PHP Composer
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Ferramentas para área de teste

Ferramentas Objetivo
Selenium, Playwright Automação funcional
Cucumber Teste de Aceitação
Postman Teste de serviço (API)
Jmeter, Locust Teste de Performance
Junit, xUnit, PyTest, Unitest Teste unitário e controle de teste
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Pipeline Automatizada

Build rápido -> Feedback Rápido

Otimize o build

  • Colete as métricas de execução
    • Verifique as fases de análise de código e teste
    • Utilize uma sequência que falhe rápido
    • Verifique a infra do build do sistema
    • Utilize cache
  • TEN-Minute Build 
    • O objetivo do Ten-Minute Build é construir automaticamente todo o sistema e executar todos os testes em dez minutos. Os fundadores do XP sugeriram um período de 10 minutos porque se uma equipe tem um build que leva mais tempo do que isso, é menos provável que ele seja executado com frequência, introduzindo assim um tempo maior entre erros.
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
  • Use ferramentas para automatizar o seu build
  • Build deve ser independente da IDE
  • Tudo que precisa estar no repositório
    (install scripts, env settings, build scripts, config files, database files, code)]
  • Estrutura de diretórios bem definidos e conhecidos
  • Builds rápidos que falham rápidos (10 minutos)
  • Script único que construí para ambientes (parametrizado)
  • Comando único de build (botão de build)
  • Use build machine (Cl daemon)

Pipeline Automatizada - Resumindo

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
  • De acordo com a documentação do Conventional Commits, commits semânticos são uma convenção simples para ser utilizada nas mensagens de commit. Essa convenção define um conjunto de regras para criar um histórico de commit explícito, o que facilita a criação de ferramentas automatizadas.
  • Esses commits auxiliarão você e sua equipe a entenderem de forma facilitada quais alterações foram realizadas no trecho de código que foi commitado.

Padrões de Commit

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
  • O commit semântico possui os elementos estruturais abaixo (tipos), que informam a intenção do seu commit ao utilizador(a) de seu código.

Tipos e descrição

feat - Commits do tipo feat indicam que seu trecho de código está incluindo um novo recurso (se relaciona com o MINOR do versionamento semântico).

fix - Commits do tipo fix indicam que seu trecho de código commitado está solucionando um problema (bug fix), (se relaciona com o PATCH do versionamento semântico).

docs - Commits do tipo docs indicam que houveram mudanças na documentação, como por exemplo no Readme do seu repositório. (Não inclui alterações em código).

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Tipos e descrição

build - Commits do tipo build são utilizados quando são realizadas modificações em arquivos de build e dependências.

perf - Commits do tipo perf servem para identificar quaisquer alterações de código que estejam relacionadas a performance.

test - Commits do tipo test são utilizados quando são realizadas alterações em testes, seja criando, alterando ou excluindo testes unitários. (Não inclui alterações em código)

style - Commits do tipo style indicam que houveram alterações referentes a formatações de código, semicolons, trailing spaces, lint... (Não inclui alterações em código).

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Tipos e descrição

chore - Commits do tipo chore indicam atualizações de tarefas de build, configurações de administrador, pacotes... como por exemplo adicionar um pacote no gitignore. (Não inclui alterações em código)

refactor - Commits do tipo refactor referem-se a mudanças devido a refatorações que não alterem sua funcionalidade, como por exemplo, uma alteração no formato como é processada determinada parte da tela, mas que manteve a mesma funcionalidade, ou melhorias de performance devido a um code review.

ci - Commits do tipo ci indicam mudanças relacionadas a integração contínua (continuous integration).

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Tipos e descrição

cleanup - Commits do tipo cleanup são utilizados para remover código comentado, trechos desnecessários ou qualquer outra forma de limpeza do código-fonte, visando aprimorar sua legibilidade e manutenibilidade.

raw - Commits do tipo raw indicam mudanças relacionadas a arquivos de configurações, dados, features, parâmetros.

remove - Commits do tipo remove indicam a exclusão de arquivos, diretórios ou funcionalidades obsoletas ou não utilizadas, reduzindo o tamanho e a complexidade do projeto e mantendo-o mais organizado.

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
Tipo do commit Emoji Palavra-chave
Acessibilidade ♿ :wheelchair:
Adicionando um teste ✅ :white_check_mark: test
Atualizando a versão de um submódulo ⬆️ :arrow_up:
Retrocedendo a versão de um submódulo ⬇️ :arrow_down:
Adicionando uma dependência ➕ :heavy_plus_sign: build
Alterações de revisão de código 👌 :ok_hand: style
Animações e transições 💫 :dizzy:
Bugfix 🐛 :bug: fix
Comentários 💡 :bulb: docs
Commit inicial 🎉 :tada: init

Padrões de emojis 💈

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Padrões de emojis 💈

Tipo do commit Emoji Palavra-chave
Configuração 🔧 :wrench: chore
Deploy 🚀 :rocket:
Documentação 📚 :books: docs
Em progresso 🚧 :construction:
Estilização de interface 💄 :lipstick: feat
Infraestrutura 🧱 :bricks: ci
Lista de ideias (tasks) 🔜 :soon:
Mover/Renomear 🚚 :truck: chore
Novo recurso ✨ :sparkles: feat
Package.json em JS 📦 :package: build
Performance ⚡ :zap: perf
Refatoração ♻️ :recycle: refactor
Limpeza de Código 🧹 :broom: cleanup
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Padrões de emojis 💈

Tipo do commit Emoji Palavra-chave
Removendo um arquivo 🗑️ :wastebasket: remove
Removendo uma dependência ➖ :heavy_minus_sign: build
Responsividade 📱 :iphone:
Revertendo mudanças 💥 :boom: fix
Segurança 🔒️ :lock:
SEO 🔍️ :mag:
Tag de versão 🔖 :bookmark:
Teste de aprovação ✔️ :heavy_check_mark: test
Testes 🧪 :test_tube: test
Texto 📝 :pencil:
Tipagem 🏷️ :label:
Tratamento de erros 🥅 :goal_net:
Dados 🗃️ :card_file_box: raw
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
  1. Comita diariamente o seu código na main do projeto?
  2. Você possui build e testes que rodam de modo automatizado?
  3. Quando existe um erro no build a equipe conserta em + ou - 10 minutos?

Checando integração contínua

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

O que é Entrega Contínua (CD)?

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Release não apenas engenharia

Entrega contínua (Continuous Delivery)

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Entrega contínua (Continuous Delivery)

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Entrega contínua (Continuous Delivery)

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Prática de desenvolvimento que garante que o código sempre esteja pronto para ser lançado.

Entrega contínua (Continuous Delivery)

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

O que é Deploy Contínuo (Continuous Deployment)?

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Extensão da entrega contínua, onde cada alteração aprovada é automaticamente implantada em produção.

Deploy Contínuo (Continuous Deploy)

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
  • Todo código que passa nos testes automatizados é automaticamente implantado em produção.
  • Elimina a etapa manual de aprovação.
  • Necessita de monitoramento contínuo para garantir a estabilidade.

Deploy Contínuo (Continuous Deploy)

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Diferença entre Deploy Contínuo e CD

Aspecto Entrega Contínua Deploy Contínuo
Objetivo Código sempre pronto para produção Implantação automática em produção
Automação Até a etapa de release Até a etapa de deploy
Controle A aprovação final é manual Sem intervenção manual
Frequência de Entrega Alta Muito alta
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Diferença entre Deploy Contínuo e CD

#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Deploy e seus problemas

  • Gerenciamento manual de ambientes
  • Ambientes diferentes de homologação ou produção
  • Deploy Manual
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Deploy e seus problemas

  • Gerenciamento manual de ambientes
  • Ambientes diferentes de homologação ou produção
  • Deploy Manual
  • Deploy apenas no fim de um ciclo
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Deploy e seus problemas

  • Gerenciamento manual de ambientes
  • Ambientes diferentes de homologação ou produção
  • Deploy Manual
  • Deploy apenas no fim de um ciclo
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Deploy e como atuar nos problemas?

  • Automatizar os pipelines por ambiente
  • Tornar todo o deploy automatizado
  • Realizar deploy com frequência durante o ciclo de desenvolvimento.
  • Analisar e atualizar com frequência os scripts de infra
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua

Atividade 5

Quizz

#3 Utilização do Git

A leitura da configuração é realizada de modo hierárquico

Primeiro aqui

Segundo aqui

Terceiro aqui

  • /etc/gitconfig: válido para todos os usuários no sistema e todos os seus repositórios. Se você passar a opção --system para git config, ele lê e escreve neste arquivo.
  • ~/.gitconfig ou ~/.config/git/config: Somente para o seu usuário. Você pode fazer o Git ler e escrever neste arquivo passando a opção --global.
  • config no diretório Git (ou seja, .git/config) de qualquer repositório que você esteja usando: específico para este repositório.

Configuração Inicial do Git

#3 Utilização do Git

Perfil

  1. Abrir o git bash
  2. Criar uma pasta com nome "git"
  3. Acessar a pasta "git"
$ git config --list
credential.helper=osxkeychain
alias.tree=log --graph --decorate --pretty=oneline --abbrev-commit
core.excludesfile=/Users/vaniltonpinheiro/.gitignore_global
core.autocrlf=input
difftool.sourcetree.cmd=opendiff "$LOCAL" "$REMOTE"
difftool.sourcetree.path=
mergetool.sourcetree.trustexitcode=true
user.name=Vanilton Pinheiro
user.email=vanilton.pinheiro@fpf.br
commit.template=/Users/vaniltonpinheiro/.stCommitMsg
#3 Utilização do Git

Perfil - Identificando Usuário

$ git config --global user.name "Vanilton Pinheiro"
$ git config --global user.email vanilton.pinheiro@fpf.br

Impacta no histórico do commit

Independe de como foi clonado o repositório ou se foi feito pull

E o que isso impacta?

#3 Utilização do Git

Alterando editor padrão

$ git config --global core.editor "nano"

Que tal alterar o editor padrão utilizado pelo git?

#3 Utilização do Git

Alterando branch padrão

Vamos definir a branch padrão ao criar repositórios git

$ git config --global init.defaultBranch main
#3 Utilização do Git

Ficou na dúvida do comando?

#3 Utilização do Git

Vamos criar nosso primeiro repositório git

  1. Criar uma pasta chamada "Project" dentro de nossa pasta git 
  2. Acessar a pasta
$ git init
#3 Utilização do Git

Vamos configurar nosso primeiro repositório git

1. E se quisermos alterar uma configuração apenas para o repositório?

$ git config user.name "Vanilton de S. F. Pinheiro"

As demais configurações serão do global

#3 Utilização do Git

Alterando outras configs do repositório local

Definir padrões para o repositório local

git config --local init.defaultBranch main
git config --local core.editor "code --wait"

caso não esteja no repositório

#3 Utilização do Git

Vamos configurar nosso primeiro repositório git

Branch (local)

Repositório git

#3 Utilização do Git

Versionando

#3 Utilização do Git

Vamos verificar o status do nosso repositório git

  1. nano README.md
  2. Escreva: Olá Mundo!
  3. Salve o arquivo

Estou na brach master

Nenhum commit ainda

Existe arquivos não rastreados

Arquivos identificados

Nada em Stage

#3 Utilização do Git

Brincando no Stage

Adicionando na Stage

Removendo da Stage

#3 Utilização do Git

Nosso primeiro commit

Agora temos o commit e o status não possui nada para comitar

Vamos testar apenas com "git commit"

#3 Utilização do Git

Visualizando o histórico de commit

Histórico de commits

Mensagem do commit

Utilizou o nome da configuração de perfil do projeto

Nosso primeiro ponto na árvore de commit

Commit Hash - SHA-1

#3 Utilização do Git

Visualizando o histórico de commit

$ git log --pretty=format:"%h - %an - %ar : %s"

%h - Hash do commit abreviado

%an - Nome do Autor

%ar - Data relativa do commit 

%s - Mensagem do commit

#3 Utilização do Git

Visualizando o histórico de commit

$ git log -3
$ git log --stat
$ git log --pretty=oneline --reverse
$ git log --pretty=oneline --reverse -2
$ git log --since=2.weeks
$ git log --since=2.days
$ git log --since=23.hour

Experimente

#3 Utilização do Git

Restaurando alterações

Modificações desfeitas para a última versão comitada no repositório local

#3 Utilização do Git

Restaurando alterações do remoto

Modificações desfeitas para a última versão comitada no repositório remoto

#3 Utilização do Git

Comitando e adicionando junto e misturado

Altere o arquivo README.md conforme abaixo

Adiciona todos arquivos da área no commit

#3 Utilização do Git

Comitando e adicionando arquivos por expressão regular

$ git add *.md
$ git add git-*.sh
$ git add script/\*.js
$ git add arquivo1 arquivo2 arquivo3

Inclui todos arquivos com extensão .md

Inclui todos arquivos iniciados por "git-" seguidos de qualquer texto e na extensão .sh

Inclui todos arquivos do diretório e subdiretórios script seguidos na extensão .js

Incluindo arquivos individualmente

#3 Utilização do Git

Corrigindo commit

  1. Corrigir antes do envio para remoto
  2. Corrigir após o envio para o remoto

git commit --amend

git commit --reset

#3 Utilização do Git

Corrigindo commit - amend

  1. Alterar o README.md com o conteúdo que desejar
  2. Adicionar o arquivo em Stage

Altere a mensagem do commit "Primeiro commit corrigido"

Verde (em Stage)

  1. Altera mensagem do commit
  2. Comitar o que está em stage
#3 Utilização do Git

Corrigindo commit - amend

  1. Vamos confirmar que o amend inclui o que está no stage
  2. Crie um novo arquivo chamado "nome.txt" na pasta do projeto

?? (Novo arquivo no repositório)

Obs: amend é sempre no último commit

#3 Utilização do Git

Reset

Redefine o HEAD atual para o estado especificado

1. git reset --mixed (default)

2. git reset --soft

3. git reset --hard

#3 Utilização do Git

Voltando versões

Duas maneiras simples

$ git reset HEAD~1 --soft
$ git checkout HASH_COMMIT 

Coloca o HEAD um commit atrás do atual (~1)

Iremos reforçar na seção de Interface Gráfica :)

Coloca o HEAD um commit atrás do atual

#3 Utilização do Git

Ignorando arquivos (não rastreando)

Vamos simular a necessidade de ignorar arquivos que não necessitam ser enviados para o repositório git.

Vamos criar uma pasta chamada libs e incluir dois arquivos nela.

Para ignorar vamos criar o arquivo .gitignore e definir o que gostariamos de ignorar

#3 Utilização do Git

Ignorando arquivos (não rastreando)

O .gitignore usa padrões globbing para fazer a comparação dos nomes de arquivos. Ex:

  • **/logs - Padrão com um asterisco duplo para combinar diretórios em qualquer lugar no repositório.
  • *.log - Um asterisco é um curinga que corresponde a zero ou mais caracteres.
  • !important.log - Ignora um padrão
  • debug[0-9].log - Colchetes podem ser usados para corresponder a um único caractere de um intervalo especificado.
#3 Utilização do Git

Ignorando arquivos (não rastreando)

Importante comitar o .gitignore

#3 Utilização do Git

Ignorando arquivos (não rastreando)

$ echo debug.log >> .gitignore
$ echo '*.txt' >> .gitignore

$ git rm --cached debug.log
rm 'debug.log'
$ git rm --cached nome.txt
rm 'nome.txt'

$ git add .gitignore
$ git commit -m "Ignorando debug.log e arquivos .txt"

Vamos criar os arquivos chamado debug.log e nome.txt, em seguida commitar

Vamos realizar o processo para remover.

#3 Utilização do Git

Vamos ver nosso histórico com mais detalhes

$ git log -p
$ git log -p -2 #últimos 2 commits
#3 Utilização do Git

Vamos ver nosso histórico com mais detalhes

$ git log --stat
$ git log -3 --stat #últimos 3 commits
#3 Utilização do Git

Vamos ver nosso histórico com mais detalhes

$ git log --graph --decorate --pretty=oneline --abbrev-commit

Dica: git config --global alias.tree "log --graph --decorate --pretty=oneline --abbrev-commit"

Cria um apelido para um outro comando

#3 Utilização do Git

Branch

Nota: git tree = "git log --graph --decorate --pretty=oneline --abbrev-commit"

Um branch no Git é simplesmente um ponteiro móvel leve para um commit. O nome da branch padrão no Git é a master . Conforme você começa a fazer commits, você recebe um branch master que aponta para o último commit que você fez. Toda vez que você confirma, o ponteiro do branch master avança automaticamente.

git checkout -b vava

#3 Utilização do Git

Branch

#3 Utilização do Git

Branch

Deletar uma branch

Listando Branchs

#3 Utilização do Git

Branch

Experimentem:

  1. Crie uma branch chamada "funcionalidade1"
  2. Faça 2 commits na branch "funcionalidade1" com novos arquivos
  3. Retorne a branch master
  4. Liste os arquivos contidos no repositório
  5. O que ocorreu?
#3 Utilização do Git

Merge

Juntar dois ou mais históricos de desenvolvimento

#3 Utilização do Git

Rebase

Reaplicar commits em cima de outra ramificação (base)

Vamos verificar como ficou nossa árvore de commits

#3 Utilização do Git

Stash

O Stash é útil quando queremos tirar temporariamente arquivos do stage para utilizar posteriormente.

Remove do stage e inclui no stash

Aplica o stage na branch atual

#3 Utilização do Git

Stash

Criando um nome para o Stash

Aplicando um stash específico

Limpando os stash's salvos

#3 Utilização do Git

Resumindo

#3 Utilização do Git

Remoto

$ git remote -v
$ git remote --verbose 
#3 Utilização do Git

Gitlab

O GitLab é um gerenciador de repositório de software baseado em git, com suporte a Wiki, gerenciamento de tarefas e CI/CD.

  • Software Livre
  • Permite que os desenvolvedores armazenem o código em seus próprios servidores
#3 Utilização do Git

Gitlab

Quem usa?

#3 Utilização do Git

Gitlab - História

2013

Produtos

Em Julho  ouve a separação em dois produtos:

  • Gitlab (CE) Comunity Edition
  • Gitlab (EE) Enterprise Edition

2014

Open Core

Adoção do modelo 'Open Core'. Assim mudando a licença MIT do produto Gitlab EE para licença proprietária contendo alguns aspectos a mais que o produto Gitlab CE.

Início

O software foi escrito originalmente por Dmitriy Zaporozhets (atual CTO), da Ucrânia  em 2011, era chamado GitLab sendo totalmente de graça e open source, distribuído sob a Licença MIT.

1970

#3 Utilização do Git

Gitlab - Criando um repositório

  1. Criar uma conta no https://gitlab.com
  2. Criar um novo projeto https://gitlab.com/projects/new
#3 Utilização do Git

Gitlab - Criando um repositório remoto

Vamos as opções..

  1. Podemos clonar o repositório utilizando SSH ou HTTPS
  2. Existem possibilidades caso:
    1. Seja um novo repositório
    2. Já exista o repositório localmente
    3. Já exista o repositório localmente com um remoto diferente

Text

#3 Utilização do Git

Gitlab - Incluir repositório remoto ao nosso local

Agora vai..

  1. Vamos utilizar o protocolo TCP/IP HTTPS dado que pra SSH devemos configurar chaves (veremos depois como configura)
  2. Como ja possuímos um repositório local vamos incluir apenas o remoto.

Nome convenção

Pode haver mais de um

Enviar

Baixar

#3 Utilização do Git

Gitlab - Enviar nossos commits para o remoto

  1. Para enviar o conteúdo de nosso repositório local devemos utilizar o git push
#3 Utilização do Git

Gitlab - Verificar a atualização no repositório remoto

#3 Utilização do Git

Gitlab - Clonando repositório

git clone https://repositorio.git nome_da_pasta

#3 Utilização do Git

Gitlab - Verificando branch

  • git branch
  • git branch -a
#3 Utilização do Git

Gitlab - Checkout de  branch

  • git checkout -b nome_branch_local origin/nome_branch_no_remoto
#3 Utilização do Git

Gitlab - Atualizar  branch local a partir do remoto

$ git fetch origin # Busca de todas as branches
$ git pull # Puxa de acordo com HEAD 
$ git pull origin master # Puxa de acordo com a origem (remoto) 
  1. O professor irá alterar o arquivo README.md
  2. Comitar a modificação
  3. Puxar a partir do repositório local

 

#3 Utilização do Git

Gitlab - Simulando um conflito

  1. Alunos criem um novo commit alterando o README.md 
  2. O Professor alterará o arquivo só que diretamente no remoto
  3. Agora vamos fazer um "git fetch origin" para atualizar nossas branchs e um "git status"

Cadê a origem que estava aqui!

#3 Utilização do Git

Gitlab - Simulando um conflito

  1. Vamos fazer o pull (baixar) do remoto
  2. O que vai acontecer?
  3. Resolver o conflito
#3 Utilização do Git

Gitlab - Resolvendo o conflito

  1. Comitar as modificações
  2. Fazer o push
  3. Verificar nossa árvore
#3 Utilização do Git

Gitlab - Criando chave SSH

Com poucos passos conseguimos configurar nossa chave pública e privada (local) associando ao remoto

  1. Gerar as chaves 
    1. id_rsa.pub (pública)
    2. id_rsa (privada)
  2. Você pode criá-los executando um programa chamado ssh-keygen, que é fornecido com o pacote SSH em sistemas Linux/Mac e vem com o Git para Windows:

chave pública

#3 Utilização do Git

Gitlab - Associando chave SSH

  1. Acessar Preferencias do seu usuário no gitlab

2. Agora basta adicionar sua chave pública gerada. Prontinho pode usar o repositório remoto com SSH.

$ git remote set-url origin git@gitlab.com:Vanilton18/git-whatever.git
#3 Utilização do Git

Git - O que vimos até aqui

  • push
  • pull
  • clone
  • fetch
  • remote
  • merge
  • rebase
  • branch
  • stash
  • ignore
  • status
  • log
  • log com gráfico
  • add
  • rm
  • reset
  • checkout
  • switch
  • commit (amend e com add)
#3 Utilização do Git

Clientes Git

Por meio dos clientes git podemos realizar todas as ações realizadas no terminal com ganhos de produtividade.

#3 Utilização do Git

Utilizando cliente Git - PyCharm

  1. Instale o PyCharm CE (Community)

2. Importar o projeto que já criamos no git

#3 Utilização do Git

Utilizando cliente Git - PyCharm

  1. Para ver nosso repositório agora, podemos usar o terminal do próprio PyCharm

.idea/ gerada pela IDE

2. Como é uma pasta gerada para cada usuário, vamos incluí-la no .gitignore.

#3 Utilização do Git

Utilizando cliente Git - PyCharm

  1. Já sabemos visualizar os status pelo terminal agora vamos checar isso na IDE
  2. Agora temos a lista de arquivos alterados pendentes de commit, abra o arquivo e vamos poder visualizar a diferença do arquivo comitado para o alterado.
#3 Utilização do Git

Utilizando cliente Git - PyCharm

  1. Agora vamos comitar nossa alteração pela interface gráfica

Comitar local

Comitar e enviar para o remoto

#3 Utilização do Git

Utilizando cliente Git - PyCharm

  1. Para exibir o log podemos acessar o Show Git Log
#3 Utilização do Git

Utilizando cliente Git - PyCharm

  1. Façam alterações no repositório e enviem o commit (push) para o remoto.
  2. Alguém irá realizar o envio primeiro para o remoto e fatalmente alguém terá que realizar o Merge após tentar um Push :)
#3 Utilização do Git

Utilizando cliente Git - PyCharm

  1. Agora vamos resolver..

Merge = Novo Commit

#3 Utilização do Git

Atualizando

  1. Atualizar a branch atual com o remoto
  2. Busca as alterações de todas as raízes e branches do projeto e mescla as branches remotas rastreadas em sua cópia de trabalho local (equivalente a pull)
#3 Utilização do Git

Criando branch e enviando ao remoto

  1. Crie uma branch com seu nome
  2. Faça o Push para o remoto
  3. Agora realize uma alteração na sua branch e faça o push
  4. Vamos verificar as alterações trocando de branch
#3 Utilização do Git

Criando branch e enviando ao remoto

  1.  Altere um arquivo e clique com o direito sobre ele na lista de alterações
  2. Salve o Shelve

Nota: Shelves são salvar em .idea/shelf

#3 Utilização do Git

Shelve

  1.  Altere um arquivo e clique com o direito sobre ele na lista de alterações
  2. Salve o Shelve

Nota: Shelves são salvar em .idea/shelf

#3 Utilização do Git

Filtro de Branchs

#3 Utilização do Git

Merge entre Branchs

  1. Vamos ver onde está nosso HEAD
  2. Faça checkout de sua Branch
  3. Clique com o direito na branch que deseja puxar para a sua
  4. Faça o merge
#3 Utilização do Git

Reset

  1. git reset --soft
  2. git reset --mixed (default)
  3. git reset --hard

Reinicia a árvore sem perder o conteúdo dos commits, e incluindo os arquivos em stage

Reinicia a árvore sem perder o conteúdo dos commits, porém não incluindo os arquivos em stage

Reinicia a árvore e perde o conteúdo dos commits anteriores, mantendo apenas os arquivos do commit selecionado

#3 Utilização do Git

Reset

#3 Utilização do Git

Gitlab - Configurações

  1. Gerais
  2. Integrações
  3. Webhooks
  4. Repositório
  5. CI/CD
    1. Runners
  1. Repositório
    1. Commits
    2. Branchs
    3. Tags
  2. Issues
  3. Board
  4. Wiki
#3 Utilização do Git

Gitlab - Merge Request

  1. Vamos desenvolver um script python para realizar as operações matemáticas de adição, subtração, divisão, multiplicação.
  2. Para cada operação desenvolvida vamos abrir um Merge Request ou Pull Request
    • Vamos verificar como resolver conflitos em MR
  3. Code Review 
    • Correção de review
#3 Utilização do Git

Gitlab - Merge Request

#3 Utilização do Git

Gitlab - Merge Request

#3 Utilização do Git

Gitlab - Pipeline

  1. Possuir um runner compartilhado ou dedicado https://docs.gitlab.com/runner/register/
  2. Configurar os estágios do pipeline no .gitlab-ci.yml

  3. Configurar as regras de execução

#3 Utilização do Git

Gitlab - Trabalho Pipeline

  1. Configure uma pipeline com duas etapas, sendo elas:
    1. Executar testes estáticos para o projeto  de calculadora em python. Utilize flake8.
    2. Execute testes unitários utilizando o framework unittest
  2. Esta execução deve ser realizada em um Runner na nuvem.

Referências

  1. CAMERON, E. Gerenciamento de mudanças. São Paulo: Clio Editora, 2009.

  2. CHACON, S. Pro Git. Dialetica. 2009. 14-302-1833-9.

  3. MOLINARI, L. Gerência de configuração - técnicas e práticas no

    desenvolvimento do software. Florianópolis: Visual Books, 2007.

  4. BROWN, W. J. et al. Antipatterns and patterns in software configuration

    management. New York: Wiley computer publishing, 1999.

  5. MIKKELSEN, T.; PHERIGO, S. Practical software configuration management:

    the Latenight Developer's Handbook. Bergen County: Prentice Hall PTR, 1997.

  6. PRESSMAN, R. S. Engenharia de Software. São Paulo: Pearson Makron Books,

    1995.

Referências

eTech - Ferramentas para Versionamento de Código e Integração Contínua

By Vanilton Pinheiro

eTech - Ferramentas para Versionamento de Código e Integração Contínua

Compreender e desenvolver a capacidade de aplicar os conceitos, técnicas, métodos e ferramentas para a manutenção dos artefatos relacionados ao desenvolvimento de software.

  • 646