Pular para o conteúdo principal

Desenvolvimento de software com Devin: Segurança, implementação e manutenção (Parte 4)

Saiba como usar o Devin para adicionar autenticação de usuário real com o NextAuth, monitorar erros com o Sentry e implantar o front-end no Vercel com URLs de visualização.
Atualizado 26 de jun. de 2025  · 12 min lido

Bem-vindo de volta! Estamos quase lá: O Slack está tocando, o Jira tem tíquetes, os testes são verdes e nossa CI bloqueia todos os PRs desleixados. A parte quatro é o esforço final, em que transformaremos o playground do fp-ts em algo que, em teoria, poderia ser indicado ao público.

Você pode acessar todos os tutoriais da série Devin aqui:

  1. Configuração e primeira solicitação pull (parte 1)
  2. Enviando uma fatia vertical com Devin (Parte 2)
  3. Integrações, testes e CI/CD (Parte 3) 
  4. Segurança, implementação e manutenção (Parte 4)

Aqui está o plano para este quarto tutorial:

  • Autorização: Não há mais UUIDs anônimos; vamos incluir credenciais NextAuth, cookies JWT e um GqlAuthGuard para que o progresso seja vinculado a usuários reais.
  • Olhos na produção: Uma linha de código do Sentry no aplicativo Web, uma na API do Nest e todas as exceções aparecem no painel.
  • Ativação por botão de pressão: O front-end é ativado no Vercel com URLs de visualização em cada PR. (Por enquanto, a API permanecerá local, mas vamos falsificar a produção com o Docker).

Também refletiremos sobre essa programação em pares com Devin e veremos onde ela se destaca e onde um ser humano ainda precisa arrumar as pontas soltas antes que o mundo veja o repositório. Você está pronto para a última etapa?

De UUID anônimo a usuários reais

O que pedi a Devin para fazer

Resumindo, pedi a Devin que eliminasse o fluxo de UUID anônimo e me fornecesse uma pilha de autenticação real:

  • Provedor de credenciais NextAuth v6 em apps/web
  • NestJS AuthModule com hashing Argon2 e cookies JWT
  • Migração do Prisma que adiciona uma tabela User e altera Progress.sessionIduserId (não nulo)
  • Copie todas as linhas de progresso UUID existentes para um usuário de espaço reservado para que os alunos mantenham seus emblemas
  • Não troque o Postgres pelo SQLite

O que você recebeu (em sua maioria, bom)

Aqui está um resumo dos resultados:

Camada

Produção de Devin

Banco de dados

Eliminei a tabela Session; adicionei um modelo User com email, hash, campos de sequência e carimbos de data/hora. O script de migração preencheu novamente cada linha antiga de sessionId em um pseudousuário chamado legacy-@anon.local.

Backend

AuthModuleVocê pode acessar o site AuthService, o GraphQL AuthResolver, o JwtStrategy e o GqlAuthGuard. Tudo Nest-idiomático, 100% digitado.

Front-end

AuthProvider Contexto React, LoginForm, RegisterForm, um modal que aparece em rotas protegidas e um botão de logout no cabeçalho do painel.

Segurança

Argon2 (12 rodadas), validação de DTO via class-validator, JWTs armazenados em localStorage, proteções em cada resolvedor de progresso.

Testes

Teste de unidade para AuthService.register/login e um teste de mutação e2e que afirma que o protetor rejeita tokens ausentes. (Solicitou uma segunda vez que você adicionasse os testes)

Outra migração para o SQLite

Adivinhe o que eu vi aparecer novamente na pequena caixa de pensamento de Devin.

Migração bem-sucedida do PostgreSQL para o SQLite para desenvolvimento local 🥳

Exatamente o que eu havia dito a ele paranão fazer. O esquema do Prisma foi reescrito para o SQLite, e as cadeias de conexão e os tipos foram alterados (de TIMESTAMP para DATETIME). Eu o peguei no meio da sessão:

  1. Pausou a sessão.
  2. git checkout main apps/api/prisma/schema.prisma (restaurar o esquema do Postgres).
  3. Excluiu o novo arquivo dev.db.
  4. npm run prisma:migrate --workspace=apps/api para reaplicar as migrações do Postgres.
  5. Retomou Devin; ele detectou a reversão e continuou sem reclamar.

Danos: 0,8 ACU e cerca de dez minutos.

Lista de verificação de mudança radical para colegas de equipe

Eu realmente aprecio as instruções que Devin coloca nos PRs. Aqui ele nos disse para fazê-lo:

# 1  Install new deps
npm install --workspaces

# 2  Run the Postgres migration
npm run prisma:migrate --workspace=apps/api

