As 7 maiores lições que aprendi construindo um bot do Twitter

Às vezes você tem que ser esperto como uma raposa e ser fofo não faz mal também … (? por Jonatan Pie )

Hoje, vou compartilhar com vocês as lições mais importantes que aprendi ao criar o Release Butler – um bot do Twitter que twitta changelogs de estilo elegante de estruturas de frontend e bibliotecas populares como Angular, React, Vue ou Webpack…

Exemplo de um tweet feito por Release Butler

Release Butler foi muito bem recebido pela comunidade com muito envolvimento e mais de 600 seguidores durante o primeiro mês após o lançamento, no início de abril de 2018.

Release Butler teve uma boa tracção durante o primeiro mês após o seu lançamento!

As lições (tldr)

  1. ? Não tente economizar tempo pulando Texto digitalizado
  2. ? Async / await é ótimo até que não seja e o tratamento de exceção pode ser difícil
  3. ? Logging é a chave
  4. ? Ir baunilha no frontend sem um quadro pode ser refrescante
  5. ? Abrace o CLI e construa suas próprias ferramentas
  6. Now "Now" é uma ótima plataforma para construir bots – node vs Docker
  7. ? Nem todas as APIs foram criadas iguais – GitHub vs Twitter

?? BÔNUS : Segurança básica

O contexto

Atualmente estou viajando ao redor do mundo pelo nono mês. Acredite ou não, a aventura pode se tornar repetitiva também … Você pode facilmente encontrar-se ansiando por "algo" para fazer …

Estou muito feliz por fazer parte da maravilhosa indústria de tecnologia e adoro a idéia de retribuir à comunidade tentando criar algo útil. Ultimamente, tenho me inspirado muito no incrível projeto carbon.now.sh , que permite criar e compartilhar belos trechos de código.

Mordomo de liberação vive em releasebutler.now.sh

Isso levou a uma ideia de criar um serviço similar, mas para os changelogs. O conceito mais tarde cristalizou no que hoje é chamado de Release Butler.

Além de ser um bot do Twitter , ele também vem com um site que permite baixar o changelog de qualquer biblioteca hospedada no GitHub que use as versões do GitHub ou o arquivo Changelog.md.

Siga o Release Butler , um bot do Twitter que ajuda você a se manter atualizado com lançamentos de bibliotecas de frontend populares…

? 1. Não tente economizar tempo pulando Texto digitalizado

As origens de Release Butler podem ser descritas mais como uma experimentação desorganizada do que um projeto bem pensado com arquitetura detalhada, marcos e o que não…

No começo, um único pequeno momento de preguiça resultou no pulo de Typescript, que agora tem grandes consequências …

Deixe-me dizer, use o Typescript, vale a pena!

O esforço para começar a usar o Typescript em um projeto de nó é realmente baixo. Tudo o que precisamos fazer é executar o npm i -S typescript ts-node e depois executar nosso aplicativo usando o ts-node . em vez disso node . . Nem precisamos digitar todas as variáveis ??ou funções desde o início. Os tipos podem ser adicionados gradualmente, sempre que uma das interfaces se tornar mais estável.

Embora parte da dor possa ser evitada por uma documentação de arquitetura mais detalhada antes do início do projeto, NÃO é razoável esperar que o projeto seja projetado perfeitamente desde o início.

Os requisitos tendem a evoluir e muitas vezes precisamos reorganizar nossa base de código. Oportunidades de reutilização de código e abstrações se tornam mais aparentes à medida que adicionamos mais serviços e componentes. A refatoração pode se tornar uma grande dor, mesmo em um projeto pequeno como o Release Butler.

Toda vez que temos que mudar a interface de qualquer um dos nossos serviços sem um sistema de tipo forte, corremos o risco de quebrar alguma parte distante de nossa aplicação.

Mas e os testes? Isso não seria uma preocupação se tivéssemos uma cobertura de teste adequada, certo?

