Nesse workshop vamos aprender a utilizar containers para criar dependências de infra-estrutura das nossas aplicações (como bancos de dados, serviços de cache).
Utilizaremos Docker como nossa ferramenta de containerização e utilizaremos o docker-compose para orquestrar o ciclo de vida de nossos containers.
Aprenderemos algumas abordagens para conectar nossa aplicação localmente tanto para executá-la quanto para rodar testes integrados.
No final utilizaremos essas tecnologias também para criação de um pipeline de integração contínua.
Vamos ver que com o uso dessas ferramentas ganharemos:
- Não precisar instalar essas dependências em nosso ambiente local
- Não precisar instalar essas dependências remotamente e disponibilizá-las na rede
- Não precisar compartilhar essas dependências entre colaboradores
- Não precisar se preocupar com o ciclo de vida dessas dependências (considerá-las efêmeras)
O workshop será dividido nas seguintes etapas:
-
Apresentação da aplicação
- familiarização com o código fonte, arquitetura de software, testes
-
Adição de bancos de dados MongoDB
- Como utilizar o docker-compose para "subir" o banco localmente (desenvolvimento local, testes automatizados)
- utilizando rede virtual
- expondo na máquina host
- Como utilizar o docker-compose para "subir" o banco localmente (desenvolvimento local, testes automatizados)
-
Adição de serviço de cache Redis
- Como utilizar o docker-compose para "subir" o serviço de cache localmente (desenvolvimento local, testes automatizados)
- Utilizando rede virtual
- expondo na máquina host
- Como utilizar o docker-compose para "subir" o serviço de cache localmente (desenvolvimento local, testes automatizados)
-
Conectando a aplicação
- Testes
- Desenvolvimento
- Como utilizar o docker-compose para "subir" a aplicação localmente conectando com os recursos
- Expondo na máquina host
-
Criar pipeline de CI com Github Actions
- Com etapa de testes de integração
- importante: o foco não é aprender github actions mas sim como utilizar containers pra facilitar o processo
-
Considerações finais
-
Q&A
A aplicação consiste de uma API REST em Node.JS.
Essa API será um serviço que gerencia posts de texto do tipo tweet
(inspirado no twitter):
- Criação de um tweet que será identificado por um uuid versão 4
- Acrescentar likes nos tweets cadastrados
- Listar os top tweets com mais likes
Disclaimer: O setup não foi testado em sistema operacional Windows então pode ser que não funcione. Recomendo a utilização de alguma distribuição Linux ou Mac.
Para conseguir acompanhar o workshop será necessário ter no ambiente
- Docker e docker-compose
- Git
- Conta no Github
- Última versão de Node.JS (14+)
- recomendo a utilização do NVM
- Preparar sua versão do repositório
- fork desse repositório
- git clone do repositório
- executar no diretório do projeto
# caso tenha optado pelo uso do nvm # (a versão de node vem do arquivo .nvmrc na raíz) nvm install nvm use # instalar as dependências npm install # verificar: # executar testes unitários e de integração # como falta o mongodb e o redis, deve falhar com timeout de conexão npm test # tentar subir a aplicação localmente em modo debug # como falta o mongodb e o redis, deve falhar por erro de conexão npm run start:dev
Todo código produzido nesse workshop está disponível no branch cheat-sheet
.
Durante o workshop, eu "expliquei" (nem sei se pode chamar disso) de forma bem grosseira o que é um container. Recomendo consultar a fonte pra saber de fato o que são e a tecnologia de fato por trás.
Além disso, a parte de networking foi explicada no modo "vamos acreditar que funciona" e foram utilizadas abordagens específicas. Recomendo a leitura da documentação oficial para esse assunto, tanto para entender os detalhes quanto para entender todo o leque de opções desse assunto vasto.
Disclaimer: originalmente o workshop tinha sido feito para que construíssemos features da aplicação ao mesmo tempo que integrassemos com containers. Primeiro implementaríamos as features de criação e adicionar likes e finalmente a de top com mais likes junto com seus respectivos testes. TL;DR: originalmente, produziríamos código de aplicação no workshop também.
Caso você queira mexer um pouco na aplicação, você pode implementar os seguintes exercícios:
1 . Criar testes que estão faltando
1.1 . Unitários para os componentes da funcionalidade adicionar likes
1.2 . De integração para a funcionalidade de adicionar likes
1.3 . De integração para a funcionalidade de top tweets com mais likes
2 . No pipeline de CI, testar com check de cobertura de código
3 . Criar Makefile
para agrupar tarefas utilizando make
3.1 . Task test
: cria infraestrutura + executa testes com check de cobertura + derruba a infraestrutura
3.2 . Task run
: cria infraestrura + inicia a aplicação
3.3 . Modificar o pipeline de CI para utilizar a task test
Rodrigo Botti |