Engenharia de DevOps
Fernando Augusto Medeiros Silva
Práticas da Primeira Maneira
O que é uma pipeline
Quando começa a Integração
• Planejamento: Desenvolvimento Ágil, Kanban, Scrum
• Codificação: TDD, BDD, Controle de Versão
• Construção: Integração Contínua
• Implantação: Entrega Contínua
• Operação: Gestão de infraestrutura, incidentes,
Configuração, acesso...
• Feedback: Telemetria
Entrega Contínua
• "Entrega Contínua é a capacidade de implementar
mudanças de todos os tipos — incluindo novas
funcionalidades, alterações de configuração, correções
de bugs e experimentos — em produção, ou nas mãos
dos usuários, de forma segura e rápida e sustentável.“
Fonte: FARLEY,Dave;HUMBLE,Jez. continousdelivery.com
Integração Contínua
“É uma prática de desenvolvimento de software na qual
cada membro de uma equipe mescla suas mudanças em
uma base de código junto com as mudanças de seus
colegas pelo menos diariamente. Cada uma dessas
integrações é verificada por uma construção
automatizada (incluindo teste) para detectar erros de
integração o mais rápido possível.”
Martin Fowler
Fonte: martinfowler.com
Do fluxo a pipeline
• Identificar valor
• Mapear o fluxo de valor
• Criar um fluxo de trabalho contínuo
• Estabelecer um sistema de produção puxada
• Facilitar a melhoria contínua.
Eficiência
“Quanto tempo você demora para implantar uma
mudança com somente uma linha de código?"
Mary Poppendieck
Fonte: aws.com
Glossário
• Bake (Assar): Preparação de imagens de ambiente de execução
que incluem configurações e softwares necessários para a
operação.
• Branch (Ramo): Representa uma cópia separada do código fonte,
permitindo desenvolvimento ou correções isoladas sem afetar o
código principal.
• Build (Construir): Processo de compilar e preparar o código fonte
para gerar artefatos executáveis do software.
Glossário
• Deploy (Implantar):Colocar um software ou uma aplicação em
funcionamento no ambiente de produção ou outros ambientes
operacionais.
• Integrate (Integrar): Ação de combinar e sincronizar código de
diferentes fontes para formar um sistema unificado.
• Prod (Produção): Ambiente onde o software é executado e usado
pelos usuários finais após completar todos os testes e validações.
Glossário
• Promotion (Promoção): Processo de avançar software através de
diferentes estágios ou ambientes de desenvolvimento até a
produção, baseado na estabilidade e qualidade
• Quality Gate (Portão de Qualidade): Ponto de controle onde o
software precisa satisfazer critérios pré-definidos de qualidade
antes de avançar para o próximo estágio do ciclo de vida.
• Shift Left (Deslocar para a Esquerda): Estratégia de trazer práticas
de teste e qualidade mais cedo no processo de desenvolvimento
para melhorar a qualidade e reduzir correções tardias.
Glossário
• Test (Testar): Processo de executar um programa ou aplicação
com o objetivo de identificar erros, falhas ou defeitos.
• UAT (Teste de Aceitação do Usuário): Fase final de testes antes do
lançamento do software, onde usuários finais verificam se o
sistema atende às suas necessidades e expectativas.
Tonando o Pipeline possível
Requisitos
• Possibilitar a criação sob demanda de ambiente de DEV,
UAT, PRD
• Criar nosso repositório único de verdade para o sistema
inteiro
• Tornar a reconstrução da infraestrutura mais fácil que o
reparo
• Modificar o DoD (Definition of Done) para incluir a
execução em ambientes do tipo produção
Criação de ambientes Automática
• A verdade saberemos somente em produção,
trabalhamos com proximidade
• Criação automática permite corrigir os erros de
forma iterativa
• Ambientes são caros. Desligue quando não usar
• Criação por código permite experimentar
• Sempre é possível reconstruir
Casos
• Zero-Hora: Login gastando 4 a 5 minutos
• Diferença de Banco de Dados Dev PRD
• Quase Perda de contrato
• Helthcare.org: Ambiente de testes não era
suficiente para um teste de larga escala. Fracasso
de lançamento
Infra Estrutura como código
Cloud x on Premises
Fonte: aws.com
google.com
Microsoft.com
Fonte Única da Verdade
• DevOps é sobre quebrar silos
• Disponibilidade como um supermercado
• Transparencia
SCM (Source Control Manager)
Git
• Criado por Linus Torvalds em 2005
• Arquitetura distribuída
• Foco em controle de Branchs
• Simples:
• git clone
• git checkout, merge, commit
• git push, pull
Fonte: screenshot/youtube
Fonte única da verdade
• Colaboração
• Visibilidade para todos
• Histórico
• Comentários
• Rollback
• Integração com ferramentas
O que vai no GIT? Tudo
• Código de aplicativo
• Scripts de build
• Código de Testes
• Scripts de empacotamento
O que vai no GIT? Tudo
• Código do IaC
• Scripts de Configuração de ambiente
• Estados de implantação
O que vai no GIT? Tudo
• Arquivos de configuração em geral
• DNS
• Firewall
• Permissionamento
• Rotas
• Documentação
Repositório de objetos
• Arquivos binários
• Bibliotecas
• Arquivos que precisam de acesso para integração
Repositório de objetos
• Web Object Storage
Pipeline Triggers
• Execução de código automática em ações no repositório
• Base do CICD moderno
• Possibilidade de Linters
• Operação por Merge Request
Reconstruir mais fácil que reparar
• Construção automática + Fonte da verdade
• Ambiente Descartável
• Maquinas Cattle
• Maquinas PET
Exemplos
• Pool de máquinas escaláveis
• Containers
• Where There's A Will, There's A Way
Possibilitando Testes Automatizados
Build Contínuo Integração contínua
• Testes são loops de feedback
• Manter a qualidade próxima da fonte
• Andon cord
• Manter o estado implementável
Pipeline CI
Plan Code Build Teste Release
Fonte: freeimages.com
Colaboração + Confiança + Experimentação
Domínios de responsabilidade
Aprovação + Operação
Fonte: freeimages.com
Testes Automatizados
Aprovação Automática
Análise Teste de
Teste Teste de
de Build Integração Performance
Unitário Aceitação
Código
Aprovação Manual
Implantação Implantação
Staging/Teste Produção
• TDD Test drive Development
• BDD Behaviour Drive Development
Fonte: freeimages.com
Teste Unitário
• Teste de dentro para fora
• Componentes de software
Fonte: cleancode.org
Teste Unitário
• Pytest
• JUnit
• golang test, testify
Teste Integração
• Componentes integrados
• Verifica se partes do software funcionam entre si
Fonte: freeimages.com
Teste Aceitação
• Pytest, Behave, unittest
• JUnit, spring test
• Testify, GoConvey, Ginkgo
Fonte: freeimages.com
Teste Exploratório (Manual)
• Smoke Test
• Procurando por erros específicos
Fonte: freeimages.com
Teste Regressivo
• Procura por involução
• Manual ou automático
• Selenium Webdriver
Fonte: freeimages.com
Teste Desempenho
• Disciplina específica
• Objetivo na pipeline é evitar regressão
• Requer trabalho anterior de medição correta
• Teste de performance é uma disciplina ligada
a estatística
Fonte: amazon.com
Pitfalls
• Falta de metas
• Metas enviesadas
• Abordagem não sistemática
• Análise sem compreensão do problema
• Métricas erradas
• Workload não representativo
• Técnica equivocada
• ...
Teste Desempenho
• Golden Signals
• Latência
• Vazão
• Saturação
• Taxa de erros
• Percentil 99,95, 99
• Média e Mediana
Teste Desempenho
• K6
• JMeter
• Locust
Fonte: freeimages.com
Testes de Qualidade de Código e Segurança
Quality Gate
Enforce de estilo
Coverage Test
Análise de segurança -SAST DAST (Shift Left)
Testes de Qualidade de Código e Segurança
• SonarQube
• Veracode
• SAST
• DAST
Fonte: freeimages.com
Fuzzy & Mutatinng
• Fuzzy Test
• Insere valores aleatóreos nas funções
• Busca por falhas de tratamento
• Mutating Test
• Modifica partes do código
• Verifica a qualidade dos Testes
Fonte: freeimages.com
Piramide de testes IDEAL vs NÃO IDEAL
Teste Teste Manual
Manual
GUI
automático
Gui Automático
API Automático
Integração Automático Integração
Componente automático automático
Teste
Unitário
Teste Unitário
Fonte: TestPyramid Martin Fowler
Performance de Testes
Aprovação Automática
Análise Teste de
Teste Teste de
de Build Integração Performance
Unitário Aceitação
Código
Performance de Testes
Aprovação Automática
Performance
Análise
Teste Teste de
de Build
Unitário Aceitação
Código
Teste de
Integração
Requisitos Não funcionais
• Testar configuração automática
• Linters
• Megalinter!
• Ambiente UAT e PRD diferem de tamanho não natureza
Fonte: freeimages.com
Praticando a integração contínua
Integração contínua
• Todos devem integrar seu código ao repositoório principal
pelo menos 1 vez ao dia
• Integração é passar por todos os passos até o último antes
dos testes manuais
• Software integrado está pronto para o ambiente tipo
produção
Andon Cord
• Quebra da pipeline para a linha de produção
• Ninguém integra se a pipeline está parada
Fonte: freeimages.com
Trunk Based Development
• Otimizado para desempenho individual
• Dificuldade de merge no futuro
• Otimizado para integração em grupo
• Software sempre pronto para a produção
Fonte: freeimages.com
Branches
Garantia de lotes pequenos
Minimizar o WIP
Menor tempo de Merge
Menor tempo de build
Menor risco de conflitos
Menor alteração na produção
Menor chance de falhas
Menos retrabalho
Fonte: freeimages.com
O que precisamos para Integrar?
• Codificar
• Testes Unitários
• Análise de qualidade
• Codificar • Compilar
• Compilar • Segurança SAST/DAST
• ReLease • Testes de integração
• Entregar • Testes de aceitação
• Testes não funcionais
• Release
Ambientes de CI
• GitLab
• GitHub
• CodeFresh
• Travis
Fonte: worldvectorlogo.com
Requisitos Para integração
• Ambiente de build
• Ambiente de testes
• Execução no estágio de commit
• Implantação de pipeline visual
Fonte: freeimages.com
GitLab
• Ambiente Integrado: Git, CICD, Gestão de issues, documentação
• Configuração via arquivo .gitlab-ci.yml no repositório Git.
• Ampla variedade de executores (runners) disponíveis, incluindo
Docker, Kubernetes e máquinas virtuais.
• Visualização direta de pipelines e resultados de testes dentro da
interface Única
• Suporte extensivo para Docker, incluindo a construção e o push
de imagens diretamente em repositório próprio
GitHub Actions
• Configuração através de arquivos YAML dentro do
diretório .github/workflows do repositório.
• Integração nativa com GitHub Issues e Pull Requests.
• Marketplace de ações que podem ser reutilizadas em múltiplos
workflows.
• Extrema facilidade de uso para projetos hospedados no GitHub.
• Grande comunidade e ecossistema de ações pré-construídas.
Travis-CI
• Integra-se aos repositórios GIT
• Configuração através de um arquivo .travis.yml no repositório.
• Suporte para múltiplos sistemas operacionais, incluindo Linux,
macOS e Windows.
• Muito popular entre projetos de código aberto devido ao seu
plano gratuito para esses projetos.
• Setup simplificado e excelente documentação.
CodeFresh
• Codefresh é uma plataforma CI/CD construída para containers e
Kubernetes.
• Interface gráfica para a criação de pipelines.
• Integração nativa com Docker e Kubernetes.
• Dashboard integrado para visualizar builds, deploys e status de
testes.
• Foco em microserviços e orquestração de containers.
• Suporte robusto para práticas DevOps modernas.