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
botspassa a tratar PR de bot comosuggestquando omodeérequired. É a mudança pedida. Quem quer o comportamento antigo declarabots: 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).