develop #57
Loading…
Reference in a new issue
No description provided.
Delete branch "develop"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Chama POST /api/runs/{id}/generate-report e navega direto pro report criado. RunDetail tambem lista os reports ja gerados a partir da run (TestRun.generated_reports), pra evitar gerar duplicado sem querer. Tipos regenerados de docs/openapi.json via openapi-typescript.ExistingAttachments (linha do step, aba Tests do ReportDetail) nunca passava urlFn nem um onDelete correto -- caia no default (api.imageUrl/ api.deleteImage, endpoint de anexo de Report/Issue), mas evidencia de step sempre fica em RunAttachment (/api/run-images). Bug pre-existente (RunDetail.tsx ja fazia certo, ver urlFn={api.runImageUrl} la), so ficou visivel agora testando reports com evidencia de step de verdade.Servico de cache do Forgejo Actions foi habilitado no servidor em 2026-09-10 (investigacao separada, com acesso SSH a VPS) -- antes disso essa mesma action falhava com "Cache action is only supported on GHES version >= 3.5 ... check with GHES admin if Actions cache service is enabled" (ver ci_speed_backlog). Cada job roda num container efemero -- nada em ~/.cache sobrevive de uma execucao pra outra sem cache explicito. Medido ao vivo sem cache (PR que dividiu os steps do frontend): pip install ~25s, npm ci ~56s (quase metade do tempo do frontend inteiro). Adiciona cache pra: - pip (backend), chave por hash de requirements-dev.txt - npm (frontend), chave por hash de package-lock.json -- cacheia ~/.npm (o diretorio de download), nao node_modules: "npm ci" continua rodando de verdade, so para de baixar da rede o que ja tem em cache - banco de vulnerabilidade do Trivy, chave por dia (reaproveita no mesmo dia, ainda pega atualizacao diaria -- uma chave "pra sempre" arriscaria perder CVE novo) Nao mexido: cache de camada de imagem Docker ("docker build") -- o job nao tem socket Docker real pra outros containers (confirmado no comentario do step do Trivy, quando tentaram rodar Trivy via "docker run"), entao nao da pra concluir com confianca se o build de imagem já reaproveita cache do host ou roda com daemon isolado por job sem investigar mais a fundo; fora do escopo desta mudanca, que foca nos dois custos ja medidos (pip/npm) mais o Trivy DB (mesmo problema estrutural: diretorio de cache dentro do container efemero). restore-keys em todos os três garante cache parcial (versão anterior) em vez de cache miss total quando a chave exata muda. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>Auditoria previa (mesma disciplina do item 6) confirmou zero codigo/docs pro protocolo de orquestracao -- so achou um design DIFERENTE e ja documentado (ADR-0012, TestCheck: o Cockpit chama HTTP pra fora sob agendamento/clique). Decisao do usuario via AskUserQuestion: os dois coexistem (resolvem problemas diferentes -- TestCheck e checagem leve de endpoint HTTP, este item e orquestracao de suites reais tipo pytest/Playwright/Cypress que precisam de um ambiente que o Cockpit nao tem), e o escopo desta rodada e so o lado Cockpit, validado com um runner-mock (sem construir um runner de producao de verdade). Novo modulo backend/modules/orchestration/: - Runner (nome unico + URL base) e RunnerJob (ciclo de vida QUEUED/ RUNNING/COMPLETED/FAILED -- deliberadamente separado do outcome de teste PASS/FAIL/etc, que continua vivendo em TestRunStep via o contrato de ingestao que ja existe). - client.py isola as 4 chamadas HTTP saintes (GET /health, GET /suites, POST /runs, GET /runs/{id}), mesmo padrao de ai_client.py/hubspot_client.py. - Sem polling em background/worker novo (restricao do roadmap): cada GET /api/runner-jobs/{id} e a propria checagem ao vivo contra o runner, best-effort (mantem o ultimo status conhecido se o runner estiver inalcancavel, nunca quebra a leitura). - Vinculo Job -> TestRun NUNCA e uma FK guardada -- resolvido ao vivo comparando (Runner.name, external_job_id) contra TestRun.automation_source/external_run_id, os mesmos campos que POST /api/automation/runs (item 6) ja grava. Zero acoplamento entre modules/orchestration e modules/automation -- nenhum dos dois importa o outro, confirmado por teste de integracao completo (dispara job, simula o runner publicando resultado pelo endpoint que ja existe, confere que o vinculo aparece sozinho). Frontend: tela nova Runners.tsx (master-detail, mesmo padrao de Library/AutomationDiscoveries) -- registrar runner, ver saude (online/ inalcancavel), listar suites, disparar execucao, acompanhar jobs com link direto pra Run gerada quando o resultado chega. Verificacao: backend pytest -n auto (190 passed, 14 testes novos em test_orchestration.py, incluindo o teste de integracao Job->TestRun sem acoplamento), suite de arquitetura confirma que o novo modulo respeita as mesmas fronteiras Core dos demais. Frontend tsc/lint/vitest (131 passed, 6 testes novos)/build/build-storybook -- todos ok. Testado manualmente ponta a ponta com um runner-mock de verdade (script FastAPI descartavel, fora do repo): registrar -> saude "Online" -> suites reais listadas -> disparar job -> acompanhar QUEUED->RUNNING->COMPLETED via "Atualizar" -> mock publica resultado em POST /api/automation/runs -> link "Ver Run #N" aparece sozinho -> Run real com os 2 passos (1 PASS, 1 FAIL) certinha na tela que ja existia, sem nenhuma mudanca nela. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>