Containerizando o ambiente com docker-compose

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

O workshop será dividido nas seguintes etapas:

  1. Apresentação da aplicação

    • familiarização com o código fonte, arquitetura de software, testes
  2. 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
  3. 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
  4. 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
  5. 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
  6. Considerações finais

  7. Q&A

A aplicação

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

Pré-requisitos

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

Pós workshop

Código produzido

Todo código produzido nesse workshop está disponível no branch cheat-sheet.

Lição de casa

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.

Exercícios

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

Expert

Rodrigo Botti