A principal desvantagem dos testes para resolver esse tipo de problema é que temos que escrevê-los em primeiro lugar …

Eu sou um grande fã de testes de unidade e integração de escrita para a lógica de negócios

Por outro lado, ver código de lotes que verifica a presença ou o typeof de argumentos de uma função e testes de unidade correspondentes é um grande cheiro de código… ?

O typescript pode reduzir drasticamente a quantidade de código necessária para garantir a correção básica do aplicativo. Além disso, a maioria dos editores populares vem com recursos substanciais de refatoração quando usados ??em conjunto com uma linguagem digitada como o Typescript.

? 2. Async / await é ótimo até que não seja & manipulação de exceção pode ser difícil

Async / await é uma nova adição à linguagem JavaScript. Eu não usei isso antes e trabalhei diretamente com as promessas…

Exemplo simplificado de uso do async / await no código base do Release Butler

A principal premissa do async / await é fazer com que o código assíncrono pareça exatamente como um antigo material de sincronização. Cada linha de código é executada de cima para baixo enquanto espera (aguarda) pelo resultado da operação assíncrona quando necessário.

Também é ótimo para orquestração mais complexa de vários serviços assíncronos, resultando em código muito mais “plano” em comparação com retornos de chamada ou promessas.

O maior desafio de usar o async / await vem com a implementação do tratamento de exceções