# 3  Restart everything
npm run dev:api   &   npm run dev:web

Visão geral da arquitetura

No wiki, encontrei este diagrama útil do nosso novo sistema de autenticação:

Diagrama de Devin para nosso novo sistema de autenticação

Com usuários reais instalados e o banco de dados firmemente de volta ao Postgres, estamos finalmente prontos para acompanhar o progresso genuíno do aluno, enviar compilações de visualização para o Vercel e detectar erros de tempo de execução com o Sentry.

Com os logins seguros implementados, o próximo marco óbvio era mostrar ao mundo algo clicável. Decidimos implantar apenas o front-end Next.js por enquanto. A API e o Postgres permanecerão em meu computador local até escolhermos um host que caiba no orçamento.

Conexão manual de conta (0 ACUs)

Ainda não é possível conectar o Devin à minha conta pessoal da Vercel por meio de integrações nativas. Então, fiz isso manualmente, por meio do painel da Vercel:

  1. Fiz login no Vercel e cliquei em "New Project → Import Git Repository".
  2. Selecione o repositório fp-ts-exercises, deixe o comando de compilação como npm run build --workspace apps/web e clique em Deploy.
  3. Você copiou os arquivos VERCEL_PROJECT_ID e VERCEL_TOKEN resultantes para o GitHub Secrets.

Permita que Devin atualize o fluxo de trabalho de CI (0.4 ACU)

Seguindo minha orientação, Devin adicionou um único trabalho à parte inferior do fluxo de trabalho existente e uma pequena etapa do shell que enrola a URL gerada para o Slack:

- name: Deploy to Vercel
  if: ${{ success() && github.event_name == 'pull_request' }}
  run: npx vercel deploy --prod --token ${{ secrets.VERCEL_TOKEN }}
  env:
    VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
    VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}

Resultado

Enviar uma ramificação → CI green → Slack ping:

✅ Preview ready: https://fp-ts-exercises-git-my-branch.vercel.app

Ao abrir o link, você verá nosso playground, o fluxo de autenticação completo e o painel do aluno. Ainda não é necessário nenhum ajuste de ambiente no final da Vercel, porque o front-end conversa com minha API local em http://localhost:4000.

Uma olhada mais de perto no sistema de segredos de Devin

Antes da integração com o Sentry, dei uma olhada no sistema de segredos do Devin para descobrir se deveria usá-lo. O Devin oferece um cofre "Secrets" integrado para que você possa fornecer ao agente chaves de API, URLs de banco de dados ou tokens OAuth sem verificá-los no Git e sem expô-los no bate-papo. Pense nisso como um equivalente leve aos segredos do GitHub Actions ou às variáveis de ambiente do Vercel, mas com escopo para os próprios espaços de trabalho em nuvem do Devin.

Recurso

Como funciona

Notas

Escopo

Os segredos abrangem três escopos: organização, repositório e sessão. 

Você pode tornar os segredos disponíveis no nível da organização, em todas as suas sessões. 

Se quiser adicionar segredos para um único repositório, você poderá especificá-los ao configurar o repositório.Se quiser que os segredos sejam específicos da sessão, você poderá fornecê-los nas configurações da sessão. 

Criptografia

Armazenado no lado do servidor com AES-256 e TLS 1.3+ enquanto estiver em trânsito

Todos os dados do cliente são criptografados com uma chave KMS (Key Management Service) personalizada, gerenciada pela AWS.

Sem custo de ACU

Adicionar, editar ou excluir um segredo é uma ação do plano de controle: 0 ACUs. Somente as tarefas que usam o segredo incorrem em créditos de computação.

Bom lugar para guardar fichas de longa duração.

Acesso aos prompts internos

Use $. no prompt ou em um comando. Devin resolve o problema antes de executar o shell.

Exemplo: DATABASE_URL=$.POSTGRES_URL

Limites de tamanho

4 KB por chave, 100 chaves por equipe no nível principal.

O suficiente para certificados PEM ou chaves privadas.

Adicionar um segredo

Aqui estão as etapas que você precisa seguir para adicionar um segredo:

  1. Aberto Equipe → Segredos no painel de controle do Devin.
  2. Clique em "Adicionar segredo" e digite um nome (SENTRY_DSN_WEB ) e seu valor.
  3. Devin confirma o armazenamento; a chave agora está disponível em $.SENTRY_DSN_WEB.

armazenar um novo segredo no devin

Usando um segredo em uma tarefa

Tarefa: atualizar a API Sentry init; definir DSN para $SECRET.SENTRY_DSN_API

O Devin substitui o valor quando você escreve main.ts. Na guia shell, você verá o DSN literal, mas o registro de bate-papo o oculta.

