Pular para conteúdo

AUR-610 — Changelog obrigatório não reprova PR de bot

Problema

Com changelog_check.mode: required, as PRs do Dependabot que só sobem a versão de uma action reprovavam no check "Changelog obrigatório" com changelog: reprovado (entrada_ausente) e exit 1. O autor da PR nunca chegava ao binário: o workflow exportava só BASE_SHA, HEAD_SHA e POLICY_DIR, e o comando não tinha como saber que a PR era de um bot.

Desenho

O tipo do autor é dado do evento da PR. Ele entra pela borda e a decisão fica em internal/.

arquivo responsabilidade
internal/changelog/author.go Author{Login, Type}. IsBot é Type == "Bot" ou login terminado em [bot] (sufixo, nunca "contém"). Label devolve o login para o log: imprimível, sem espaço e com no máximo 64 runas.
internal/config/changelog_check.go Chave bots (off, suggest ou required; vazia vale suggest), validada como mode. EffectiveModeFor(bot): uma pessoa recebe EffectiveMode(); um bot recebe o menor entre mode e bots (off < suggest < required). bots desconhecido é recusado e, se chegar ao modo, não rebaixa nada. A política central continua decidindo a seção inteira, bots incluído.
cmd/aurumcode/cmd_changelog.go, changelog_sides.go Flags --autor e --tipo-autor. Quando bots rebaixa o modo, imprime changelog: autor é bot (<login>); changelog_check.bots: suggest — a PR não é reprovada e segue o fluxo suggest de hoje, com a entrada sugerida. Com bots: off imprime changelog: não exigido: autor é bot (<login>); changelog_check.bots: off.
internal/git/githubclient/prcommits.go PullRequestMetadata decodifica user.login e user.type.
cmd/aurumcode/pr.go, pr_changelog_suggestion.go, review_pr_inputs.go O parecer de review --pr usa EffectiveModeFor com o autor dos mesmos metadados que já buscava, sem chamada extra à API. Um bot rebaixado para suggest recebe o texto intro_suggest, e um bot com bots: off não recebe bloco. Não há texto novo no parecer.
scripts/ci/changelog-check.sh Recebe PR_AUTHOR_LOGIN e PR_AUTHOR_TYPE (opcionais) e os repassa como flags. Sem eles não passa flag nenhuma: o autor é uma pessoa (fail-closed). O binário é construído num diretório de mktemp -d.
.github/workflows/changelog.yml PR_AUTHOR_LOGIN: ${{ github.event.pull_request.user.login }} e PR_AUTHOR_TYPE: ${{ github.event.pull_request.user.type }} ficam só no env: do step, nunca dentro do run:, e chegam ao container por -e. O job continua sem if:.

ACs e testes

tests/acceptance/AUR-610.sh copia go.mod go.sum cmd internal pkg, o workflow e o script, e roda os testes de internal/changelog, internal/config, internal/git/githubclient e cmd/aurumcode.

id prova
AC-001 TestAUR610AC001BotPassesWithTheReason (exit 0, a linha explicativa é a primeira, há entrada sugerida e o resumo usa o texto de sugestão; vale com só o login, só o tipo ou login [bot] com tipo User; a política central decide sozinha). TestAUR610ReviewBodyUsesTheAuthorsMode, TestAUR610WorkflowHandsTheAuthorToTheCheck, TestAUR610ScriptPassesTheAuthorFlags, TestAUR610MetadataCarriesTheAuthor.
AC-002 TestAUR610AC002BotsOffSkipsAndRequiredRefuses (com bots: required a saída do bot é igual à de uma pessoa), TestAUR610BotsNeverRaiseTheMode, TestAUR610UnknownBotsRefused.
AC-003 TestAUR610AC003HumanOutputUnchanged: exit, stdout, stderr e resumo idênticos byte a byte com e sem flags de pessoa, em required (com e sem bots), suggest, off e sem seção. Também rodam TestAUR509AC003CheckFailsClosed e TestAUR604AC002RequiredModeUnchanged.
AC-004 TestAUR610AC004NoAuthorFlagsIsAPerson (flags ausentes ou vazias levam a reprovado (entrada_ausente)). No caso absent de TestAUR610ScriptPassesTheAuthorFlags, o script não passa flag de autor.
AC-005 TestAUR610AC005AuthorIsBot (bot-lover e x[bot]y são pessoas; renovate[bot] com tipo User é bot).

Mutações

id mutação teste que cai
MUT-001 Em author.go, strings.HasSuffix(..., botLoginSuffix) vira strings.Contains(..., "bot"). TestAUR610AC005AuthorIsBot (bot-lover)
MUT-002 Em changelog_check.go, if changelogModeRank[bots] < changelogModeRank[mode] { vira if true {: bots passa a poder elevar o modo. TestAUR610BotsNeverRaiseTheMode (suggest + bots: required vira required)

Compatibilidade

  • Para uma pessoa nada muda: as linhas impressas e as saídas gravadas dos tutoriais continuam iguais.
  • Um repositório sem bots passa a tratar PR de bot como suggest quando o mode é required. É a mudança pedida. Quem quer o comportamento antigo declara bots: required.
  • Consumidores do workflow reutilizável só ganham a correção quando repinam o uses: Mpaape/AurumCode/.github/workflows/changelog.yml@<sha> num SHA que tenha este card. Uma ferramenta pinada antiga não recebe o autor e continua reprovando a PR de bot.
  • Um binário novo chamado por um workflow antigo (sem PR_AUTHOR_*) trata o autor como pessoa (fail-closed).