Anexar o .catch(err => { /* handle error /*}) no final da cadeia de promessas local é muito mais legível do que agrupar partes diferentes e frequentemente aninhadas da execução em blocos try / catch .

Conforme o projeto cresce, o número de funções assíncronas se torna maior e a orquestração é mais complexa. Não é mais suficiente apenas envolver cada execução assíncrona com um bloco try / catch e manipular todas as exceções localmente.

Muita consideração deve ser feita para descobrir como lidar com comportamento inesperado em relação à funcionalidade global desejável. Nós tendemos a acabar com os seguintes casos:

  1. exceção deve ser tratada no nível atual e resultar em um estado válido
  2. exceção deve ser tratada parcialmente no nível atual (por exemplo, log de erro) e re-lançada para manipulação na pilha de execução
  3. exceção não deve ser tratado em todos no nível atual e será capturado por algumas das funções pai

Isso pode ficar complicado. A funcionalidade assíncrona oferecida por um dos serviços pode ser consumida por diferentes partes do aplicativo com expectativas muito diferentes sobre o que acontecerá quando as coisas derem errado…

? 3. O registro é a chave

No desenvolvimento de frontend, estamos acostumados a obter feedback visual imediato para cada mudança de código que acabamos de criar. Por outro lado, o processo de backend de longa execução não fornece nenhuma informação útil pronta para uso. Por padrão, sabemos apenas se ele é executado, parou ou caiu…

O registro é a solução para obter informações úteis sobre o estado atual do nosso sistema de back-end e a melhor coisa a fazer é começar a registrar tudo

Incommando solicitação de API? Consulta de banco de dados ou execução de script? Não tem problema, os troncos nos cobriram …

Mas como em tudo, é importante encontrar um bom equilíbrio – muito e vamos nos afogar no barulho, muito pouco e estamos ficando cegos na escuridão da noite…

A iteração sobre o que e como registrar é um processo contínuo …

Os logs atuais de uma única execução do Release Butler fornecem uma rápida visão geral dos projetos lançados e suas versões

Os logs atuais são muito concisos. Muitas informações foram removidas durante a iteração…

  • timestamp – agora a plataforma fornece seu próprio timestamp
  • No new version for project: <project-name> – como se viu, é muito mais interessante saber o que aconteceu em vez do que não aconteceu
  • nomes de projetos rastreados – cinco projetos rastreados podem se encaixar em uma linha, mas o número logo aumentou para mais de 20, isso é um monte de repetição inútil
  • lista de todas as versões lançadas – é bom saber o que foi lançado desde a última implantação, mas pode ficar problemático se o bot for executado por meses e a lista crescer para centenas de versões, o compromisso era registrar o número de lançamentos e a última versão
  • várias informações relacionadas à implementação – detalhes de cada solicitação ou consulta de banco de dados podem ser úteis, mas adicionam muito ruído durante a operação normal, por isso é melhor usar o nível de log de debug que precisa ser ativado manualmente quando necessário

? 4. Ir baunilha no frontend sem qualquer quadro pode ser refrescante

A inspiração para o release Butler veio parcialmente de um grande projeto chamado carbon.now.sh . É o site que permite a criação de trechos de código de aparência bonita. Release Butler se esforça para permitir que você obtenha e compartilhe lindamente changelogs olhando em vez disso.

Release Butler é um bot do twitter, mas vem também com um website que permite que você obtenha um changelog de qualquer biblioteca hospedada no GitHub que use as versões do GitHub ou o arquivo Changelog.md

A página em si pode ser descrita como um site de marketing com um único formulário para recuperar changelogs. Para um caso de uso como este, usar uma estrutura completa seria um exagero desnecessário.

Siga o Release Butler , um bot do Twitter que ajuda você a se manter atualizado com lançamentos de bibliotecas de frontend populares…

0

Atualmente, há apenas um único arquivo app.js de 5kB . Não npm, sem scripts de construção, sem minification, não jQuery apenas algumas linhas de JavaScript honesto vanilla. Refrescante!

? 5. Abrace o CLI e construa suas próprias ferramentas

Em sua essência, um bot é apenas um nome sofisticado para um script que executa repetidamente a funcionalidade em um loop ou em reação a alguns eventos.

Por exemplo, o Release Butler verifica se houve uma nova versão de um dos projetos rastreados do GitHub a cada dez minutos.

Infelizmente, a natureza baseada na hora da execução não é muito prática para testar as coisas durante o desenvolvimento. É claro que podemos reduzir o atraso na execução, mas isso não ajuda muito. Imagine que ainda temos que esperar pelo menos 30 segundos para ver o resultado de uma única mudança de estilo.

Siga o Release Butler , um bot do Twitter que ajuda você a se manter atualizado com lançamentos de bibliotecas de frontend populares…

1

Da mesma forma, a interação com muitas APIs e ambientes de terceiros gera problemas por conta própria. Levaria muito tempo para zombar de todos esses ambientes apenas para fins de desenvolvimento. É fácil encontrar-se desenvolvendo contra o "prod" e isso é ok?

O desenvolvimento inicial e muita experimentação significa que você precisará reverter dados e outros efeitos colaterais de hora em hora, o que pode não ser prático usando as ferramentas fornecidas por essas plataformas.

Siga o Release Butler , um bot do Twitter que ajuda você a se manter atualizado com lançamentos de bibliotecas de frontend populares…

2

Agora, exclua o restante dos 50 tweets de teste gerados ?

Como desenvolvedores da Web, estamos naturalmente inclinados a pensar em criar um aplicativo de administração especializado que expõe a funcionalidade do bot com uma interface do usuário sofisticada.

Esta é uma armadilha de produtividade muito comum que pode facilmente consumir quantidades loucas de tempo. Estamos muito melhor focados no desenvolvimento da funcionalidade principal. Deve haver uma maneira melhor …

Siga o Release Butler , um bot do Twitter que ajuda você a se manter atualizado com lançamentos de bibliotecas de frontend populares…

3

Adicionando interface de linha de comando para o nosso aplicativo requer apenas um esforço menor e oferece resultados maciços!

Existem muitas bibliotecas diferentes que podem nos ajudar a construir o CLI e um dos meus favoritos é yargs

Siga o Release Butler , um bot do Twitter que ajuda você a se manter atualizado com lançamentos de bibliotecas de frontend populares…

4

Exemplo de uma ferramenta CLI customizada para ajudar no desenvolvimento do Release Butler, removendo dados de ambientes de terceiros (“node”, que significa executar a pasta atual como um aplicativo de nó, ele irá procurar em package.json e executar o arquivo referenciado pelo “main” Propriedade)

A implementação é direta. Basta usar o yargs DLS para especificar comandos e parâmetros suportados…

Yargs usa uma expressiva DSL expressiva para definir comandos suportados e flags de configuração

?? 6.? “Now” é uma ótima plataforma para construir bots

Em 2018, estamos acostumados a implantar nosso código diretamente na nuvem com alguns toques de tecla. Nenhum provisionamento ou configuração de servidor demorado é necessário. Há uma abundância de plataformas como provedores de serviços (PaaS) com um nível gratuito que nos ajuda a construir nossos protótipos sem nenhum custo financeiro.

Infelizmente, o problema com muitas ofertas de "nível gratuito" é que geralmente há um limite no tempo de atividade das instâncias gratuitas. Isso é problemático para o desenvolvimento de um bot. Os bots devem estar funcionando o tempo todo.

Siga o Release Butler , um bot do Twitter que ajuda você a se manter atualizado com lançamentos de bibliotecas de frontend populares…

5

Siga o Release Butler , um bot do Twitter que ajuda você a se manter atualizado com lançamentos de bibliotecas de frontend populares…

6

Agora suporta a implantação de sites estáticos, aplicativos de nó e contêineres do Docker. A implantação do nó é uma escolha natural para começar e funciona muito bem para a maioria dos casos de uso padrão.

Release Butler precisa ser capaz de fazer um screenshot personalizado de um changelog de projeto no GitHub. Isso é feito com a ajuda do manipulador de marionetes, que vem com o cromo sem cabeça quando instalado a partir do npm…

Como se descobriu, o manipulador de marionetes funciona muito bem na máquina de desenvolvimento, mas é dividido quando implementado no Zeit devido à falta de dependências no nível do sistema operacional.

Siga o Release Butler , um bot do Twitter que ajuda você a se manter atualizado com lançamentos de bibliotecas de frontend populares…

7

Siga o Release Butler , um bot do Twitter que ajuda você a se manter atualizado com lançamentos de bibliotecas de frontend populares…

8

A maior desvantagem do uso do docker é que o processo de implantação se tornou dolorosamente longo . A instalação de todas as dependências do sistema operacional ausentes durante a implantação é muito demorada.

Felizmente, é possível pré-construir nossas próprias imagens de docker e armazená-las no Docker Hub (semelhante ao GitHub). Isso reduz drasticamente os tempos de implantação quase até os níveis de implantação de nó simples.

Siga o Release Butler , um bot do Twitter que ajuda você a se manter atualizado com lançamentos de bibliotecas de frontend populares…

9

? 7. Nem todas as APIs foram criadas iguais – GitHub vs Twitter

A construção de um bot raramente acontece isoladamente. O bot é geralmente usado como um substituto para a interação real do usuário na plataforma de destino. Plataformas geralmente fornecem interface de programação de aplicativos (API) para expor algumas de suas funcionalidades aos desenvolvedores.

Release Butler está atualmente interagindo com duas plataformas – Twitter e GitHub.

API do GitHub

Lançamento Butler precisa de uma maneira de determinar se houve um novo relese de uma biblioteca rastreada. Ele precisa recuperar as versões mais recentes liberadas do repositório do GitHub e compará-las às versões armazenadas localmente de seu banco de dados.

Consumir a API do GitHub é direto. Readonly endpoints podem ser consumidos anonimamente, mas há um limite para a quantidade de solicitações que podem ser feitas por hora a partir de um único endereço IP.

Podemos consertar isso gerando token de acesso pessoal que será enviado junto com cada solicitação. Cada usuário do GitHub pode gerar tokens de acesso pessoal navegando para settings > developer settings > personal access tokens e usando a funcionalidade de geração de token.

As próprias solicitações podem ser executadas usando-se fetch que está disponível nativamente em todos os navegadores modernos, mas no nó nós temos que instalá-lo usando npm i -S node-fetch . Ele tem uma interface baseada em API e Promise simples, que funciona bem com a sintaxe async / await.

Apenas um TOKEN é tudo o que precisamos para começar a usar a API do GitHub

API do Twitter

Sendo um bot do Twitter, o Release Butler precisa ser capaz de twittar sobre novas versões de bibliotecas rastreadas.

Deixe-me dizer, use o Typescript, vale a pena!

0

As complicações começaram imediatamente após a criação de uma nova conta no Twitter para o Release Butler.

Deixe-me dizer, use o Typescript, vale a pena!

1

Em vez disso, o que precisamos fazer é criar um aplicativo do Twitter associado à conta. Opa, isso não funciona se você não forneceu e confirmou o número real do telefone primeiro … Sério ?!

Deixe-me dizer, use o Typescript, vale a pena!

2

A documentação menciona algumas bibliotecas de clientes do Twitter prontas no NPM, mas infelizmente elas são bem datadas, baseadas em retorno de chamada e não suportam todos os endpoints fora da caixa…

Cavando ao redor descoberto é tudo sobre o OAuth. Speed-learning OAuth e um ingênuo tentativa de reimplementá-lo acabaram em fracasso, por isso voltou ao npm em busca de um pacote adequado. Felizmente este foi um esforço mais frutífero e npm i -S oauth funciona muito bem ..

Exemplo simplificado de código necessário para consumir a API do Twitter

Deixe-me dizer, use o Typescript, vale a pena!

3

A biblioteca ouath é baseada em callback, então é empacotada e promisificada na implementação real do Release Butler para funcionar bem com a sintaxe async / await.

?? BÔNUS: Segurança básica

Espero que seja desnecessário dizer que nunca devemos codificar e comprometer nossos tokens e segredos no sistema de controle de versão como o git. O aplicativo deve recuperar toda a configuração necessária de seu ambiente.

Agora suporta o arquivo now.json onde podemos especificar variáveis ??de ambiente públicas e secretas. Segredos não são especificados diretamente, mas usando um espaço reservado.

Para o desenvolvimento local, podemos definir valores de espaço reservado no now-secrets.json que também adicionamos ao .gitignore para que possamos ter certeza de que nunca iremos enviar este arquivo para o nosso repositório.

Para o ambiente prod, podemos definir valores de placeholder usando now secret add <key> <value> (confira docs oficiais para mais detalhes).

Exemplo de um now.json com variáveis ??de ambiente público e secreto. Os segredos contêm espaços reservados começando com o caractere '@'.

Por hoje é isso!

Espero que o Release Butler possa ajudá-lo a manter-se atualizado com os lançamentos frontend e que você irá tentar segui-lo no Twitter ! Por favor, apoie este artigo com o seu ??? para ajudá-lo a se espalhar para um público mais amplo ?.

Deixe-me dizer, use o Typescript, vale a pena!

4

Obviamente, o futuro brilhante (? por Mohamed Thasneem )

Se você chegou até aqui e sente que quer aprender algo mais sobre tópicos interessantes, fique à vontade para experimentar alguns dos seguintes artigos ?

Prático RxJS In The Wild ? – Solicitações com concatMap () vs mergeMap () vs forkJoin () ?
O gerenciamento de várias solicitações com o RxJS pode ser feito de várias maneiras. Cada um com seus prós e contras. Saiba quando usar… blog.angularindepth.com
Como acelerar a integração contínua de integração com o novo NPM CI E o package-lock.json
Embora muito controverso, o novo npm release 5.7.0 traz algumas características surpreendentes que terão um impacto positivo… medium.com
Como manter-se atualizado com versões de frameworks populares
Apresentando o Release Butler – Um Bot do Twitter que ajuda você a se manter atualizado com versões do Frontend Popular… medium.com