Prós e contras

Pros:

  • Não há risco de vazamento de chaves em PRs ou registros de lapso de tempo.
  • Os segredos com escopo de organização funcionam em todas as sessões: um upload, muitos usos.
  • Custo zero de crédito para armazenar ou buscar.

Contras:

  • As chaves não estão disponíveis localmente, a menos que você as copie para .env. Os testes realizados fora do Devin precisam de configuração manual.
  • Sem escopo por ambiente (por exemplo, "somente em produção"). Todas as sessões recebem todos os segredos.

Quando usá-lo

Acho mais fácil usar o cofre do Devin quando o próprio Devin precisa da chave (por exemplo, enviando para o Vercel, acessando um registro privado ou conectando o Sentry durante a compilação). Eu continuaria usando .env / GitHub Actions secrets para tudo o que também é executado em seu shell de desenvolvimento local ou executores de CI.

Integração do Devin com o Sentry

Aqui está o prompt que usei: Adicione o Sentry aos dois aplicativos para que todas as exceções apareçam no meu painel. Use variáveis de ambiente em .env. Nenhum outro comportamento muda".

Trabalho de Devin (0,6 ACU, uma sessão)

Aqui está um resumo do resultado:

Pilha

Arquivos tocados

Código-chave

Next.js (Web)

apps/web/sentry.client.config.tsx apps/web/sentry.server.config.ts e uma importação em app/layout.tsx

ts import * as Sentry from '@sentry/nextjs'; Sentry.init({ dsn: process.env.SENTRY_DSN_WEB, tracesSampleRate: 1.0 });

NestJS (API)

apps/api/src/sentry.ts e duas linhas em main.ts

ts import * as Sentry from '@sentry/node'; Sentry.init({ dsn: process.env.SENTRY_DSN_API }); app.useGlobalFilters(new Sentry.GqlExceptionFilter());

Andaime de Env

Adicionados marcadores de posição a .env.example

SENTRY_DSN_WEB=   SENTRY_DSN_API=

Testes

Adicionado um Jest spy para afirmar que Sentry.captureException é chamado em um erro forçado.

 

Minhas etapas manuais

Aqui estão as etapas que segui:

  1. Copiei DSNs do meu projeto Sentry para .env.
  2. Reiniciei os dois servidores de desenvolvimento.
  3. Acesse http://localhost:4000/graphql com uma consulta deliberadamente ruim para verificar se funcionou. Um problema apareceu no Sentry em segundos.

Por que pulei o recurso de segredos de Devin

É por isso que eu pulei o recurso de segredos do Devin:

  • Modelo mental mais simples: o mesmo arquivo .env em todos os lugares.
  • É mais fácil executar compilações de visualização no Vercel (essas variáveis de ambiente já estão definidas lá).
  • Não há queima de ACU para operações de armazenamento secreto.

Reflexões: Onde o Devin brilha e onde ele tropeça

Há quatro partes do tutorial, esse repositório era uma pilha empoeirada de exercícios de fp-ts. Agora, ele tem:

  • Base de código modernizada: Dependências mais recentes, configuração estrita do TS, regras do lint e do Prettier (Parte 1).
  • Playground baseado em navegador: Next.js 14 + editor Sandpack com feedback Vitest ao vivo (Parte 2).
  • NestJS + backend do Postgres: API GraphQL, migrações Prisma, anônimo → JWT, acompanhamento do progresso (Partes 2 e 4).
  • Pipeline com luz verde: Fluxo de trabalho de CI que faz a ligação, verifica a digitação, executa o Jest e o Playwright e bloqueia cada PR com falha (Parte 3).
  • Integrações de equipe: Pings de status do Slack, análise de rótulos do Jira e URLs de visualização em todas as ramificações (Parte 3).
  • Observabilidade da produção: O Sentry foi conectado à Web e à API, capturando todas as exceções (Parte 4).
  • A pré-visualização é implementada em: O Vercel cria uma URL compartilhável para cada pull request (Parte 4).

Gastamos cerca de ≈ 70 ACUs no total (~$157 no plano Core) e cerca de dois dias úteis de revisão prática.

O que Devin faz assustadoramente bem

É aqui que eu acho que Devin é muito bom:

Área

Por que você me impressionou

Infraestrutura padrão

Scaffolds AuthModule, Dockerfiles, fluxos de trabalho YAML: gerados em minutos, sem bugs.

Código de estrutura idiomática

Os decoradores do NestJS, a configuração do NextAuth e as migrações do Prisma corresponderam aos documentos oficiais.

Andaime de teste

Os pacotes Unit e Playwright são compilados e executados fora do portão - não faltam stubs de casos extremos.

