DesenvolvimentoInfraestruturaMelhores PostsSolutions & Design Gallery

Perdão, não achei outra forma de expressar com alguma precisão o que acabei de criar! E é incrível! O título poderia se chamar “o primeiro yo a gente nunca esquece“, mas não expressaria o projeto e suas capacidades, nem as tecnologias e integrações envolvidas.

O que é?

Eu estou em plena reestruturação de um de nossos produtos, embora a última versão fosse NodeJS, o JavaScript estava me cansando por sua fragilidade. Então a demanda era: Desenvolver uma API NodeJS com TypeScript e então começou toda a saga:

  • Debugar JavaScript é legal, mas e seu pudesse debugar o TypeScript?
  • Mas o serviço dependerá de MongoDB, Redis e RabbitMQ, e seu pudesse rodar todas essas dependências em containers Docker?
  • MongoDB é chatinho de configurar com usuário e senha no Docker, como criar um MongoDB, autenticado, sem a necessidade de um script complexo?
  • Mas e se eu pudesse continuar debugando TypeScript, agora nesses containers, e quando quisesse pudesse debugar local também?
  • Mas o build da aplicação node no docker ficará lento, tendo de baixar todos os pacotes npm a todo build, e se eu fizesse um build de imagem só para gerar uma imagem base, com as dependências e outro build, baseado nessa imagem só com aplicação?
  • E se eu pudesse automatizar isso tudo, automatizando e integrando com o VSCode?
  • E se eu pudesse fazer watch, e a cada mudança nem precisar recriar imagem e container, só transpilar o TS e atualizar o file system do container?
  • Muito legal para desenvolvimento, mas e se eu pudesse ter uma alternativa eficiente para publicar, como rodar um simples docker-compose up?
  • Muito bom para meu projeto, mas dá uma dor de cabeça recriar isso, e se eu pudesse criar um gerador yeoman para gerar projetos assim?

Tudo isso acima faz parte do projeto node-api-docker-1st-class-experience (github version / npm version) um gerador yeoman que criei e como o título diz, consiste em (((((NodeJS + TypeScript + Restify) + MongoDB) + Docker) + VSCode ) + Yeoman) para criar serviços com NodeJS no Docker com experiências de debug e muita automação com o VSCode. Ah, Redis, Socket.IO e RabbitMQ são necessidades do meu projeto, não coloquei nesse gerador.

Está na dúvida? Testa aí!

  • Requisitos
    • docker (linux containers com docker for windows ou docker for linux) rodando e configurado (atenção para a configuração settings / shared drives no Docker for Windows)
    • nodejs 8

Crie o seu projeto

  • Crie um diretório novo
  • Abra um prompt de comand/powershell/bash e aponte para esse novo diretório
  • Rode o comando npm install -g yo generator-node-api-docker-1st-class-experience
  • Rode o comando yo node-api-docker-1st-class-experience, preenchendo os campos, são só 4: nome do projeto, descrição, nome do usuário do mongo e sua senha.
  • Ao final, use o mesmo prompt de comand/powershell/bash para rodar o comando code . para abrir o VSCode.

Pronto, projeto criado, é todo seu!

Coloque um breakpoint

  • Dentro do VSCode coloque um breakpoint na linha 21 do arquivo /src/server.ts

Agora você tem 3 opções de debug, escolha qualquer uma delas…

Antes que eu me esqueça, a imagem acima apresenta as task de build (para que fiquem na status bar precisa de um plugin, no final do posto apresento o link dele) e as configurações de debug.

Exemplo 1 – Debug com Docker

Pressione F5, aguarde alguns minutos, quando estiver tudo pronto, o VSCode parará a execução no breakpoint. O debug estará acontecendo no container! Veja o resultado do console.log nele.

NOTA: O primeiro build é muito lento pois:

  • Vai baixar as imagens do node e do mongodb do docker hub (só acontece na primeira vez)
  • Vai realizar 2 builds de imagem, a primeira para a imagem-base e a segunda para a aplicação.
  • Todos os demais build irão gerar apenas a última imagem, leva poucos segundos.

Exemplo 2 – Debug com Docker + Watch

Pressione Ctrl+p em seguinda digite Tasks: Run Task na barra, pressione enter. Uma lista de tasks aparecerá, selecione a opção [docker] stop-and-remove, assim que a task acabar, repita o procedimento e agora opte por [docker] build-and-watch.  Um novo build, dessa vez bem rápido começará. Selecione na dropdown configuration da aba launch Docker + watch debug e pressione F5 para atachar o debug remoto.

Exemplo 3 – Debug local

Por fim, mais simples mas nem por isso sem graça, o debug local, repita o procedimento para acionar a task [docker] stop-and-remove, só para parar seus containers, eles estarão travando a porta 3000, usada no projeto padrão. Após, selecione na dropdown configuration da aba launch a opção Local debug e pressione F5.

Conclusão

Está tudo configurado para você ter uma experiência de alto nível com o desenvolvimento NodeJS. É fácil desenvolver assim, você só precisa criar adicionar suas dependências, e começar a desenvolver sua API. Algo não está ok? Provavelmente o build local (TypeScript + TSLint) irá identificar para você, antes de tentar recriar qualquer container.

As regras que usei no TSLint estão bem restritivas, mas o projeto configura seu VSCode para tentar solucionar pra você com o autofix. Mas você pode reconfigurar as regras como desejar. O único ponto chatinho de ser reconfigurado são as regras, onde você precisa ficar atento, mas só isso.

Rodar as tasks usando Ctrl+p + Tasks: Run Task é muito chato, mas tem um plugin mágico no VSCode que coloca todas as tasks na status bar, vale muito a pena instalá-lo.

Por fim, havia me esquecido, após criado, você pode baixar o projeto e executar docker-compose up para uma publicação de produção.

Pretendo apresentar essa demo em vídeo, por enquanto é só!  E você, o que achou? Já testou?

UPDATE – 26/06/2017

Vídeo no ar!

 

 

UPDATE – 28/06/2017

Vou apresentar essa demo e muitas outras na apresentação Docker Everywhere que farei no MTAC Week, se inscreva!

Outro ponto interessante é que, se o gerador não for interessante para você, as diversas integrações com VSCode, Docker, Node, TypeScript, TSLint talvez possam ser. A propósito, o código TypeScript foi uma simplificação do projeto que estou trabalhando. Muita coisa não é assim, mas para reduzir e eliminar alguns frameworks, acabou ficando mais fácil juntar em algumas classes, como é o acesso a dados feito no controller.

 

UPDATE – 05/10/2017

Qualquer dúvida, favor entrar em contato diretamente no telegram. Os links estão no cabeçalho e na home!

Comente, compartilhe, curta!

Gostou? Então aproveite para curtir, compartilhar e enviar comentários, dúvidas ou sugestões.

Conheça o Grupo Arquitetura de Softwate | .NET: Facebook e Telegram
Você pode se manter atualizado(a) pelos canais: Site, Youtube, Facebook, Twitter, Telegram, Linkedin e pode entrar em contato por TelegramEmail