Pular para conteúdo

AUR-611 — Versão da ferramenta no parecer, na auditoria e no SARIF

Problema

O Dockerfile compilava o binário sem -X main.version e o CI construía a imagem sem --build-arg. Todo SARIF real saía com tool.driver.version: "dev", e nem o parecer nem a auditoria diziam qual AurumCode decidiu.

Desenho

arquivo responsabilidade
Dockerfile ARG AURUMCODE_VERSION=dev e -X main.version=${AURUMCODE_VERSION} no go build. O padrão dev mantém tutoriais e builds locais como estavam.
internal/version/version.go Info (New, IsDev, Label): valor carimbado no build; vazio ou dev é dev, e Label nunca devolve versão vazia.
cmd/aurumcode/tool_version.go toolVersion() lê main.version por internal/version; toolVersionLine monta a linha do parecer, vazia para dev; joinDetails a acrescenta depois das seções.
cmd/aurumcode/pr_summary_format.go, review_copy.go, internal/i18n/catalog.yml detailsSections termina com a linha review.tool_version ("Revisado com AurumCode %s" / "Reviewed with AurumCode %s"). Sem outra seção, o bloco de detalhes passa a existir só com a versão.
internal/render/audit.go Campo tool_version (omitempty), AuditRecord.StampToolVersion (só fora de dev) e redação do campo como os demais.
cmd/aurumcode/compliance_artifacts.go, cmd_dependencies.go, main.go Auditoria carimbada; SARIF da revisão e das dependências e --version leem toolVersion().Label().
.github/workflows/review.yml (dois builds), .github/workflows/providers-smoke.yml Passo "Resolve AurumCode version" (id: tool_version, texto idêntico entre marcadores AUR-611-VERSION-BEGIN/END): tag vX.Y.Z que aponta exatamente para o SHA, via git ls-remote --tags, senão os 12 primeiros caracteres do SHA; o build recebe --build-arg AURUMCODE_VERSION="$AURUMCODE_VERSION" pelo env.
docs/releases.md De onde vem a versão mostrada no parecer, na auditoria e no SARIF.

Por que ls-remote e não git describe --tags --exact-match: o checkout da ferramenta é raso (fetch-depth: 1) e pedido por SHA. Nesse caso fetch-tags: true do actions/checkout não traz tag nenhuma (o refspec do SHA não tem destino, então o git não segue tags), e fetch-depth: 0 baixaria o histórico inteiro da ferramenta em toda revisão. ls-remote lê só a lista de tags; se falhar, a versão é o SHA curto e o job segue. Só tags vX.Y.Z são aceitas; qualquer outro nome cai no SHA curto, então o valor injetado no build nunca carrega caractere fora de [0-9a-zv.].

Provas

tests/acceptance/AUR-611.sh (cópia de go.mod go.sum cmd internal pkg):

id prova última linha
AC-001 Executa a própria linha go build do Dockerfile com AURUMCODE_VERSION=v9.9.9 (--version imprime aurumcode v9.9.9) e com o padrão do ARG (aurumcode dev); TestAUR611SARIFCarriesStampedVersion, TestAUR611VersionFlagPrintsStampedVersion, TestAUR611StampedVersionIsNotDev, TestAUR611UnstampedVersionIsDev AUR-611/AC-001/pass
AC-002 TestAUR611DetailsCarryToolVersionWhenNotDev (linha dentro de <details>, pt-BR e en, o resto do parecer igual), TestAUR611DetailsOmitToolVersionWhenDev (parecer de dev byte a byte igual ao capturado antes da mudança), TestEveryKeyExistsInEveryLocale AUR-611/AC-002/pass
AC-003 TestAUR611AuditRecordsToolVersionOnlyWhenNotDev (render: dev grava os mesmos bytes de um registro sem carimbo), TestAUR611AuditFileCarriesToolVersionOnlyWhenNotDev (o arquivo que a revisão escreve) AUR-611/AC-003/pass
AC-004 Os dois builds do review.yml e o do smoke usam --build-arg AURUMCODE_VERSION vindo de steps.tool_version; os três resolvedores são o mesmo texto; o resolvedor roda com um git falso: tag anotada e tag leve no SHA (a maior vX.Y.Z), tag em outro SHA, nomes fora de vX.Y.Z e ls-remote falhando dão o SHA curto; SHA malformado falha AUR-611/AC-004/pass
MUT-001 if info.IsDev() { vira if false { em tool_version.go: o parecer de dev ganha "AurumCode dev" AUR-611/MUT-001/rejected (TestAUR611DetailsOmitToolVersionWhenDev)

Compatibilidade

  • Build sem o argumento continua dev: parecer, auditoria e SARIF dos tutoriais ficam byte a byte iguais (nenhuma saída gravada muda).
  • Fora de dev, o parecer ganha uma linha nos detalhes e a auditoria ganha tool_version; consumidores que leem a auditoria por chave não quebram.
  • A chave de reaproveitamento do veredito (binaryIdentity) já incluía main.version: com a versão real, cada versão da ferramenta tem a sua.
  • Fora do escopo: aviso de versão mais nova e chamada à API do GitHub.