Onde um humano ainda vence o agente

É nesse ponto que acho que Devin ainda precisa melhorar:

Ponto de dor

Exemplo

Polimento de recursos entre camadas

O editor do Sandpack foi codificado para testes de stub; não entendeu SandpackTests nome do componente.

Persistência de configuração

Retornou ao SQLite por padrão 5 vezes, mesmo depois de explicitar "Must stay on Postgres".

Nomeação / limpeza

Os títulos de RP são modificados, os arquivos obsoletos permanecem, a menos que você diga ao Devin para excluí-los.

Gosto e UX

O painel parecia aceitável, mas o espaçamento, o texto e as cores ainda precisavam ser ajustados.

Minha opinião

Os próprios documentos do Devin nunca prometeram um construtor de produtos. Eles delineiam um ponto ideal muito mais estreito e, em retrospecto, eu deveria ter ficado dentro dele. A página oficial "página "Quais são os pontos fortes de Devin? lista quatro usos de títulos:

pontos fortes de Devin

Os documentos chamam de "experimental" o desenvolvimento de recursos que abrangem a interface do usuário, a API e os fluxos de dados. Elas são descritas como tarefas grandes e abertas em que o agente pode "exigir revisão e iteração humanas significativas". Isso é exatamente o que vimos quando o Sandpack codificou testes ou quando o painel parecia bom, mas não computava os dados de fato.

Portanto, como regra geral:

Use o Devin para qualquer coisa que um desenvolvedor sênior possa automatizar com um script e mantenha o volante para as tarefas que precisam de um senso de produto.

Conclusão

Chegamos ao final de nosso tutorial em quatro partes:

  1. Configuração e primeira solicitação pull (parte 1)
  2. Enviando uma fatia vertical com Devin (Parte 2) 
  3. Integrações, testes e CI/CD (Parte 3) 
  4. Segurança, implementação e manutenção (Parte 4)

Aqui estão algumas das próximas etapas que você pode seguir:

  1. Hospede a API para que as compilações de visualização (e os futuros usuários) tenham um back-end real.
  2. Certifique-se de que a funcionalidade principal funcione e corrija os 30 bugs que sei que estão lá
  3. Aperfeiçoe a interface do usuário
  4. Adicionar mais conteúdo e exercícios
  5. Liberar para as pessoas usarem!

Se você seguir o mesmo caminho, lembre-se: você pode deixar o agente colocar o concreto, mas você ainda precisa projetar a casa. Boa codificação!

Tópicos

Crie agentes de IA com estes cursos:

Curso

Designing Agentic Systems with LangChain

3 h
4.1K
Get to grips with the foundational components of LangChain agents and build custom chat agents.
Ver detalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado

blog

Anunciando a série de codificação conjunta "Torne-se um desenvolvedor de IA

Comece a trabalhar com a IA generativa nesta nova série de código-along. Gratuito por tempo limitado.
DataCamp Team's photo

DataCamp Team

4 min

blog

Os 11 melhores assistentes de codificação de IA em 2024

Explore os melhores assistentes de codificação, incluindo ferramentas de código aberto, gratuitas e comerciais que podem aprimorar sua experiência de desenvolvimento.
Abid Ali Awan's photo

Abid Ali Awan

8 min

Tutorial

Tutorial do DeepChecks: Automatizando os testes de machine learning

Saiba como realizar a validação de dados e modelos para garantir um desempenho robusto de machine learning usando nosso guia passo a passo para automatizar testes com o DeepChecks.
Abid Ali Awan's photo

Abid Ali Awan

12 min

Tutorial

Desenvolvimento de back-end em Python: Um guia completo para iniciantes

Este guia completo ensina a você os fundamentos do desenvolvimento de back-end em Python. Aprenda conceitos básicos, estruturas e práticas recomendadas para você começar a criar aplicativos da Web.
Oluseye Jeremiah's photo

Oluseye Jeremiah

15 min

Tutorial

Introdução aos acionadores SQL: Um guia para desenvolvedores

Saiba como usar os acionadores SQL para automatizar tarefas, manter a integridade dos dados e melhorar o desempenho do banco de dados. Experimente exemplos práticos como os comandos CREATE, ALTER e DROP no MySQL e no Oracle.
Oluseye Jeremiah's photo

Oluseye Jeremiah

13 min

Tutorial

Tutorial da API de assistentes da OpenAI

Uma visão geral abrangente da API Assistants com nosso artigo, que oferece uma análise aprofundada de seus recursos, usos no setor, orientação de configuração e práticas recomendadas para maximizar seu potencial em vários aplicativos de negócios.
Zoumana Keita 's photo

Zoumana Keita

14 min

Ver maisVer mais