test driven infrastructure na globo.com
DESCRIPTION
As técnicas de TDD buscam garantir que, ao longo de sua evolução, um sistema continue atendendo a todos os seus requisitos e respeitando suas interfaces públicas. Entretanto, ao ser colocado em produção esse sistema vai depender de diversos serviços de infraestrutura, como rede, storage, caching e outros serviços e sistemas remotos. Como assegurar que essas dependências também estão respeitando as especificações originais? Nesta apresentação, mostramos a importância de realizar testes sobre a infraestrutura, desde os ambientes de desenvolvimento e QA até os ambientes de produção, aplicando os princípios do TDD a toda a cadeia de dependências de um sistema. Vamos também mostrar exemplos práticos com as ferramentas de testes usadas na Globo.com.TRANSCRIPT
globo.comTest DrivenInfrastructure naGlobo.comFernando Carolo e Rogério SchneiderQCon São Paulo 2014
Quinta-feira15:45
Uma turminha dobarulho aprontando
altas confusõesconfigurações
Tudo era feito à mão
PARTE 1
globo.com
Configurar um servidor era tarefa manual Instalar pacotes, editar arquivosAlguns arquivos foram para um share NFS /etc, /opt, /usr/local acertados manualmenteTrabalho repetido em vários hosts ClusterSSH, Capistrano
globo.com
Uma maneira melhor
Infraestrutura = código
globo.com
Mesmos princípios Controle de versão Pair programming e revisão de código Test driven development Integração contínua
globo.com
Ferramentas Controle de versão Automação Máquinas virtuais Integração contínuaEscolha as suas
globo.com
Ferramentas que usamos Controle de versão Git Automação Kickstart, Puppet Máquinas virtuais Vagrant Integração contínua JenkinsNão são as únicas
globo.com
Kickstart Instalação padronizada de SO Imagens para boot via PXE Apenas os pacotes básicos Serviços essenciais (resolver, ntp, ldap) Diferenças só por conta do hardware
globo.com
Puppet Configuração do host para um projeto Pacotes de software Arquivos de configuração Controle do startup da máquina
globo.com
Foreman Front-end para o puppet master Atribuição de papéis a cada host Gerência de certificados do puppet Status de cada host
globo.com
Vagrant Gerenciamento de máquinas virtuais Criação de VMs por script Compatível com Virtualbox, VMWare, etc Ambiente completo no seu notebook
globo.com
Jenkins Integração contínua também para infra Testes unitários nos módulos puppet Montagem de ambientes com Vagrant Instalação e testes do projeto
Aprendizado
PARTE 2
globo.com
Puppet é funcional Módulos descrevem o estado desejado Pense em makefile, não em scriptDependências devem ser explícitas Use requires e anchorsDesfazer é difícil Usar ensure => absent fica confuso Começar do zero é mais fácil
globo.com
Unifique o código do seu projeto Aplicação + módulos puppet Versionamento em conjuntoIsole os parâmetros do código Use defines separados ou hieraCódigo legível é código bonito puppet-lint
globo.com
Separe os ambientes no Foreman Versões para desenvolvimento, QA, produçãoCuidado com módulos compartilhados Testes e eterna vigilância Librarian-puppet pode ajudarDecida como aplicar as mudanças Use --onetime ao invés de rodar o agente como daemon
Infraestrutura =código dos outros
PARTE 3
globo.com
Mudanças acontecem o tempo todo Em outras lugares Principalmente em produçãoNem tudo está do jeito desejado Serviços externos, bases de dados, servidores de arquivos, ACLs, etcPrecisamos de testes de aceitação
globo.com
Nossa solução: TDIFerramenta para rodar testes sobre a infra DNS, filesystem, HTTP, etcPrática de TDD Escreva o teste, rode, corrija os errosPlano de teste num arquivo JSON Pode ser gerado no build da aplicação Ajustado ao papel de cada host Torna-se teste de aceitação da infraestrutura
globo.com
TDI Ruby – gem install tdi Open source (github) Beta Curta e compatilhe Pull requests são bem-vindos
Demonstração
PARTE 4
globo.com
Serviços externos via HTTP URLs de serviços públicos na internet
globo.com
{ "app": { "desc": "Test service dependencies", "http": { "http://globoesporte.globo.com/healthcheck": { "match": "WORKING" }, "http://api.sde.globo.com": { "code" : 301 }, "https://api.sde.globo.com": { "code" : 401 }, "https://api.cartola.globo.com/mercado/status.json": { "code" : 200 }, "https://api.cartola.globo.com/wrong-url": { "code" : 200 } } }}
globo.com
globo.com
Acessos de rede Conexões em portas específicas
globo.com
{ "app": { "desc": "Test network connectivity", "acl": { "port": 80, "www.globo.com": { }, "globoesporte.globo.com": { }, "g1.globo.com": { }, "www.example.com": { "port": 9999 }, "localhost": { "port": [22, 80, 65535] } } }}
globo.com
Perguntas
FINAL
CRÉDITOS
globo.com
Fernando Carolo [email protected]
Rogério Schneider [email protected]
TDI github.com/globocom/tdi
rubygems.org/gems/tdi
globo.com
Kickstart fedoraproject.org/wiki/Anaconda/Kickstart
Puppet puppetlabs.com/puppet/puppet-open-source
Foreman theforeman.org
Vagrant www.vagrantup.com
Obrigado