Skip to content

Instantly share code, notes, and snippets.

@gabicavalcante
Last active February 24, 2021 21:59
Show Gist options
  • Save gabicavalcante/13bab26e2b7f5cb085f392e2dba5c994 to your computer and use it in GitHub Desktop.
Save gabicavalcante/13bab26e2b7f5cb085f392e2dba5c994 to your computer and use it in GitHub Desktop.

Desafio

Hello Hello! Bem vind@ ao nosso desafio. Nosso objetivo aqui é entender melhor suas habilidade, como você estrutura seus pensamento, ver como você se organiza em um projeto que necessita ser criado do 0, e ter insumo para um segundo papo mais aprofundado sobre decisões técnicas (caso você queira :)).

Antes de começar

  • Para resolver esse desafio você pode usar qualquer linguagem/framework que desejar.
  • Crie um repositório público no seu GitHub.
  • Envie como resposta do email que enviamos o link para seu repositório.
  • Fique à vontade para tirar qualquer dúvida, não exite em questionar algo que não tenha ficado bem explicado.
  • Fique tranquila, respire, já passamos por essa etapa e entendemos bem como é. Boa sorte! :)

Setup do projeto

  • Subir local ou Docker* (valorizamos uma boa estrutura de docker feita por você)
  • Pense que seu projeto deve ser fácil de rodar por alguém que acabou de pegar ele.

O desafio

Nós temos aqui no time vários desafios envolvendo integrações entre ferramentas e automação de processos. A ideia do que queremos de você é entender quais soluções você daria pra um cenário similar ao que enfrentamos no nosso dia a dia. Não se preocupe em trazer a melhor solução, ou em achar a solução "correta". A ideia é conversamos sobre o que você sabe e o que poderia ser usado pra resolver o problema.

Vamos descrever algumas tasks que podem te guiar na construção de possíveis soluções. E para esse problema, podemos ter vááárias soluções possíveis ;)

No nosso cenário temos várias pipelines que diarimante fazem dezenas de deploys para vários times. Essas pipelines geram releases (um pacote entregável da app). Quando fazemos uma mudança no código, essa mudança é um trigger para a pipeline, que gera uma release com o código alterado e pode ou não aplicar essa release em produção. Esses deploys precisam de algum tipo de processamento e validação para de fato acontecer. Propomos que você crie uma API que seja usada para validar deploys. A ideia é que a "pipeline" antes de aplicar a release em produção, ela consulte periodicamente sua API, e quando a mudança estiver aprovada, o deploy aconteça.

  1. Quando uma release é criada, a pipeline faz uma chamada na sua API passando algumas informações principais relcionadas a release para que você processe e valide. ⚠️ é importante que a resposta aqui não demore, por causa do timeout da pipeline 🤔
  2. Caso os dados dessa release não estejam no seu banco, você precisa processá-los.
    1. No processamento, você precisa fazer as seguintes operações:
      1. Recupere os aprovadores que devem aprovar essa release.
        • Utilize o mock para ajudar nos seus testes: https://run.mocky.io/v3/857ec66e-d39b-4c6a-85c8-9573cbd42ad7
        • Para cada aprovador, crie um token único e envie para ele um email com esse token, a url de aprovação, e as informações da release. Esse token pode ser usado tanto para autenticar quem é o aprovador, como pra fazer o encode dos dados da release que eles está aprovado.
  3. Caso os dados dessa release estejam no seu banco, basta você retorna essa informação.
  4. Quando o aprovador receber o email, ele pode aprovar o ticket usando a url de aprovação.
    1. Essa aprovação deve ser salva no banco

Payload

  • POST /release
{
    "ReleaseName": "Desafio-CD",
    "ReleaseId": "386",
    "TeamProject": "Devx",
}
  • POST /approval?token={token}

O que gostaríamos de ver e conversar sobre ❤️

  • Como você testa seu código.
  • Como você documenta suas aplicações.
  • Código limpo e organizado (nomenclatura, etc)
  • Conhecimento de padrões (design patterns, SOLID)
  • Como você toma decisões de projeto.
  • Quão fácil é entender o seu código.
  • Quão fácil é rodar o seu código.
  • Modelagem de Dados
  • Manutenibilidade do Código
  • Tratamento de erros
  • Arquitetura (estruturar o pensamento antes de escrever)
  • Escalabilidade: o quão fácil é escalar sua solução pra que ela suporte uma maior quantidade de pipelines integradas.

Bonus Points

Ter o setup da app usando docker. Ter a aplicação funcionando em algum lugar (Heroku, por exemplo). Ter um processo automatizado de deploy (utilizando TravisCI, CircleCI). Ter testes rodando num processo de integração contínua.

O que NÃO será avaliado ⚠️

  • Fluxo de autenticação para endpoints relacionados a release
  • Frontend (só avaliaremos a API)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment