Ferramentas para Versionamento de
Código e Integração Contínua
Agenda
Introdução a gerenciamento de versão
Conceitos sobre integração contínua, deploy contínuo e entrega contínua
Utilização do Git
Ferramentas para integração contínua
#0 Apresentação#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.
#1 Introdução a gerenciamento de versão
Sistema de controle de versões:
SCM (do inglês source code management)
#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
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
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
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
Subversion (SVN)
Fundado pela CollabNet, Inc., o projeto e o software Subversion tiveram um sucesso incrível na última década.
* Código aberto
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
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
#1 Introdução a gerenciamento de versão
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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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.
#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.
#1 Introdução a gerenciamento de versão
Quais vantagens e problemas possuímos nesse sistema?
#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
#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
#1 Introdução a gerenciamento de versão
Atividade 1
10 Minutos
#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?
#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
#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
#1 Introdução a gerenciamento de versão
#1 Introdução a gerenciamento de versão
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: alwaysO 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
# 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
# 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
#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
https://www.visualsvn.com/downloads/
#1 Introdução a gerenciamento de versão
#1 Introdução a gerenciamento de versão
#1 Introdução a gerenciamento de versão
#1 Introdução a gerenciamento de versão
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.
#1 Introdução a gerenciamento de versão
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.
#1 Introdução a gerenciamento de versão
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.
#1 Introdução a gerenciamento de versão
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.
#1 Introdução a gerenciamento de versão
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.
#1 Introdução a gerenciamento de versão
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.
#1 Introdução a gerenciamento de versão
Atividade 2
45 Minutos
#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.
#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.
#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.
#1 Introdução a gerenciamento de versão
Complexidade Inicial
Menor Flexibilidade
Risco de Falha no Servidor
Dificuldade de Trabalho Offline
Escalabilidade Limitada
#1 Introdução a gerenciamento de versão
Quais vantagens e problemas possuímos nesse sistema?
#1 Introdução a gerenciamento de versão
#1 Introdução a gerenciamento de versão
#1 Introdução a gerenciamento de versão
#1 Introdução a gerenciamento de versão
#1 Introdução a gerenciamento de versão
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
"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
#1 Introdução a gerenciamento de versão
#1 Introdução a gerenciamento de versão
#1 Introdução a gerenciamento de versão
Todo o controle de versão realizado localmente.
#1 Introdução a gerenciamento de versão
Processo de sincronização entre repositório local e remoto e vice versa.
#1 Introdução a gerenciamento de versão
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
#1 Introdução a gerenciamento de versão
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
#1 Introdução a gerenciamento de versão
#1 Introdução a gerenciamento de versão
#1 Introdução a gerenciamento de versão
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
Prepara
Valida
Envia para o git
#1 Introdução a gerenciamento de versão
Atividade 3
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
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
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
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
Teste Automatizado - TDD
2. Executar o Teste
1. Escrever um Teste para uma entidade
3. Implementar o código fonte
4. Rodar o Teste Novamente
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:
ecommerce/
├── src/
│ ├── __init__.py
│ ├── product.py
├── tests/
│ ├── __init__.py
│ ├── test_product.py2. 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
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
Pipeline Automatizada - Resumindo
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
Padrões de Commit
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
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
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
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
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
Deploy e seus problemas
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
Deploy e seus problemas
#2 Conceitos sobre integração contínua, deploy contínuo e entrega contínua
Deploy e como atuar nos problemas?
#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
Configuração Inicial do Git
#3 Utilização do Git
Perfil
$ 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.brImpacta 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
$ 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
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.hourExperimente
#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 arquivo3Inclui 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
git commit --amend
git commit --reset
#3 Utilização do Git
Corrigindo commit - amend
Altere a mensagem do commit "Primeiro commit corrigido"
Verde (em Stage)
#3 Utilização do Git
Corrigindo commit - amend
?? (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:
#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-commitDica: 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:
#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
#3 Utilização do Git
Gitlab
É usado por mais de 100 000 organizações, entre elas:
IPqM (Marinha do Brasil)
Serpro (Serviço Federal de Processamento de Dados)
NASA, Alibaba, Invincea, O’Reilly Media, CERN, Projeto GNOME, SpaceX
FPF Tech
#3 Utilização do Git
Gitlab - História
Produtos
Em Julho ouve a separação em dois produtos:
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.
#3 Utilização do Git
Gitlab - Criando um repositório
#3 Utilização do Git
Gitlab - Criando um repositório remoto
Vamos as opções..
Text
#3 Utilização do Git
Gitlab - Incluir repositório remoto ao nosso local
Agora vai..
Nome convenção
Pode haver mais de um
Enviar
Baixar
#3 Utilização do Git
Gitlab - Enviar nossos commits para o remoto
#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
#3 Utilização do Git
Gitlab - Checkout de branch
#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)
#3 Utilização do Git
Gitlab - Simulando um conflito
Cadê a origem que estava aqui!
#3 Utilização do Git
Gitlab - Simulando um conflito
#3 Utilização do Git
Gitlab - Resolvendo o conflito
#3 Utilização do Git
Gitlab - Criando chave SSH
Com poucos passos conseguimos configurar nossa chave pública e privada (local) associando ao remoto
chave pública
#3 Utilização do Git
Gitlab - Associando chave SSH
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
#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
2. Importar o projeto que já criamos no git
#3 Utilização do Git
Utilizando cliente Git - 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
#3 Utilização do Git
Utilizando cliente Git - PyCharm
Comitar local
Comitar e enviar para o remoto
#3 Utilização do Git
Utilizando cliente Git - PyCharm
#3 Utilização do Git
Utilizando cliente Git - PyCharm
#3 Utilização do Git
Utilizando cliente Git - PyCharm
Merge = Novo Commit
#3 Utilização do Git
Atualizando
#3 Utilização do Git
Criando branch e enviando ao remoto
#3 Utilização do Git
Criando branch e enviando ao remoto
Nota: Shelves são salvar em .idea/shelf
#3 Utilização do Git
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
#3 Utilização do Git
Reset
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
#3 Utilização do Git
Gitlab - Merge Request
#3 Utilização do Git
Gitlab - Merge Request
#3 Utilização do Git
Gitlab - Merge Request
#3 Utilização do Git
Gitlab - Pipeline
Configurar os estágios do pipeline no .gitlab-ci.yml
Configurar as regras de execução
#3 Utilização do Git
Gitlab - Trabalho Pipeline
Referências
CAMERON, E. Gerenciamento de mudanças. São Paulo: Clio Editora, 2009.
CHACON, S. Pro Git. Dialetica. 2009. 14-302-1833-9.
MOLINARI, L. Gerência de configuração - técnicas e práticas no
desenvolvimento do software. Florianópolis: Visual Books, 2007.
BROWN, W. J. et al. Antipatterns and patterns in software configuration
management. New York: Wiley computer publishing, 1999.
MIKKELSEN, T.; PHERIGO, S. Practical software configuration management:
the Latenight Developer's Handbook. Bergen County: Prentice Hall PTR, 1997.
PRESSMAN, R. S. Engenharia de Software. São Paulo: Pearson Makron Books,
1995.
Referências
https://pt.wikipedia.org/wiki/Sistema_de_controle_de_vers%C3%B5es