Skip to main content

Correção automática de builds de CI com falha

Adicione uma GitHub Action que chama o Devin para corrigir falhas de CI nos seus PRs.
AuthorCognition
CategoryAutomação
FeaturesAPI
1

Armazene sua chave de API do Devin no GitHub

O fluxo de trabalho chama a API v3 do Devin para criar sessões programaticamente. Crie um usuário de serviço e armazene seu token como um segredo no GitHub Actions:
  1. Vá para app.devin.ai > Settings > Service Users e crie um usuário de serviço com a permissão ManageOrgSessions
  2. Copie o token de API exibido após a criação — ele só é mostrado uma vez
  3. No seu repositório do GitHub, navegue até Settings > Secrets and variables > Actions
  4. Adicione dois segredos: DEVIN_API_KEY (o token) e DEVIN_ORG_ID (o ID da sua organização — obtenha-o chamando GET https://api.devin.ai/v3/enterprise/organizations com o seu token)
Certifique-se de que o repositório já está configurado na Máquina do Devin para que o Devin possa cloná-lo, compilá-lo e fazer push para ele.
2

Adicione o arquivo de workflow

Crie .github/workflows/devin-ci-fix.yml. Esse workflow é disparado sempre que seu workflow de CI existente termina em falha, extrai os nomes dos jobs que falharam e chama a Devin API para iniciar uma sessão de correção:
name: Auto-fix CI with Devin

on:
  workflow_run:
    workflows: ["CI"]
    types: [completed]

jobs:
  trigger-devin-fix:
    if: >
      github.event.workflow_run.conclusion == 'failure' &&
      github.event.workflow_run.pull_requests[0]
    runs-on: ubuntu-latest
    steps:
      - name: Get failure details
        id: failure
        uses: actions/github-script@v7
        with:
          script: |
            const run = context.payload.workflow_run;
            const pr = run.pull_requests[0];
            const jobs = await github.rest.actions.listJobsForWorkflowRun({
              owner: context.repo.owner,
              repo: context.repo.repo,
              run_id: run.id
            });
            const failed = jobs.data.jobs
              .filter(j => j.conclusion === 'failure')
              .map(j => j.name);
            core.setOutput('pr_number', pr.number);
            core.setOutput('branch', pr.head.ref);
            core.setOutput('failed_jobs', failed.join(', '));
            core.setOutput('run_url', run.html_url);

      - name: Trigger Devin session
        run: |
          curl -s -X POST "https://api.devin.ai/v3/organizations/${{ secrets.DEVIN_ORG_ID }}/sessions" \
            -H "Authorization: Bearer ${{ secrets.DEVIN_API_KEY }}" \
            -H "Content-Type: application/json" \
            -d "{
              \"prompt\": \"CI failed on PR #${{ steps.failure.outputs.pr_number }} in ${{ github.repository }}. Failed jobs: ${{ steps.failure.outputs.failed_jobs }}. Run: ${{ steps.failure.outputs.run_url }}. Branch: ${{ steps.failure.outputs.branch }}. Read the CI logs, identify the root cause, and push a fix to the branch.\"
            }"
Substitua "CI" no array workflows pelo name: exato do seu arquivo de workflow de CI existente (por exemplo, "Tests", "Build & Test").Use o campo tags no corpo da requisição (por exemplo, "tags": ["ci-fix", "pr-312"]) para rastrear quais falhas de CI já acionaram sessões e evitar duplicações.
3

O que acontece quando o CI falha

Quando a execução de CI de um PR falha, a Action extrai os detalhes da falha e os passa para o Devin como um prompt de sessão. Veja um fluxo típico de correção automática:
  1. Lê os logs de CI — Devin abre a URL da execução e analisa a saída de erro, stack traces e resultados de testes dos jobs com falha
  2. Rastreia o erro até o código — Localiza o arquivo e a linha relevantes no branch do PR (por exemplo, UserList.tsx:34) e lê o código ao redor e o diff recente
  3. Envia uma correção — Faz um commit com uma alteração pontual diretamente no branch do PR, o que aciona novamente o CI automaticamente
  4. Comenta no PR — Publica um resumo explicando a causa raiz e o que foi alterado
Exemplo de comentário de PR do Devin:
CI failure in test-unit — fixed

Root cause: `UserList.tsx:34` calls `.map()` on `props.users`, which is
undefined when the API returns an empty response body instead of `[]`.

Fix: Added a fallback — `const users = props.users ?? [];`
Added a test case for the empty-response scenario.
All 312 tests passing.
4

Direcione para as falhas certas

Nem toda falha em CI se beneficia de uma correção automática — timeouts de infraestrutura e problemas de build do Docker não serão resolvidos por uma alteração de código. Adicione uma condição para que apenas falhas de jobs relevantes acionem o Devin:
      - name: Trigger Devin session
        if: >
          contains(steps.failure.outputs.failed_jobs, 'test') ||
          contains(steps.failure.outputs.failed_jobs, 'lint') ||
          contains(steps.failure.outputs.failed_jobs, 'typecheck')
        run: |
          curl -s -X POST "https://api.devin.ai/v3/organizations/${{ secrets.DEVIN_ORG_ID }}/sessions" \
          ...

Mantenha as correções revisáveis

Devin faz push de um commit de correção, mas o PR ainda requer revisão humana antes de ser mesclado. Trate correções automáticas como um ponto de partida para o desenvolvedor, não como um substituto para a revisão de código. Se Devin não conseguir resolver a falha, ele comenta no PR explicando o que encontrou, para que um engenheiro possa continuar a partir daí.